From 5dc685681883a55ed02ff9a55839dd5c639087fe Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Mon, 11 Apr 2016 17:21:27 -0700 Subject: [PATCH 001/409] First version --- .gitignore | 7 ++++ .gitmodules | 3 ++ docs/_config.yml | 78 ++++++++++++++++++++++++++++++++++++++++++++ docs/package.json | 25 ++++++++++++++ docs/source/index.md | 9 +++++ themes/meteor | 1 + 6 files changed, 123 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 docs/_config.yml create mode 100644 docs/package.json create mode 100644 docs/source/index.md create mode 160000 themes/meteor diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..063b0e4ce79 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000000..e0137124160 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/meteor"] + path = themes/meteor + url = https://github.com/meteor/hexo-theme-meteor.git diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000000..b26a9212edb --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,78 @@ +# Hexo Configuration +## Docs: http://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ + +# Site +title: Apollo Docs +subtitle: Apollo Docs +description: +author: +language: +timezone: +versions: + - '1' +sidebar_categories: + null: + - index + Foo: + - index + +# URL +## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' +url: http://docs.apollostack.com/ +root: / +permalink: :year/:month/:day/:title/ +permalink_defaults: + +# Directory +source_dir: source +public_dir: public +tag_dir: tags +archive_dir: archives +category_dir: categories +code_dir: downloads/code +i18n_dir: :lang +skip_render: + +# Writing +new_post_name: :title.md # File name of new posts +default_layout: post +titlecase: false # Transform title into titlecase +external_link: true # Open external links in new tab +filename_case: 0 +render_drafts: false +post_asset_folder: false +relative_link: false +future: true +highlight: + enable: true + line_number: true + auto_detect: true + tab_replace: + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: + +# Date / Time format +## Hexo uses Moment.js to parse and display date +## You can customize the date format as defined in +## http://momentjs.com/docs/#/displaying/format/ +date_format: YYYY-MM-DD +time_format: HH:mm:ss + +# Pagination +## Set per_page to 0 to disable pagination +per_page: 10 +pagination_dir: page + +# Extensions +## Plugins: http://hexo.io/plugins/ +## Themes: http://hexo.io/themes/ +theme: meteor + +# Deployment +## Docs: http://hexo.io/docs/deployment.html +deploy: + type: diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000000..db18b27b667 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,25 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "private": true, + "hexo": { + "version": "3.2.0" + }, + "dependencies": { + "hexo": "^3.1.0", + "hexo-generator-archive": "^0.1.2", + "hexo-generator-category": "^0.1.2", + "hexo-generator-index": "^0.1.2", + "hexo-generator-tag": "^0.1.1", + "hexo-renderer-ejs": "^0.1.0", + "hexo-renderer-stylus": "^0.3.0", + "hexo-renderer-marked": "^0.2.4", + "hexo-server": "^0.1.2" + }, + "devDependencies": { + "hexo-s3-deploy": "^1.0.1" + }, + "scripts": { + "deploy": "hexo-s3-deploy" + } +} \ No newline at end of file diff --git a/docs/source/index.md b/docs/source/index.md new file mode 100644 index 00000000000..3bec48e5d8c --- /dev/null +++ b/docs/source/index.md @@ -0,0 +1,9 @@ +--- +title: Introduction +order: 0 +description: These are Apollo Docs!! +--- + +### DOCS + +docs \ No newline at end of file diff --git a/themes/meteor b/themes/meteor new file mode 160000 index 00000000000..181603989ff --- /dev/null +++ b/themes/meteor @@ -0,0 +1 @@ +Subproject commit 181603989ffec9da1ba1614cb5c59c8e690514ff From 07418579c555dc97df54e6b3e74a45c0fe02bb70 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 17:38:09 -0700 Subject: [PATCH 002/409] test --- docs/_config.yml | 4 ++-- docs/source/{ => apollo-client}/index.md | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename docs/source/{ => apollo-client}/index.md (100%) diff --git a/docs/_config.yml b/docs/_config.yml index b26a9212edb..dcf2a907f28 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -14,8 +14,8 @@ versions: sidebar_categories: null: - index - Foo: - - index + Apollo Client: + - apollo-client/index # URL ## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' diff --git a/docs/source/index.md b/docs/source/apollo-client/index.md similarity index 100% rename from docs/source/index.md rename to docs/source/apollo-client/index.md From 24192c4c8502d4f80d313be500144c610093f62f Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 18:38:10 -0700 Subject: [PATCH 003/409] Add existing content --- docs/_config.yml | 3 +- docs/source/apollo-client/customization.md | 102 ++++++++++ docs/source/apollo-client/index.md | 226 ++++++++++++++++++++- docs/source/index.md | 8 + themes/meteor | 2 +- 5 files changed, 335 insertions(+), 6 deletions(-) create mode 100644 docs/source/apollo-client/customization.md create mode 100644 docs/source/index.md diff --git a/docs/_config.yml b/docs/_config.yml index dcf2a907f28..347ada22b5c 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -4,7 +4,7 @@ # Site title: Apollo Docs -subtitle: Apollo Docs +subtitle: Documentation description: author: language: @@ -16,6 +16,7 @@ sidebar_categories: - index Apollo Client: - apollo-client/index + - apollo-client/customization # URL ## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' diff --git a/docs/source/apollo-client/customization.md b/docs/source/apollo-client/customization.md new file mode 100644 index 00000000000..24e15f5e512 --- /dev/null +++ b/docs/source/apollo-client/customization.md @@ -0,0 +1,102 @@ +--- +title: Customization +order: 102 +description: These are Apollo Docs!! +--- + +## Custom network interface + +You can define a custom network interface and pass it to the Apollo Client to send your queries in a different way. You could use this for a variety of reasons: + +1. You want a custom transport that sends queries over Websockets instead of HTTP +2. You want to modify the query or variables before they are sent +3. You want to run your app against a mocked client-side schema and never send any network requests at all + +All you need to do is create a `NetworkInterface` and pass it to the `ApolloClient` constructor. + +### NetworkInterface + +This is an interface that an object should implement so that it can be used by the Apollo Client to make queries. + +- `query(request: GraphQLRequest): Promise` This function on your network interface is pretty self-explanatory - it takes a GraphQL request object, and should return a promise for a GraphQL result. The promise should be rejected in the case of a network error. + +#### GraphQLRequest + +Represents a request passed to the network interface. Has the following properties: + +- `query: string` The query to send to the server. +- `variables: Object` The variables to send with the query. +- `debugName: string` An optional parameter that will be included in error messages about this query. XXX do we need this? + +#### GraphQLResult + +This represents a result that comes back from the GraphQL server. + +- `data: any` This is the actual data returned by the server. +- `errors: Array` This is an array of errors returned by the server. + +## Redux integration + +By default, the Apollo Client creates its own internal Redux store to manage queries and their results. If you are already using Redux for the rest of your app, you can have the client integrate with your existing store instead. This will let you better track the different events that happen in your app, and how your client and server side data changes interleave. + +### Creating the store + +To integrate with your existing Redux store: + +1. Use Redux's `combineReducers`([docs](http://redux.js.org/docs/api/combineReducers.html)) function to combine Apollo's reducer with your own. apollo-client uses the `apollo` redux key by default +2. Pass the result to Redux's `createStore`([docs](http://redux.js.org/docs/api/createStore.html)) +3. Pass the store when instantiating `ApolloClient` + +```js +import { createStore, combineReducers } from 'redux'; +import { ApolloClient, apolloReducer } from 'apollo-client'; +import { todoReducer, userReducer } from './reducers'; + +const store = createStore( + combineReducers({ + todos: todoReducer, + users: userReducer, + apollo: apolloReducer, + }) +}); + +const client = new ApolloClient({ store }); + +client.store.getState(); +// sample state +// { +// todos: {}, +// users: {}, +// apollo: {}, +// } +``` + +### Custom store key + +To use a key other than the default (`apollo`): + +1. Specify it in your combined reducer +2. Use the `reduxRootKey` parameter when creating `ApolloClient` + +```js +const store = createStore( + combineReducers({ + todos: todoReducer, + users: userReducer, + myDifferentKey: apolloReducer, + }) +}); + +const client = new ApolloClient({ + store, + reduxRootKey: 'myDifferentKey', +}); + +client.store.getState(); +// sample state +// { +// todos: {}, +// users: {}, +// myDifferentKey: {}, +// } +``` diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 3bec48e5d8c..55f2fd221c7 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -1,9 +1,227 @@ --- -title: Introduction -order: 0 +title: Client API +order: 101 description: These are Apollo Docs!! --- -### DOCS +The Apollo Client can easily be dropped into any JavaScript frontend where you want to use data from a GraphQL server. -docs \ No newline at end of file +## Installing from npm + +```txt +npm install apollo-client +``` + +To use this client in a web browser or mobile app, you'll need a build system capable of loading NPM packages on the client. Some common choices include Browserify, Webpack, and Meteor 1.3. Move on to the next article to see how to import and initialize the client. + +## Client + +The Apollo Client class is the thing you import from this package, and should be instantiated to communicate with your server. You can instantiate as many clients as you want, but most apps will have exactly one of these. If you want to talk to multiple backends, the right place to do that is in your GraphQL server. + +

new ApolloClient(options)

+ +Instantiate a new Apollo Client. + +- `networkInterface: NetworkInterface` (Optional, defaults to an interface that points to `/graphql`) The network interface to use when sending GraphQL queries to the server. +- `XXX redux integration` (Optional, creates a new Redux store by default) A Redux store to in which to keep all state. + +Here's how you would instantiate a default client that points to `/graphql`: + +```js +import ApolloClient from 'apollo-client'; + +const client = new ApolloClient(); +``` + +

createNetworkInterface(url, options)

+ +Create a new HTTP network interface that points to a GraphQL server at a specific URI. + +- `url: string` The URL of the remote server, for example `https://example.com/graphql`. +- `options: FetchOptions` (Optional) Options that are passed through to `fetch` XXX link to docs + +Here's how you would instantiate a new client with a custom endpoint URL: + +```js +import ApolloClient from 'apollo-client'; + +const networkInterface = createNetworkInterface('https://example.com/graphql'); + +const client = new ApolloClient({ + networkInterface, +}); +``` + +

Queries

+ +The primary function of the Apollo Client is running GraphQL queries to retrieve data from the server. There are two ways to get data: running a query once and getting a single result, and running a query then watching the result via a callback. + +

`query` vs. `watchQuery`

+ +If you want to fetch some data to perform a one-time operation, then `query` is the right way to go. If you are using the query result to render some UI, it's advantageous to use `watchQuery`, since that will automatically update whenever any of the following things happen: + +1. A different query or mutation updates the data in the store +2. A mutation performs an optimistic update +3. Data is re-fetched because of a reactive update + +This means that using `watchQuery` will keep your UI consistent, so that every query being displayed on the screen shows the exact same data for the same objects. + +In the future, `watchQuery` will also have some extra options for reactivity, allowing you to set a polling interval, connect to a source of invalidations for reactive re-fetching, or accept pushed data from the server for low-latency updates. Using it now will allow you to easily switch those options on when they become available. + +

ApolloClient#query(options)

+ +Run a GraphQL query and return a promise that resolves to a `GraphQLResult`. + +- `query: string` A GraphQL query string to fetch. +- `variables: Object` The variables to pass along with the query. +- `forceFetch: boolean` (Optional, default is `true`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. + +Here's how you would run a single query and get the result: + +```js +import ApolloClient from 'apollo-client'; + +const client = new ApolloClient(); + +client.query({ + query: ` + query getCategory($categoryId: Int!) { + category(id: $categoryId) { + name + color + } + } + `, + variables: { + categoryId: 5, + }, + forceFetch: false, +}).then((graphQLResult) => { + const { errors, data } = graphQLResult; + + if (data) { + console.log('got data', data); + } + + if (errors) { + console.log('got some GraphQL execution errors', errors); + } +}).catch((error) => { + console.log('there was an error sending the query', error); +}); +``` + +

ApolloClient#watchQuery(options)

+ +Run a GraphQL query and return a `WatchedQueryHandle` that is updated as the query result in the store changes. + +- `query: string` A GraphQL query string to fetch. +- `variables: Object` The variables to pass along with the query. +- `forceFetch: boolean` (Optional, default is `true`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. +- `returnPartialData: boolean` (Optional, default is `false`) If false, wait until the query has finished the initial load from the server to return any data. If true, return any data we might happen to already have in the store immediately. If you pass true for this option, your UI should be ready to deal with the possibility that it will get a partial result at first. + +

WatchedQueryHandle

+ +This is the object you get when you call `watchQuery`. It has some helpful properties and functions you can use to read data from your query and manipulate it: + +- `onResult(callback)` Register a callback to be called whenever this query has new data. +- `stop()` Tell the client we are no longer interested in results for this query, and that it can be cleaned up. Any callbacks previously registered with `onResult` will no longer be called. Note that if you don't call this function when you're done with the query, it will never be cleaned up, which could result in a memory leak. Any view layer integration should make sure to call this when UI components that asked for data are unrendered. +- `isStopped(): boolean` Find out if this query has been stopped. +- XXX onError, isLoading, getResult, getError should be added + +Here's how you could run a query and then watch the result: + +```js +const handle = client.watchQuery({ + query: ` + query getCategory($categoryId: Int!) { + category(id: $categoryId) { + name + color + } + } + `, + variables: { + categoryId: 5, + }, + forceFetch: false, + returnPartialData: true, +}); + +handle.onResult((graphQLResult) => { + const { errors, data } = graphQLResult; + + if (data) { + console.log('got data', data); + } + + if (errors) { + console.log('got some GraphQL execution errors', errors); + } +}); + +// XXX onError + +// Call when we're done watching this query +handle.stop(); +``` + +## Mutations + +In addition to fetching data using queries, the Apollo Client also handles GraphQL mutations. Current support for mutations is relatively basic, just letting you send a mutation and then incorporate the result into the store. + +

ApolloClient#mutate(options)

+ +Send a mutation to the server and get the result. The result is also incorporated into the store, updating any queries registered with `watchQuery` that are interested in the changed objects. Returns a promise that resolves to a GraphQLResult. + +- `mutation: string` The mutation to send to the server. +- `variables: Object` The variables to send along with the mutation. + +Here's how you would call a mutation and pass in arguments via variables: + +```js +import ApolloClient from 'apollo-client'; + +const client = new ApolloClient(); + +client.mutate({ + mutation: ` + mutation postReply( + $token: String! + $topic_id: ID! + $category_id: ID! + $raw: String! + ) { + createPost( + token: $token + topic_id: $topic_id + category: $category_id + raw: $raw + ) { + id + cooked + } + } + `, + variables: { + token: 'asdf', + topic_id: '123', + category_id: '456', + raw: 'This is the post text.', + } +}).then((graphQLResult) => { + const { errors, data } = graphQLResult; + + if (data) { + console.log('got data', data); + } + + if (errors) { + console.log('got some GraphQL execution errors', errors); + } +}).catch((error) => { + console.log('there was an error sending the query', error); +}); +``` + +Right now, this is a bit verbose because you have to list the names of the variables three times, but we hope to improve this in the future. diff --git a/docs/source/index.md b/docs/source/index.md new file mode 100644 index 00000000000..8c96fd04774 --- /dev/null +++ b/docs/source/index.md @@ -0,0 +1,8 @@ +--- +title: The Apollo Data Stack +order: 0 +description: These are Apollo Docs!! +--- + + +Hi diff --git a/themes/meteor b/themes/meteor index 181603989ff..d26194185db 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit 181603989ffec9da1ba1614cb5c59c8e690514ff +Subproject commit d26194185dbbe2bc59ed4a2e4ed36bf35c88a00c From 4d68b9ce5576d6a8dbbc3a22557a5cc1e95bdd85 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 18:45:15 -0700 Subject: [PATCH 004/409] Add to ToC --- docs/source/apollo-client/customization.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/customization.md b/docs/source/apollo-client/customization.md index 24e15f5e512..9faa6a50d72 100644 --- a/docs/source/apollo-client/customization.md +++ b/docs/source/apollo-client/customization.md @@ -20,7 +20,7 @@ This is an interface that an object should implement so that it can be used by t - `query(request: GraphQLRequest): Promise` This function on your network interface is pretty self-explanatory - it takes a GraphQL request object, and should return a promise for a GraphQL result. The promise should be rejected in the case of a network error. -#### GraphQLRequest +### GraphQLRequest Represents a request passed to the network interface. Has the following properties: @@ -28,7 +28,7 @@ Represents a request passed to the network interface. Has the following properti - `variables: Object` The variables to send with the query. - `debugName: string` An optional parameter that will be included in error messages about this query. XXX do we need this? -#### GraphQLResult +### GraphQLResult This represents a result that comes back from the GraphQL server. From c78557a7b6950598a3f26805e03fb81f1a03634d Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 18:45:54 -0700 Subject: [PATCH 005/409] Create README.md --- docs/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000000..d4fb7450302 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,10 @@ +# docs + +To run: + +``` +git submodule init +git submodule update +npm install +hexo serve +``` From 1bb80cfd3205e27d3b90048a9d7221187f416d45 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 18:54:32 -0700 Subject: [PATCH 006/409] Commit to a title --- docs/source/apollo-client/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 55f2fd221c7..56ae62b18c3 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -1,12 +1,12 @@ --- -title: Client API +title: Introduction order: 101 description: These are Apollo Docs!! --- The Apollo Client can easily be dropped into any JavaScript frontend where you want to use data from a GraphQL server. -## Installing from npm +## Installing ```txt npm install apollo-client From ac16cf15c483c58d82224e519e80e85f19937c7a Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 19:19:31 -0700 Subject: [PATCH 007/409] Add Apollo logo --- docs/_config.yml | 5 +++++ docs/source/logo/large.png | Bin 0 -> 16017 bytes docs/source/logo/square.png | Bin 0 -> 12871 bytes themes/meteor | 2 +- 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 docs/source/logo/large.png create mode 100644 docs/source/logo/square.png diff --git a/docs/_config.yml b/docs/_config.yml index 347ada22b5c..a742c657bd0 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -17,6 +17,11 @@ sidebar_categories: Apollo Client: - apollo-client/index - apollo-client/customization +github_repo: apollostack/docs +content_root: source +logo: + desktop: /logo/large.png + mobile: /logo/square.png # URL ## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' diff --git a/docs/source/logo/large.png b/docs/source/logo/large.png new file mode 100644 index 0000000000000000000000000000000000000000..8d22bc2c3e852f3e989e5f6b369bef09572aaa78 GIT binary patch literal 16017 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 x0sn)1Pmn$NHEI}}=6i%W6n-{-mad*A23 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 literal 0 HcmV?d00001 diff --git a/themes/meteor b/themes/meteor index d26194185db..59243f481a4 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit d26194185dbbe2bc59ed4a2e4ed36bf35c88a00c +Subproject commit 59243f481a4a9500115f36ddc67c00ec39624a6e From b5039e93289a73d357a1c69282864b5151fab91d Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 19:25:17 -0700 Subject: [PATCH 008/409] Add nav links --- docs/_config.yml | 4 ++++ themes/meteor | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index a742c657bd0..dbcbfa8192f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -22,6 +22,10 @@ content_root: source logo: desktop: /logo/large.png mobile: /logo/square.png +nav_links: + apollostack.com: http://www.apollostack.com/ + Blog: https://medium.com/apollo-stack + GitHub: https://github.com/apollostack # URL ## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' diff --git a/themes/meteor b/themes/meteor index 59243f481a4..f31c232ca45 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit 59243f481a4a9500115f36ddc67c00ec39624a6e +Subproject commit f31c232ca45ee43a1cdc8809776bc35d656bcb58 From c4f426f3e2d8ec016e820903837f38234f81b0b1 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 19:33:16 -0700 Subject: [PATCH 009/409] Improve docs --- docs/source/apollo-client/customization.md | 20 +++++++++++--------- docs/source/apollo-client/index.md | 3 ++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/source/apollo-client/customization.md b/docs/source/apollo-client/customization.md index 9faa6a50d72..bd5ca0adb9a 100644 --- a/docs/source/apollo-client/customization.md +++ b/docs/source/apollo-client/customization.md @@ -35,7 +35,7 @@ This represents a result that comes back from the GraphQL server. - `data: any` This is the actual data returned by the server. - `errors: Array` This is an array of errors returned by the server. -## Redux integration +

Redux integration

By default, the Apollo Client creates its own internal Redux store to manage queries and their results. If you are already using Redux for the rest of your app, you can have the client integrate with your existing store instead. This will let you better track the different events that happen in your app, and how your client and server side data changes interleave. @@ -43,9 +43,9 @@ By default, the Apollo Client creates its own internal Redux store to manage que To integrate with your existing Redux store: -1. Use Redux's `combineReducers`([docs](http://redux.js.org/docs/api/combineReducers.html)) function to combine Apollo's reducer with your own. apollo-client uses the `apollo` redux key by default -2. Pass the result to Redux's `createStore`([docs](http://redux.js.org/docs/api/createStore.html)) -3. Pass the store when instantiating `ApolloClient` +1. Use [`combineReducers` from Redux](http://redux.js.org/docs/api/combineReducers.html) to combine Apollo's reducer with your own. `apollo-client` uses the `apollo` redux key by default. +2. Pass the result to [Redux's `createStore`](http://redux.js.org/docs/api/createStore.html). +3. Pass the store into the `ApolloClient` constructor. ```js import { createStore, combineReducers } from 'redux'; @@ -63,7 +63,8 @@ const store = createStore( const client = new ApolloClient({ store }); client.store.getState(); -// sample state + +// Example initial state: // { // todos: {}, // users: {}, @@ -73,10 +74,10 @@ client.store.getState(); ### Custom store key -To use a key other than the default (`apollo`): +By default, the `ApolloClient` instance will assume that Apollo-related data lives under the `apollo` key in the store. To change the name of this key: -1. Specify it in your combined reducer -2. Use the `reduxRootKey` parameter when creating `ApolloClient` +1. Specify the desired key when adding `apolloReducer`. +2. Pass the `reduxRootKey` parameter to the `ApolloClient` constructor. ```js const store = createStore( @@ -93,7 +94,8 @@ const client = new ApolloClient({ }); client.store.getState(); -// sample state + +// Example initial state: // { // todos: {}, // users: {}, diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 56ae62b18c3..5abae64bec2 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -23,7 +23,8 @@ The Apollo Client class is the thing you import from this package, and should be Instantiate a new Apollo Client. - `networkInterface: NetworkInterface` (Optional, defaults to an interface that points to `/graphql`) The network interface to use when sending GraphQL queries to the server. -- `XXX redux integration` (Optional, creates a new Redux store by default) A Redux store to in which to keep all state. +- `store: ReduxStore` (Optional, creates a new Redux store by default) A Redux store to in which to keep all state. [Read more about integrating with Redux](customization.html#redux). +- `reduxRootKey: string` (Optional, `apollo` by default) The key under which Apollo data will be stored in the Redux store. If you aren't integrating with an existing Redux store, don't worry about this. Here's how you would instantiate a default client that points to `/graphql`: From 5dbcc5adf24bbe7b663c0437d19c8986e6f30301 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 19:49:09 -0700 Subject: [PATCH 010/409] Add travis yml --- .travis.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000..c528dfbccd7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +language: node_js +node_js: + - "5" +install: + - git submodule update --init + - npm install + +script: + - npm run deploy + +# Allow Travis tests to run in containers. +sudo: false From d547a2cb8236ba4dcd799b5c8e735f77bcce4540 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 20:04:49 -0700 Subject: [PATCH 011/409] Add circle yml --- .travis.yml | 12 ------------ docs/circle.yml | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 12 deletions(-) delete mode 100644 .travis.yml create mode 100644 docs/circle.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c528dfbccd7..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - "5" -install: - - git submodule update --init - - npm install - -script: - - npm run deploy - -# Allow Travis tests to run in containers. -sudo: false diff --git a/docs/circle.yml b/docs/circle.yml new file mode 100644 index 00000000000..91257fd428d --- /dev/null +++ b/docs/circle.yml @@ -0,0 +1,27 @@ +machine: + node: + version: 0.12 + +checkout: + post: + - git submodule update --init + +dependencies: + cache_directories: + - "site/node_modules" + override: + - npm install -g hexo-cli + - npm install: + pwd: site + +test: + override: + # maybe we will need tests in the future + - echo 'ok!' + +deployment: + s3: + branch: /^(master|version-.*)/ + commands: + - npm run deploy: + pwd: site From 385de7aa7cb60cbe7dce6811282cf322566bf701 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 20:07:53 -0700 Subject: [PATCH 012/409] We don't have a site dir --- docs/circle.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/circle.yml b/docs/circle.yml index 91257fd428d..d0e756bc0df 100644 --- a/docs/circle.yml +++ b/docs/circle.yml @@ -11,8 +11,7 @@ dependencies: - "site/node_modules" override: - npm install -g hexo-cli - - npm install: - pwd: site + - npm install test: override: @@ -23,5 +22,4 @@ deployment: s3: branch: /^(master|version-.*)/ commands: - - npm run deploy: - pwd: site + - npm run deploy From af4ddd2d232fddf10acdb811cb651925d1f1fb35 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 20:10:23 -0700 Subject: [PATCH 013/409] Test out continuous deploy --- docs/source/index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/source/index.md b/docs/source/index.md index 8c96fd04774..d987fb63631 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -1,8 +1,7 @@ --- title: The Apollo Data Stack order: 0 -description: These are Apollo Docs!! +description: Introduction to the Apollo Data Stack. --- - -Hi +Hello world! From 6d61608222e333e2208a805e3b7163d0480bea00 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Apr 2016 23:24:43 -0700 Subject: [PATCH 014/409] Set up analytics --- docs/_config.yml | 5 +++++ themes/meteor | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index dbcbfa8192f..7c2ed3f70df 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -27,6 +27,11 @@ nav_links: Blog: https://medium.com/apollo-stack GitHub: https://github.com/apollostack +# API keys +apis: + ga: UA-74643563-2 + marketo: 627-RVJ-941 + # URL ## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' url: http://docs.apollostack.com/ diff --git a/themes/meteor b/themes/meteor index f31c232ca45..f6333f5c251 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit f31c232ca45ee43a1cdc8809776bc35d656bcb58 +Subproject commit f6333f5c251f1acf3929fac7ee3da791d15077be From d2c757792733b887d18e32d7d7378da2e8f1a03a Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 12 Apr 2016 13:50:10 -0700 Subject: [PATCH 015/409] use 'npm start' instead of 'hexo serve' to avoid global install of hexo --- docs/README.md | 2 +- docs/package.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index d4fb7450302..c9c8196897a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,5 +6,5 @@ To run: git submodule init git submodule update npm install -hexo serve +npm start ``` diff --git a/docs/package.json b/docs/package.json index db18b27b667..ffc44e4f6c5 100644 --- a/docs/package.json +++ b/docs/package.json @@ -20,6 +20,7 @@ "hexo-s3-deploy": "^1.0.1" }, "scripts": { + "start": "hexo serve", "deploy": "hexo-s3-deploy" } -} \ No newline at end of file +} From 3fda5a1ead2df72001c0aa68ea659290ccff42ab Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 12 Apr 2016 14:41:47 -0700 Subject: [PATCH 016/409] outline of apollo-server guide --- docs/_config.yml | 2 + docs/source/apollo-server/index.md | 62 ++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 docs/source/apollo-server/index.md diff --git a/docs/_config.yml b/docs/_config.yml index 7c2ed3f70df..90a8141d17e 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -17,6 +17,8 @@ sidebar_categories: Apollo Client: - apollo-client/index - apollo-client/customization + Apollo Server Tools: + - apollo-server/index github_repo: apollostack/docs content_root: source logo: diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md new file mode 100644 index 00000000000..7bf646d6579 --- /dev/null +++ b/docs/source/apollo-server/index.md @@ -0,0 +1,62 @@ +--- +title: Basics +order: 201 +description: These are Apollo Docs!! +--- + +Apollo GraphQL Tools are a collection of functions and an opinionated guide for building GraphQL servers in JavaScript. + +## Installing + +```txt +npm install graphql-tools +``` +The Apollo GraphQL tools are made for building servers, but they can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. Information on how to use individual tools with GraphQL-JS can be found in the Tools section of this guide. + +## The GraphQL server guide + +This section is the official guide for building a GraphQL server the Apollo way. It describes each step in detail from defining a schema to writing your own resolve functions and loaders. + +### Setup + +### Schema + +### Mocking + +### Resolve Funcitions + +### HTTP + +### Data Loaders + +## Tools + +### Schema creation + +* createSchema + +### Resolve functions + +* addResolversToSchema +* addSchemaLevelResolver + +### Mocking + +* mockServer +* addMocksToSchema + +### Logging and performance profiling + +* Logger +* addProfilingToSchema + +### Data Loaders + +* attachLoadersToContext + +### Error handling + +* forbidUndefinedResolve + + + From 2ea6856f880da31350bc0371642f4ec2610f41a0 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 12 Apr 2016 15:05:24 -0700 Subject: [PATCH 017/409] split guide and tools into two files --- docs/_config.yml | 4 ++- docs/source/apollo-server/guide.md | 20 ++++++++++++ docs/source/apollo-server/index.md | 51 +----------------------------- docs/source/apollo-server/tools.md | 35 ++++++++++++++++++++ 4 files changed, 59 insertions(+), 51 deletions(-) create mode 100644 docs/source/apollo-server/guide.md create mode 100644 docs/source/apollo-server/tools.md diff --git a/docs/_config.yml b/docs/_config.yml index 90a8141d17e..0d2c1283179 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -17,8 +17,10 @@ sidebar_categories: Apollo Client: - apollo-client/index - apollo-client/customization - Apollo Server Tools: + Apollo Server: - apollo-server/index + - apollo-server/guide + - apollo-server/tools github_repo: apollostack/docs content_root: source logo: diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md new file mode 100644 index 00000000000..19a9e83daa3 --- /dev/null +++ b/docs/source/apollo-server/guide.md @@ -0,0 +1,20 @@ +--- +title: GraphQL server guide +order: 202 +description: These are Apollo Docs!! +--- + +This section is the official guide for building a GraphQL server the Apollo way. It describes each step in detail from defining a schema to writing your own resolve functions and loaders. + +## Setup + +## Schema + +## Mocking + +## Resolve Funcitions + +## HTTP + +## Data Loaders + diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md index 7bf646d6579..204656a45c8 100644 --- a/docs/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -1,62 +1,13 @@ --- -title: Basics +title: Overview order: 201 description: These are Apollo Docs!! --- Apollo GraphQL Tools are a collection of functions and an opinionated guide for building GraphQL servers in JavaScript. -## Installing ```txt npm install graphql-tools ``` The Apollo GraphQL tools are made for building servers, but they can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. Information on how to use individual tools with GraphQL-JS can be found in the Tools section of this guide. - -## The GraphQL server guide - -This section is the official guide for building a GraphQL server the Apollo way. It describes each step in detail from defining a schema to writing your own resolve functions and loaders. - -### Setup - -### Schema - -### Mocking - -### Resolve Funcitions - -### HTTP - -### Data Loaders - -## Tools - -### Schema creation - -* createSchema - -### Resolve functions - -* addResolversToSchema -* addSchemaLevelResolver - -### Mocking - -* mockServer -* addMocksToSchema - -### Logging and performance profiling - -* Logger -* addProfilingToSchema - -### Data Loaders - -* attachLoadersToContext - -### Error handling - -* forbidUndefinedResolve - - - diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md new file mode 100644 index 00000000000..3918e968caf --- /dev/null +++ b/docs/source/apollo-server/tools.md @@ -0,0 +1,35 @@ +--- +title: Tools +order: 203 +description: These are Apollo Docs!! +--- + +## Schema creation + +* createSchema + +## Resolve functions + +* addResolversToSchema +* addSchemaLevelResolver + +## Mocking + +* mockServer +* addMocksToSchema + +## Logging and performance profiling + +* Logger +* addProfilingToSchema + +## Data Loaders + +* attachLoadersToContext + +## Error handling + +* forbidUndefinedResolve + + + From e8a9ba1f1c5c6418f0f7b308c5b4e9c205d98f28 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 12 Apr 2016 19:31:30 -0700 Subject: [PATCH 018/409] Update redux integration docs --- docs/source/apollo-client/customization.md | 45 ++++++++++++---------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/docs/source/apollo-client/customization.md b/docs/source/apollo-client/customization.md index bd5ca0adb9a..d3b580af684 100644 --- a/docs/source/apollo-client/customization.md +++ b/docs/source/apollo-client/customization.md @@ -43,26 +43,29 @@ By default, the Apollo Client creates its own internal Redux store to manage que To integrate with your existing Redux store: -1. Use [`combineReducers` from Redux](http://redux.js.org/docs/api/combineReducers.html) to combine Apollo's reducer with your own. `apollo-client` uses the `apollo` redux key by default. -2. Pass the result to [Redux's `createStore`](http://redux.js.org/docs/api/createStore.html). -3. Pass the store into the `ApolloClient` constructor. +1. Create an `ApolloClient` instance. +1. Use [`combineReducers` from Redux](http://redux.js.org/docs/api/combineReducers.html) to combine `client.reducer()` with your other reducers. By default, the reducer expects to be attached under the `apollo` key in the store. +3. Pass your reducers to [Redux's `createStore`](http://redux.js.org/docs/api/createStore.html), and make sure to use `applyMiddleware` to add `client.middleware()` to your store. + +Here's what it looks like all together: ```js -import { createStore, combineReducers } from 'redux'; -import { ApolloClient, apolloReducer } from 'apollo-client'; +import { createStore, combineReducers, applyMiddleware } from 'redux'; +import { ApolloClient } from 'apollo-client'; import { todoReducer, userReducer } from './reducers'; +const client = new ApolloClient(); + const store = createStore( combineReducers({ todos: todoReducer, users: userReducer, - apollo: apolloReducer, - }) -}); - -const client = new ApolloClient({ store }); + apollo: client.reducer(), + }), + applyMiddleware(client.middleware()) +); -client.store.getState(); +store.getState(); // Example initial state: // { @@ -76,24 +79,24 @@ client.store.getState(); By default, the `ApolloClient` instance will assume that Apollo-related data lives under the `apollo` key in the store. To change the name of this key: -1. Specify the desired key when adding `apolloReducer`. +1. Specify the desired key when using `combineReducers` to attach `client.reducer()`. 2. Pass the `reduxRootKey` parameter to the `ApolloClient` constructor. ```js +const client = new ApolloClient({ + reduxRootKey: 'myDifferentKey', +}); + const store = createStore( combineReducers({ todos: todoReducer, users: userReducer, - myDifferentKey: apolloReducer, - }) -}); - -const client = new ApolloClient({ - store, - reduxRootKey: 'myDifferentKey', -}); + myDifferentKey: client.reducer(), + }), + applyMiddleware(client.middleware()) +); -client.store.getState(); +store.getState(); // Example initial state: // { From 44f694288962b3a564a7925b8011321fd580e043 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 12 Apr 2016 19:32:44 -0700 Subject: [PATCH 019/409] Update constructor docs --- docs/source/apollo-client/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 5abae64bec2..b37afe57b62 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -23,8 +23,7 @@ The Apollo Client class is the thing you import from this package, and should be Instantiate a new Apollo Client. - `networkInterface: NetworkInterface` (Optional, defaults to an interface that points to `/graphql`) The network interface to use when sending GraphQL queries to the server. -- `store: ReduxStore` (Optional, creates a new Redux store by default) A Redux store to in which to keep all state. [Read more about integrating with Redux](customization.html#redux). -- `reduxRootKey: string` (Optional, `apollo` by default) The key under which Apollo data will be stored in the Redux store. If you aren't integrating with an existing Redux store, don't worry about this. +- `reduxRootKey: string` (Optional, `apollo` by default) The key under which Apollo data will be stored in the Redux store. [Read more about integrating with Redux](customization.html#redux). If you aren't integrating with an existing Redux store, don't worry about this. Here's how you would instantiate a default client that points to `/graphql`: From 996f582a3aaa413f29cc08ffa7569bce4956b21d Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 12 Apr 2016 19:34:54 -0700 Subject: [PATCH 020/409] Formatting --- docs/source/apollo-client/customization.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/apollo-client/customization.md b/docs/source/apollo-client/customization.md index d3b580af684..691748c4a05 100644 --- a/docs/source/apollo-client/customization.md +++ b/docs/source/apollo-client/customization.md @@ -4,7 +4,7 @@ order: 102 description: These are Apollo Docs!! --- -## Custom network interface +

Custom network interface

You can define a custom network interface and pass it to the Apollo Client to send your queries in a different way. You could use this for a variety of reasons: @@ -14,13 +14,13 @@ You can define a custom network interface and pass it to the Apollo Client to se All you need to do is create a `NetworkInterface` and pass it to the `ApolloClient` constructor. -### NetworkInterface +

interface NetworkInterface

This is an interface that an object should implement so that it can be used by the Apollo Client to make queries. - `query(request: GraphQLRequest): Promise` This function on your network interface is pretty self-explanatory - it takes a GraphQL request object, and should return a promise for a GraphQL result. The promise should be rejected in the case of a network error. -### GraphQLRequest +

interface GraphQLRequest

Represents a request passed to the network interface. Has the following properties: @@ -28,7 +28,7 @@ Represents a request passed to the network interface. Has the following properti - `variables: Object` The variables to send with the query. - `debugName: string` An optional parameter that will be included in error messages about this query. XXX do we need this? -### GraphQLResult +

interface GraphQLResult

This represents a result that comes back from the GraphQL server. @@ -44,7 +44,7 @@ By default, the Apollo Client creates its own internal Redux store to manage que To integrate with your existing Redux store: 1. Create an `ApolloClient` instance. -1. Use [`combineReducers` from Redux](http://redux.js.org/docs/api/combineReducers.html) to combine `client.reducer()` with your other reducers. By default, the reducer expects to be attached under the `apollo` key in the store. +2. Use [`combineReducers` from Redux](http://redux.js.org/docs/api/combineReducers.html) to combine `client.reducer()` with your other reducers. By default, the reducer expects to be attached under the `apollo` key in the store. 3. Pass your reducers to [Redux's `createStore`](http://redux.js.org/docs/api/createStore.html), and make sure to use `applyMiddleware` to add `client.middleware()` to your store. Here's what it looks like all together: From fd35698c30288b4c903ab9bf2f6e099398fd976b Mon Sep 17 00:00:00 2001 From: John Pinkerton Date: Tue, 12 Apr 2016 22:46:40 -0400 Subject: [PATCH 021/409] Update networkInterface example --- docs/source/apollo-client/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index b37afe57b62..c7792ada382 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -43,7 +43,7 @@ Create a new HTTP network interface that points to a GraphQL server at a specifi Here's how you would instantiate a new client with a custom endpoint URL: ```js -import ApolloClient from 'apollo-client'; +import ApolloClient, { createNetworkInterface } from 'apollo-client'; const networkInterface = createNetworkInterface('https://example.com/graphql'); From 2242490597cdf1f9826841a63c7dd1dcd14eba51 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 15 Apr 2016 15:08:17 -0700 Subject: [PATCH 022/409] Reorg docs --- docs/_config.yml | 4 +- docs/source/apollo-client/index.md | 2 +- docs/source/apollo-client/network.md | 36 ++++++++++++++++ docs/source/apollo-client/react.md | 7 +++ .../{customization.md => redux.md} | 43 +++---------------- 5 files changed, 52 insertions(+), 40 deletions(-) create mode 100644 docs/source/apollo-client/network.md create mode 100644 docs/source/apollo-client/react.md rename docs/source/apollo-client/{customization.md => redux.md} (53%) diff --git a/docs/_config.yml b/docs/_config.yml index 0d2c1283179..66866727b40 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -16,7 +16,9 @@ sidebar_categories: - index Apollo Client: - apollo-client/index - - apollo-client/customization + - apollo-client/react + - apollo-client/redux + - apollo-client/network Apollo Server: - apollo-server/index - apollo-server/guide diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index c7792ada382..b05797a5fef 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -1,5 +1,5 @@ --- -title: Introduction +title: Client overview order: 101 description: These are Apollo Docs!! --- diff --git a/docs/source/apollo-client/network.md b/docs/source/apollo-client/network.md new file mode 100644 index 00000000000..02549b2d833 --- /dev/null +++ b/docs/source/apollo-client/network.md @@ -0,0 +1,36 @@ +--- +title: Network layer +order: 102 +description: How to point your Apollo client to a different GraphQL server, or use a totally different protocol. +--- + +

Custom network interface

+ +You can define a custom network interface and pass it to the Apollo Client to send your queries in a different way. You could use this for a variety of reasons: + +1. You want a custom transport that sends queries over Websockets instead of HTTP +2. You want to modify the query or variables before they are sent +3. You want to run your app against a mocked client-side schema and never send any network requests at all + +All you need to do is create a `NetworkInterface` and pass it to the `ApolloClient` constructor. + +

interface NetworkInterface

+ +This is an interface that an object should implement so that it can be used by the Apollo Client to make queries. + +- `query(request: GraphQLRequest): Promise` This function on your network interface is pretty self-explanatory - it takes a GraphQL request object, and should return a promise for a GraphQL result. The promise should be rejected in the case of a network error. + +

interface GraphQLRequest

+ +Represents a request passed to the network interface. Has the following properties: + +- `query: string` The query to send to the server. +- `variables: Object` The variables to send with the query. +- `debugName: string` An optional parameter that will be included in error messages about this query. XXX do we need this? + +

interface GraphQLResult

+ +This represents a result that comes back from the GraphQL server. + +- `data: any` This is the actual data returned by the server. +- `errors: Array` This is an array of errors returned by the server. diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md new file mode 100644 index 00000000000..5a0347d28a8 --- /dev/null +++ b/docs/source/apollo-client/react.md @@ -0,0 +1,7 @@ +--- +title: React integration +order: 110 +description: How to use the Apollo Client to fetch GraphQL data in your React application. +--- + +TODO diff --git a/docs/source/apollo-client/customization.md b/docs/source/apollo-client/redux.md similarity index 53% rename from docs/source/apollo-client/customization.md rename to docs/source/apollo-client/redux.md index 691748c4a05..2f966ffa27d 100644 --- a/docs/source/apollo-client/customization.md +++ b/docs/source/apollo-client/redux.md @@ -1,45 +1,12 @@ --- -title: Customization -order: 102 -description: These are Apollo Docs!! +title: Redux integration +order: 130 +description: How to integrate Apollo Client into your existing Redux store. --- -

Custom network interface

- -You can define a custom network interface and pass it to the Apollo Client to send your queries in a different way. You could use this for a variety of reasons: - -1. You want a custom transport that sends queries over Websockets instead of HTTP -2. You want to modify the query or variables before they are sent -3. You want to run your app against a mocked client-side schema and never send any network requests at all - -All you need to do is create a `NetworkInterface` and pass it to the `ApolloClient` constructor. - -

interface NetworkInterface

- -This is an interface that an object should implement so that it can be used by the Apollo Client to make queries. - -- `query(request: GraphQLRequest): Promise` This function on your network interface is pretty self-explanatory - it takes a GraphQL request object, and should return a promise for a GraphQL result. The promise should be rejected in the case of a network error. - -

interface GraphQLRequest

- -Represents a request passed to the network interface. Has the following properties: - -- `query: string` The query to send to the server. -- `variables: Object` The variables to send with the query. -- `debugName: string` An optional parameter that will be included in error messages about this query. XXX do we need this? - -

interface GraphQLResult

- -This represents a result that comes back from the GraphQL server. - -- `data: any` This is the actual data returned by the server. -- `errors: Array` This is an array of errors returned by the server. - -

Redux integration

- By default, the Apollo Client creates its own internal Redux store to manage queries and their results. If you are already using Redux for the rest of your app, you can have the client integrate with your existing store instead. This will let you better track the different events that happen in your app, and how your client and server side data changes interleave. -### Creating the store +

Creating the store

To integrate with your existing Redux store: @@ -75,7 +42,7 @@ store.getState(); // } ``` -### Custom store key +

Custom store key

By default, the `ApolloClient` instance will assume that Apollo-related data lives under the `apollo` key in the store. To change the name of this key: From 077324d6d82c222093b2cbe2b82cbfea48f27566 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 15 Apr 2016 15:19:25 -0700 Subject: [PATCH 023/409] Document forceFetch better --- docs/source/apollo-client/index.md | 60 +++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index b05797a5fef..5c5689c25c1 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -68,13 +68,69 @@ This means that using `watchQuery` will keep your UI consistent, so that every q In the future, `watchQuery` will also have some extra options for reactivity, allowing you to set a polling interval, connect to a source of invalidations for reactive re-fetching, or accept pushed data from the server for low-latency updates. Using it now will allow you to easily switch those options on when they become available. +

query diffing and forceFetch

+ +The Apollo Client doesn't just directly send your GraphQL queries to the server. It does a lot of pre-and-post processing of the data. One of the main things it does is _query diffing_, which means comparing a query you're about to fetch with the data the client fetched previously, and sending a new query that fetches only the necessary data. + +For example, let's say you do two queries, one after the other: + +``` +// First query fetched +{ + todoList(id: 5) { + title + createdAt + tasks { + name + completed + } + } +} + +// Second query, after the user clicks a button +{ + todoList(id: 5) { + title + createdAt + tasks { + name + completed + } + } + user(id: 8) { + name + username + } +} +``` + +The Apollo Client is smart enough to realize that it already has the data for part of the second query, and sends only the new part: + +``` +// Actual second query sent +{ + user(id: 8) { + name + username + } +} +``` + +You can take advantage of this feature to reduce the amount of data your app is loading, without putting in any extra work. For example, if someone navigates to a different page of your app, then comes back immediately, if you try to load the same query again the Apollo Client will just use the existing data. This is the default behavior. + +We are always going to be improving the efficiency of the query diffing algorithm. Right now, it just does basic operations, but in the future it will be able to fetch single missing objects, and diff deeply nested queries. Follow along on the GitHub repository to find out when these features are coming. + +

Using forceFetch

+ +Of course, you don't always want to use the existing data in the store - sometimes you want to get the new data directly from the server even though you already have it on the client. In this case, you should pass the `forceFetch` option to `query` or `watchQuery`, as documented below. +

ApolloClient#query(options)

Run a GraphQL query and return a promise that resolves to a `GraphQLResult`. - `query: string` A GraphQL query string to fetch. - `variables: Object` The variables to pass along with the query. -- `forceFetch: boolean` (Optional, default is `true`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. +- `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. Here's how you would run a single query and get the result: @@ -117,7 +173,7 @@ Run a GraphQL query and return a `WatchedQueryHandle` that is updated as the que - `query: string` A GraphQL query string to fetch. - `variables: Object` The variables to pass along with the query. -- `forceFetch: boolean` (Optional, default is `true`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. +- `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. - `returnPartialData: boolean` (Optional, default is `false`) If false, wait until the query has finished the initial load from the server to return any data. If true, return any data we might happen to already have in the store immediately. If you pass true for this option, your UI should be ready to deal with the possibility that it will get a partial result at first.

WatchedQueryHandle

From 94d044096c97146e42eced072b186b68f8fee0e2 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 15 Apr 2016 15:23:17 -0700 Subject: [PATCH 024/409] Fix favicon Fixes #4 --- docs/_config.yml | 1 + themes/meteor | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 66866727b40..5b87c2348e6 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -32,6 +32,7 @@ nav_links: apollostack.com: http://www.apollostack.com/ Blog: https://medium.com/apollo-stack GitHub: https://github.com/apollostack +favicon: /logo/square.png # API keys apis: diff --git a/themes/meteor b/themes/meteor index f6333f5c251..9fbb7bbbeed 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit f6333f5c251f1acf3929fac7ee3da791d15077be +Subproject commit 9fbb7bbbeedcbfd8f55ca477b49590bc43f67d65 From 4b9d29fc18dc5a56d9d5555abcbde9af87fcf09c Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 15 Apr 2016 15:30:53 -0700 Subject: [PATCH 025/409] Add devtools section --- docs/_config.yml | 1 + docs/source/apollo-client/devtools.md | 13 +++++++++++++ docs/source/apollo-client/network.md | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 docs/source/apollo-client/devtools.md diff --git a/docs/_config.yml b/docs/_config.yml index 5b87c2348e6..30998406905 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -19,6 +19,7 @@ sidebar_categories: - apollo-client/react - apollo-client/redux - apollo-client/network + - apollo-client/devtools Apollo Server: - apollo-server/index - apollo-server/guide diff --git a/docs/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md new file mode 100644 index 00000000000..e864b6dedd4 --- /dev/null +++ b/docs/source/apollo-client/devtools.md @@ -0,0 +1,13 @@ +--- +title: Developer tools +order: 141 +description: How to use extensions and developer tools to get insight into what your app is doing. +--- + +The Apollo Client is written from the ground up with the intention of making it easy to understand what is going on in your application. This is one of the main reasons we decided to build on top of Redux, which has an amazing ecosystem of developer tools. + +If you don't pass in an existing Redux store into the `ApolloClient` constructor, then you will get integration by default with the [Redux DevTools](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=en) extension. Just install it, open the window, and you'll be able to keep track of all of the requests your client is making and how that affects the internal data store. + +

Inspecting the example app

+ +XXX add screenshots after we have example app diff --git a/docs/source/apollo-client/network.md b/docs/source/apollo-client/network.md index 02549b2d833..f3d78f3849e 100644 --- a/docs/source/apollo-client/network.md +++ b/docs/source/apollo-client/network.md @@ -1,6 +1,6 @@ --- title: Network layer -order: 102 +order: 140 description: How to point your Apollo client to a different GraphQL server, or use a totally different protocol. --- From 461b0a32ebde9de84d819a6e2be5b9e9ca182983 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 15 Apr 2016 16:01:28 -0700 Subject: [PATCH 026/409] Mention require --- docs/source/apollo-client/index.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 5c5689c25c1..a18ac0a1afe 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -33,6 +33,14 @@ import ApolloClient from 'apollo-client'; const client = new ApolloClient(); ``` +If you're not using ES2015, you can also load it with `require`: + +```js +var ApolloClient = require('apollo-client').default; +``` + +The rest of the code snippets will use ES2015 import syntax. +

createNetworkInterface(url, options)

Create a new HTTP network interface that points to a GraphQL server at a specific URI. From 3c595cfc5be3072389f8f7b2cd32ecc823d8cc2c Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 15 Apr 2016 17:17:14 -0700 Subject: [PATCH 027/409] Fix description --- docs/source/apollo-client/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index a18ac0a1afe..011c96214df 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -1,7 +1,7 @@ --- title: Client overview order: 101 -description: These are Apollo Docs!! +description: Basic information on getting started with and using the Apollo Client. --- The Apollo Client can easily be dropped into any JavaScript frontend where you want to use data from a GraphQL server. From 59a96705c62968249adc922fb0d4997b6dd74dbf Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 15 Apr 2016 16:57:42 -0700 Subject: [PATCH 028/409] first pass at setup --- docs/source/apollo-server/guide.md | 29 +++++++++++++++++++++++++---- docs/source/apollo-server/index.md | 4 ++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 19a9e83daa3..46586a3cc1d 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -4,17 +4,38 @@ order: 202 description: These are Apollo Docs!! --- -This section is the official guide for building a GraphQL server the Apollo way. It describes each step in detail from defining a schema to writing your own resolve functions and loaders. +This guide will walk you through building a GraphQL server using graphql-tools, a package we are actively developing for the Apollo stack. There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. ## Setup +For this guide, we'll assume that you are familiar with using the command line of your OS and already have Node 5 and npm set up for your environment. +If that's not the case, you should [do that first](https://nodejs.org/en/download/package-manager/) before you read the rest of this guide. +Furthermore, we'll also assume that you already have Babel 6 installed, because the JavaScript syntax we're using in this tutorial uses Babel to transpile it for Node 5. If you don't have Babel set up, follow the [instructions for setting up Babel](https://babeljs.io/blog/2015/10/31/setting-up-babel-6). + +To get started, create a new folder for your project and run `npm init`, which will ask you a few questions about your project. If you don't care about sharing your code with anyone, you can just skip over them by pressing `Enter` repeatedly: +```bash +mkdir myServer +cd myServer +npm init +``` + +Next, you'll need to install a preset and tell Babel to use it. A preset defines what things Babel should transpile and polyfill. Here, we'll use the Meteor preset, which includes arrow functions, object descructuring etc. +```bash +npm i --save babel-preset-meteor +echo "{presets:[\"meteor\"]}" > .babelrc +``` + +Finally, we're ready to install the actual packages that we'll be using in this project. ## Schema ## Mocking -## Resolve Funcitions +## Resolve Functions + +## Connectors -## HTTP +### SQL -## Data Loaders +### MongoDB +### REST / HTTP diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md index 204656a45c8..4ec47c6a134 100644 --- a/docs/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -4,10 +4,10 @@ order: 201 description: These are Apollo Docs!! --- -Apollo GraphQL Tools are a collection of functions and an opinionated guide for building GraphQL servers in JavaScript. +Apollo GraphQL Tools is a collection of functions and an opinionated guide for how to build a GraphQL server in JavaScript. ```txt npm install graphql-tools ``` -The Apollo GraphQL tools are made for building servers, but they can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. Information on how to use individual tools with GraphQL-JS can be found in the Tools section of this guide. +The Apollo GraphQL tools are not just useful for building servers, they can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. Information on how to use individual tools with GraphQL-JS can be found in the Tools section of this guide. From 7f770d97b4505299857020b5892975af23684919 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 15 Apr 2016 17:52:55 -0700 Subject: [PATCH 029/409] Complete setup section with starter-kit and picture --- docs/source/apollo-server/graphiql-test.png | Bin 0 -> 118706 bytes docs/source/apollo-server/guide.md | 27 ++++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 docs/source/apollo-server/graphiql-test.png diff --git a/docs/source/apollo-server/graphiql-test.png b/docs/source/apollo-server/graphiql-test.png new file mode 100644 index 0000000000000000000000000000000000000000..aed5effcdd0a747cf487878f0094bbee0d962350 GIT binary patch literal 118706 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 .babelrc +npm start ``` +If all goes well, the server should now print out a message that it is listening on port 8080. If you open [localhost:8080](http://localhost:8080/?query=%7B%0A%20%20testString%0A%7D) in your browser, you should now see the GraphiQL GUI for GraphQL, ready to query the server: + +![Testing the server with GraphiQL](graphiql-test.png) + +**For advanced users:** +If you already have an express server or a GraphQL server set up, then you can also simply install graphql-tools with the command `npm install graphql-tools` and jump to the [Tools](tools.html) section in this guide to learn about using the individual parts of the graphql-tools package. -Finally, we're ready to install the actual packages that we'll be using in this project. ## Schema From 037e809955f1582575f0794248cf1b4c97a579d2 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 15 Apr 2016 19:29:58 -0700 Subject: [PATCH 030/409] start of schema section --- docs/source/apollo-server/guide.md | 24 ++++++++++++++++++++++-- themes/meteor | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index eff0295f17f..fed439e9f5b 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -4,10 +4,10 @@ order: 202 description: These are Apollo Docs!! --- -This guide will walk you through building a GraphQL server using graphql-tools, a package we are actively developing for [Apollo](http://www.apollostack.com). There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. +This guide will walk you through building a GraphQL server for a simple Todos app. We'll be using a package called [graphql-tools](https://www.npmjs.com/package/graphql-tools), which is actively being developed for [Apollo](http://www.apollostack.com). There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. ## Setup -For this guide, we'll assume that you are familiar with using the command line of your operating system and already have Node 5 and npm set up for your environment. +For the remainder of this guide, we'll assume that you are familiar with using the command line of your operating system and already have Node 5 and npm set up for your environment. If that's not the case, you should [do that first](https://nodejs.org/en/download/package-manager/) before you read the rest of this guide. To get started, you need to install a few packages and set up some boilerplate. To make this easier, we've created a barebones started kit which you can use: @@ -33,6 +33,26 @@ If you already have an express server or a GraphQL server set up, then you can a ## Schema +If you open the data folder in the project directory, you will see the file `schema.js` which defines the schema our server uses: +```js +const typeDefinitions = ` +type Query { + testString: String +} + +schema { + query: Query +} +`; + +export default [typeDefinitions]; +``` +ApolloServer uses the GraphQL schema language notation, which it then compiles to a GraphQL-JS schema. With the current schema, our server provides exactly one entry point `testString`, which returns a String. + +The schema notation supports all GraphQL types. In this tutorial we are only going to use a few of them. You can learn about all the others in the [schema creation subsection of Tools](http://localhost:4000/apollo-server/tools.html#Schema-creation). + + + ## Mocking ## Resolve Functions diff --git a/themes/meteor b/themes/meteor index 9fbb7bbbeed..f6333f5c251 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit 9fbb7bbbeedcbfd8f55ca477b49590bc43f67d65 +Subproject commit f6333f5c251f1acf3929fac7ee3da791d15077be From c85aa208866058cf3cafc74ac89c31c8ade13814 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 15 Apr 2016 23:57:39 -0700 Subject: [PATCH 031/409] schema definition seciton of guide done --- docs/source/apollo-server/guide.md | 58 ++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index fed439e9f5b..a8a640da961 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -4,7 +4,9 @@ order: 202 description: These are Apollo Docs!! --- -This guide will walk you through building a GraphQL server for a simple Todos app. We'll be using a package called [graphql-tools](https://www.npmjs.com/package/graphql-tools), which is actively being developed for [Apollo](http://www.apollostack.com). There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. +This guide will explain all the parts required for a simple GraphQL Blog server. If you're looking for a tutorial, check out this Medium post or our GraphQL server tutorial video on Youtube. + +We'll be using a package called [graphql-tools](https://www.npmjs.com/package/graphql-tools), which is actively being developed for [Apollo](http://www.apollostack.com). There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. ## Setup For the remainder of this guide, we'll assume that you are familiar with using the command line of your operating system and already have Node 5 and npm set up for your environment. @@ -33,7 +35,7 @@ If you already have an express server or a GraphQL server set up, then you can a ## Schema -If you open the data folder in the project directory, you will see the file `schema.js` which defines the schema our server uses: +If you open the `data` folder in the project directory, you will see the file `schema.js` which defines the schema your server currently uses: ```js const typeDefinitions = ` type Query { @@ -51,10 +53,62 @@ ApolloServer uses the GraphQL schema language notation, which it then compiles t The schema notation supports all GraphQL types. In this tutorial we are only going to use a few of them. You can learn about all the others in the [schema creation subsection of Tools](http://localhost:4000/apollo-server/tools.html#Schema-creation). +For the todos app, we're going to use a schema that has the following two types: Authors and Posts. For each type, the schema defines which fields it has, and how it relates to the other types. The fields of the RootQuery and RootMutation types are the client's entry points to the schema. Every query or mutation has to start there, but it can ask for as much or as little data as it wants by expanding the fields when necessary. + +````js +const typeDefinitions = ` +type Author { + id: Int! # the ! means that every author object _must_ have an id + firstName: String + lastName: String + posts: [Post] # the list of Posts by this author +} + +type Post { + id: Int! + tags: [String] + title: String + text: String + author: Author +} + +# the schema allows the following two queries: +type RootQuery { + author(firstName: String, lastName: String): User + posts(tags: [String]): [Post] +} + +# this schema allows the following two mutations: +type RootMutation { + createAuthor( + firstName: String! + lastName: String! + ): Author + + createPost( + tags: [String!]! + title: String! + text: String! + authorId: Int! + ): Post +} +# we need to tell the server which types represent the root query +# and root mutation types. We call them RootQuery and RootMutation by convention. +schema { + query: RootQuery + mutation: RootMutation +} +`; + +export default [typeDefinitions]; +``` +For more information about GraphQL's type system and schema language, you can read the [Schema definition subsection in the Tools chapter](http://localhost:4000/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). ## Mocking + + ## Resolve Functions ## Connectors From 2737e79c2dbd1190ebe10f526aba43bc6a2b73c5 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 15 Apr 2016 23:58:05 -0700 Subject: [PATCH 032/409] mocking section of the guide done --- docs/source/apollo-server/guide.md | 46 ++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index a8a640da961..7e1d80798ed 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -107,7 +107,53 @@ For more information about GraphQL's type system and schema language, you can re ## Mocking +Mocking is one of the many things that GraphQL makes much easier than traditional RESTful APIs. If you copy the schema of the previous subsection into the `data/schema.js` file and restart your server, you can immediately start querying it and it will return some mocked data! +The defaults for mocked data are a great, but sometimes you need data that looks more realistic. To achieve that, you need to tell the `apolloServer` how to generate mock data for your schema. + +The rules for mocking are defined in `data/mocks.js`. In the unmodified starter kit, the file looks like this: + +```js +const mocks = { + String: () => "It works!", +}; + +export default mocks; +``` + +That's right, the "It works!" that you saw earlier came from here. We're going to modify that to create more realistic mock data. In order to do that, we'll use a package called casual to generate fake data. You can install it by running `npm i --save-dev casual`. + +```js +import { MockList } from 'graphql-tools'; + +const mocks = { + Int: () => casual.integer(1,1000), + Author: () => ({ + firstName: () => casual.first_name, + lastName: () => casual.last_name, + posts: () => new MockList([1,6]), + }), + Post: () => ({ + tags: () => new MockList([1,3]), + title: () => casual.title, + text: () => casual.sentences(4) + }) + RootQuery: () => ({ + author: (o, args) => { + if (casual.integer(1,10) > 8){ + return null; + } + return { ...args }; + } + }) +} +``` + +You can tell `apolloServer` to mock a scalar type, such as Int or String in a specific way. In this case, we told it to return an integer between 1 and 1000 every time an Int field is requested by the client. + +You can also tell `apolloSever` to use special mocks for a specific type. In the `mocks.js` file above, we're telling the server to use `casual.first_name` to mock the `firstName` field of `Author`. If we didn't tell it to do that, it would use the default mock for the `String` type instead. + +In the mock functions, you can also access the arguments passed to the field. In the file above, we're using that feature for the `author` field on `RootQuery`, to make sure that when the query asks for a user with a specific fist and/or last name, we either return a user with that first and/or last name, or we return null (to simulate an unsuccessful search in 20% of the cases). ## Resolve Functions From 6a400860d791e7328b6d682048b5f4bbdd994798 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 00:02:20 -0700 Subject: [PATCH 033/409] minor edits in mocking section --- docs/source/apollo-server/guide.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 7e1d80798ed..faa632f255a 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -121,7 +121,9 @@ const mocks = { export default mocks; ``` -That's right, the "It works!" that you saw earlier came from here. We're going to modify that to create more realistic mock data. In order to do that, we'll use a package called casual to generate fake data. You can install it by running `npm i --save-dev casual`. +That's right, this is where the "It works!" that you saw earlier came from! + +We're going to modify that now to create more realistic mock data. In order to do that, we'll use a package called casual to generate fake data. You can install it by running `npm i --save-dev casual`. ```js import { MockList } from 'graphql-tools'; @@ -155,6 +157,8 @@ You can also tell `apolloSever` to use special mocks for a specific type. In the In the mock functions, you can also access the arguments passed to the field. In the file above, we're using that feature for the `author` field on `RootQuery`, to make sure that when the query asks for a user with a specific fist and/or last name, we either return a user with that first and/or last name, or we return null (to simulate an unsuccessful search in 20% of the cases). +You can read more about mocking with graphql-tools in our [Medium Post on mocking with GraphQL](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd), which also includes more code snippets and a demo. + ## Resolve Functions ## Connectors From afeffc1ef291fb38f56330407c616ee03c9e2a69 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 00:11:13 -0700 Subject: [PATCH 034/409] add some more information on mocking lists --- docs/source/apollo-server/guide.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index faa632f255a..8f17382688e 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -150,17 +150,20 @@ const mocks = { }) } ``` +Go ahead and give the server a try with the new mocks. If all went well, you should be able to run the following query and get a similar result. You can tell `apolloServer` to mock a scalar type, such as Int or String in a specific way. In this case, we told it to return an integer between 1 and 1000 every time an Int field is requested by the client. -You can also tell `apolloSever` to use special mocks for a specific type. In the `mocks.js` file above, we're telling the server to use `casual.first_name` to mock the `firstName` field of `Author`. If we didn't tell it to do that, it would use the default mock for the `String` type instead. +You can also tell `apolloSever` to use special mocks for a specific type. In the `mocks.js` file above, we're telling the server to use `casual.first_name` to mock the `firstName` field of `Author`. If we didn't tell it to do that, it would use the default mock for the `String` type instead. To mock lists of different length, you can use `new MockList([min, max])`, which will return a list of length between min and max (both inclusive). In the mock functions, you can also access the arguments passed to the field. In the file above, we're using that feature for the `author` field on `RootQuery`, to make sure that when the query asks for a user with a specific fist and/or last name, we either return a user with that first and/or last name, or we return null (to simulate an unsuccessful search in 20% of the cases). -You can read more about mocking with graphql-tools in our [Medium Post on mocking with GraphQL](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd), which also includes more code snippets and a demo. +You can read more about mocking with graphql-tools in our [Medium Post on mocking with GraphQL](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd), which also includes more code snippets and a demo. ## Resolve Functions + + ## Connectors ### SQL From 090a4ac959605d139335c638b0550ea867d5e915 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 00:35:17 -0700 Subject: [PATCH 035/409] First pass at resolve functions. Needs more work --- docs/source/apollo-server/guide.md | 42 +++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 8f17382688e..461083256bd 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -75,7 +75,7 @@ type Post { # the schema allows the following two queries: type RootQuery { author(firstName: String, lastName: String): User - posts(tags: [String]): [Post] + posts(tag: String): [Post] } # this schema allows the following two mutations: @@ -162,6 +162,46 @@ You can read more about mocking with graphql-tools in our [Medium Post on mockin ## Resolve Functions +Without resolve functions, our GraphQL server can only return mock data. To make it return real data and persist the effect of mutations, you have to define resolve functions. Resolve functions tell the server how to find and return the data for each field in the query. + +It's probably easiest to explain this with an example: +``` +{ + author(firstName: "Jonas"){ + firstName + lastName + } +} +``` +To respond to this query, the server will first run the resolve function for the `author` field on the type `RootQuery`. Next, it will pass the return value of the `author` resolve function to both the `firstName` and `lastName` resolve functions of the `Author` type, because the schema says that `author` returns an Author, and the query asked for the fields `firstName` and `lastName` on `Author`. Both `firstName` and `lastName` return a String. String is a built-in scalar of GraphQL-JS. Scalar type is just a fancy way of saying that this type represents a leaf node in the graph. A leaf node cannot be expanded further, so its value is serialized and included in the response. + +Resolve functions are defined in the 'data/resolvers.js' file, and the format is quite straight-forward, defining a resolve function for each field. + +```js + +const resolveFunctions = { + RootQuery: { + author(_, { firstName, lastName }){ + return Authors.findOne({ firstName: firstName, lastName: lastName }); + }, + posts(_, { tag }){ + return Posts.where( tag in tags); // TODO TK + }, + }, + Author: { + posts(author){ + return Author.get(author.id).getPosts(); + }, + }, + Posts: { + author(post){ + return Author.get(post.authorId); + } + } +} +``` + +Not every field needs a resolve function. In the example above, `Author.firstName` doesn't have a resolve function, because the value is already on the Author object that the `RootQuery.author` resolve function returned: If the schema doesn't define a resolve function for a field, the server will try to apply the default resolve function, which looks for the property on the input value that has the same name as the field. ## Connectors From 1b555407d042dfd6ee13bb2aab6156cbcdf143e3 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 00:36:51 -0700 Subject: [PATCH 036/409] write a todo reminder for the screenshot in the mocks section --- docs/source/apollo-server/guide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 461083256bd..f753d0fbc40 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -152,6 +152,8 @@ const mocks = { ``` Go ahead and give the server a try with the new mocks. If all went well, you should be able to run the following query and get a similar result. +**TODO:** Screenshot here + You can tell `apolloServer` to mock a scalar type, such as Int or String in a specific way. In this case, we told it to return an integer between 1 and 1000 every time an Int field is requested by the client. You can also tell `apolloSever` to use special mocks for a specific type. In the `mocks.js` file above, we're telling the server to use `casual.first_name` to mock the `firstName` field of `Author`. If we didn't tell it to do that, it would use the default mock for the `String` type instead. To mock lists of different length, you can use `new MockList([min, max])`, which will return a list of length between min and max (both inclusive). From 3e24c4f62458be3f136c376b91d5a9597f50398d Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 00:54:25 -0700 Subject: [PATCH 037/409] minor edits for section on network interfaces --- docs/source/apollo-client/network.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/network.md b/docs/source/apollo-client/network.md index f3d78f3849e..a8083c925b2 100644 --- a/docs/source/apollo-client/network.md +++ b/docs/source/apollo-client/network.md @@ -6,7 +6,7 @@ description: How to point your Apollo client to a different GraphQL server, or u

Custom network interface

-You can define a custom network interface and pass it to the Apollo Client to send your queries in a different way. You could use this for a variety of reasons: +You can define a custom network interface and pass it to the Apollo Client to send your queries in a different way. You might want to do this for a variety of reasons: 1. You want a custom transport that sends queries over Websockets instead of HTTP 2. You want to modify the query or variables before they are sent @@ -16,7 +16,7 @@ All you need to do is create a `NetworkInterface` and pass it to the `ApolloClie

interface NetworkInterface

-This is an interface that an object should implement so that it can be used by the Apollo Client to make queries. +This is the interface that an object should implement so that it can be used by the Apollo Client to make queries. - `query(request: GraphQLRequest): Promise` This function on your network interface is pretty self-explanatory - it takes a GraphQL request object, and should return a promise for a GraphQL result. The promise should be rejected in the case of a network error. From 9d2d80a37dcb4872241d896e227de34450869006 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Sat, 16 Apr 2016 11:33:13 -0700 Subject: [PATCH 038/409] Slightly clearer * Slightly clearer Not sure if you guys want PRs yet? * Update index.md --- docs/source/apollo-client/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 011c96214df..1589db007cb 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -112,7 +112,7 @@ For example, let's say you do two queries, one after the other: } ``` -The Apollo Client is smart enough to realize that it already has the data for part of the second query, and sends only the new part: +The Apollo Client is smart enough to realize that it already has the `todoList` data for the second query, and sends only the `user` part: ``` // Actual second query sent From e622336327e312cf070b1aad261da4231d4812f6 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 12:11:27 -0700 Subject: [PATCH 039/409] intro for tools section --- docs/source/apollo-server/tools.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 3918e968caf..d09bc1a5e4d 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -1,9 +1,15 @@ --- -title: Tools +title: Documentation for graphql-tools order: 203 description: These are Apollo Docs!! --- +While `apolloServer` can be used as an express middleware, graphql-tools exports all the functions that `apolloServer` uses internally, so they can be used separately with any GraphQL-JS schema. This section documents all the functions that graphql-tools exports, and explains how they can be used. + +## Express middleware + +* apolloServer + ## Schema creation * createSchema @@ -30,6 +36,3 @@ description: These are Apollo Docs!! ## Error handling * forbidUndefinedResolve - - - From 946953eac071caf622d4e8917127faea8d614a59 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 14:41:19 -0700 Subject: [PATCH 040/409] apolloServer section complete --- docs/source/apollo-server/tools.md | 127 ++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index d09bc1a5e4d..87f20a023bc 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -8,7 +8,132 @@ While `apolloServer` can be used as an express middleware, graphql-tools exports ## Express middleware -* apolloServer +### apolloServer + +`apolloServer` is a convenient function that generates an express-middleware. It combines all of the tools and has a straightforward interface: + +``` +import { apolloServer } from 'graphql-tools'; + +var app = express(); + +app.use('/graphql', apolloServer({ schema: typeDefinitionArray, graphiql: true })); +``` + + +Function signature: +``` +apolloServer({ + // options in common with graphqlHTTP from express-graphql + schema: GraphQLSchema | [typeDefinition], + formatError: function, // optional + graphiql: Boolean, // optional + pretty: Boolean, // optional + validationRules: Array, // optional + context: any, // optional + rootValue: any // optional + + // options specific to apolloServer + resolvers: Object, // required if schema is an array of type definitions + connectors: Object, // optional + mocks: Object, // optional + allowUndefinedInResolve: Boolean, // optional + printErrors: Boolean, // optional + }) +``` + +The function `apolloServer` wraps the `graphqlHTTP` middleware from `express-graphql`. If you replace an existing call to `graphqlHTTP` with a call to `apolloServer`, the resulting express middleware will behave in exactly the same way. For the documentation of the graphqlHTTP arguments, refer to the express-graphql [documentation](https://github.com/graphql/express-graphql#options). + +**schema** +In place of a GraphQLSchema, `apolloServer` also accepts an array of GraphQL shorthand type definitions as described in [Schema creation](#Schema-creation). + +**resolvers** +Resolvers is a required option if the schema provided to `apolloServer` is in shorthand GraphQL schema language. If defined, the option `resolvers` expects an Object that defines a resolve function for each non-scalar field of every type defined in the schema. Fields that take arguments also require a resolve function. A simple example defining a single resolve function for the `author` field of the `RootQuery` type is given below. A more detailed description is given in [Resolve functions](#Resolve-functions). Resolve functions should be stateless. + +```js +const resolvers = { + RootQuery: { + author(root, args){ + return Authors.findOne(args); + } + } +} +``` + +**connectors** +Connectors is not a required option. If provided, the option `connectors` expects an Object that has connector classes as its named property. An instance of each connector will be constructed and attached to the context at the beginning of query execution, effectively making it a singleton that can keep state. This requires that if given, the `context` argument is an object. + +```js +// in connectors.js +class AuthorConnector{ + constructor(){ + this.store = new Map() + map.set(1, { id: 1, firstName: 'Bill', lastName: 'Nye' }); + } + + get(key){ + return this.store.get(key); + } + set(key, value){ + return this.store.set(key, value); + } +} + +const connectors = { + author: AuthorConnector +}; + +export default connectors; +``` + +To use connectors in a resolve function: +```js +// in resolvers.js +const resolvers = { + RootQuery: { + author(root, args, context) => { + return context.connectors.author.get(args.id); + }); + } +} +``` + +**mocks** +If provided, `mocks` will mock the results of the GraphQL query, overriding any resolve functions defined on the schema. `mocks` expects an object with one function per type that should be mocked. If no function is provided for a type, the default mock will be used, which means that you can call `apolloServer` with `mocks: {}` to get started quickly. + +Mocks for scalar types, such as Int and Boolean will be used everywhere, unless they are overridden by a more specific mock defined in a non-scalar type. Mocks for non-scalar types must be a function that returns an object with the desired properties. + +```js +import { MockList } from 'graphql-tools'; + +const mocks = { + Int: () => 55, + RootQuery: () => ({ + author: (_, args) => { + return {id: args.id}, // results in a mocked author object with id args.id + }, + posts: (_, args) => { + // results in a mocked list of posts of length between 1 and 5, all having + // tags = [args.tag] + return new MockList([1,5], (_, args) => ({ tags: [args.tag] })); + } + }) +``` + +Mock functions are a special kind of resolve function, which means they have access to the same arguments that resolve functions have, including arguments and context. + +`MockList` can be used to mock a list of items of a specific (or random) length. + +You can read more about mocking with graphql-tools in this [Medium Post on mocking with GraphQL](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd), which also includes more code snippets and a demo. + + +**printErrors** +If `printErrors` is set to `true`, the GraphQL server will print all errors that occurred inside resolve functions to the console. By default this option is false, and GraphQL errors will not be printed to the server console, but only returned in the errors field of the query response. + +**allowUndefinedInResolve** +If `allowUndefinedInResolve` is set to `false`, `apolloServer` will throw an Error every time a resolve function returns `undefined`. Usually returning `undefined` from a user-defined resolve function is due to a programming mistake, so this option can be helpful for debugging. + +If execution should not continue, resolve functions should return `null` and not `undefined`. ## Schema creation From 2b9d91d964db052ca5bf4e555ca7690ca54ff482 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 17:35:01 -0700 Subject: [PATCH 041/409] schema creation --- docs/source/apollo-server/tools.md | 74 ++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 87f20a023bc..1496baaf3f1 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -8,7 +8,7 @@ While `apolloServer` can be used as an express middleware, graphql-tools exports ## Express middleware -### apolloServer +### apolloServer(schema, [...]) `apolloServer` is a convenient function that generates an express-middleware. It combines all of the tools and has a straightforward interface: @@ -21,7 +21,7 @@ app.use('/graphql', apolloServer({ schema: typeDefinitionArray, graphiql: true } ``` -Function signature: +**Function signature** ``` apolloServer({ // options in common with graphqlHTTP from express-graphql @@ -137,7 +137,75 @@ If execution should not continue, resolve functions should return `null` and not ## Schema creation -* createSchema +The graphql-tools package allows you to create a GraphQLSchema object from shorthand schema language by using the function `createSchema`. + +### createSchema(typeDefinitions) +**Function signature** +``` +import { createSchema } from 'graphql-tools'; + +const jsSchema = createSchema(typeDefinitions); +``` + +`typeDefinitions` should be an array of shorthand schema strings or a function that takes no arguments and returns an array of shorthand schema strings. The order of the strings in the array is not important, but it must include a schema definition. The schema must define a query type, which means a minimal schema would look something like this: +```js +const typeDefinition = [` +schema { + query: RootQuery +} + +type RootQuery { + aNumber: Int +}`]; + +const jsSchema = createSchema(typeDefinition); +``` + +If your schema gets large, you may want to define parts of it in different files and import them to create the full schema. This is possible by including them in the array. If there are circular dependencies, the array should be wrapped in arrow function. `createSchema` will only include each type definition once, even if it is imported multiple times by different types. + +```js +// in author.js ------------------- +import Book from './book'; + +const Author = ` + type Author { + name: String + books: [Book] + } +`; + +export default () => [Author, Book]; + +// in book.js ----------------------- +import Author from './author'; + +const Book = ` + type Book { + title: String + author: Author + } +`; + +export default () => [Book, Author]; + +// in schema.js ---------------------- +import Author from './author.js'; + +const RootQuery = ` + type RootQuery { + author(name: String): Author + } +`; + +const SchemaDefinition = ` + schema { + query: RootQuery + } +`; + +export default createSchema([SchemaDefinition, RootQuery, Author]); +``` + ## Resolve functions From addd0119b772750f22a834affa564888f8d31d35 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 17:35:40 -0700 Subject: [PATCH 042/409] rename loaders to connectors --- docs/source/apollo-server/tools.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 1496baaf3f1..9abe8667b4f 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -222,9 +222,9 @@ export default createSchema([SchemaDefinition, RootQuery, Author]); * Logger * addProfilingToSchema -## Data Loaders +## Connectors -* attachLoadersToContext +* attachConnectorsToContext ## Error handling From 629fae1fb992f8e529a2d98d014b9e72ec5e7ef7 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 17:48:09 -0700 Subject: [PATCH 043/409] document addErrorLoggingToSchema --- docs/source/apollo-server/tools.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 9abe8667b4f..6a719997453 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -219,13 +219,20 @@ export default createSchema([SchemaDefinition, RootQuery, Author]); ## Logging and performance profiling -* Logger -* addProfilingToSchema +coming soon ... ## Connectors * attachConnectorsToContext -## Error handling +## Error handling + error logging -* forbidUndefinedResolve +* forbidUndefinedInResolve +### addErrorLoggingToSchema(logger) +This function may be deprecated in the near future. Instead of using addErrorLoggingToSchema, the `formatError` option of `apolloServer` or `graphqlHTTP` should be used, which was recently added in graphql-js v0.5.0 + +`addErorrLoggingToSchema` takes only one argument - `logger` - which must be an Object having a function as the property `log`. Every time an error occurs, `logger.log` will be called with that error. +```js +import { addErrorLoggingToSchema } from 'graphql-tools'; +const logger = { log: (e) => console.error(e.stack) }; +addErrorLoggingToSchema(mySchema, logger); From 6ff41ba12275e3a179ccdcfacfdf28ffc9382ece Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 17:48:35 -0700 Subject: [PATCH 044/409] fix typo --- docs/source/apollo-server/tools.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 6a719997453..e01b22b6b37 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -236,3 +236,4 @@ This function may be deprecated in the near future. Instead of using addErrorLog import { addErrorLoggingToSchema } from 'graphql-tools'; const logger = { log: (e) => console.error(e.stack) }; addErrorLoggingToSchema(mySchema, logger); +``` From 1152688b94816be750d856d59d13caa046892a98 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 17:50:41 -0700 Subject: [PATCH 045/409] clarify language --- docs/source/apollo-server/tools.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index e01b22b6b37..3ef6932abe3 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -227,11 +227,14 @@ coming soon ... ## Error handling + error logging -* forbidUndefinedInResolve -### addErrorLoggingToSchema(logger) +### forbidUndefinedInResolve(schema) +When + + +### addErrorLoggingToSchema(schema, logger) This function may be deprecated in the near future. Instead of using addErrorLoggingToSchema, the `formatError` option of `apolloServer` or `graphqlHTTP` should be used, which was recently added in graphql-js v0.5.0 -`addErorrLoggingToSchema` takes only one argument - `logger` - which must be an Object having a function as the property `log`. Every time an error occurs, `logger.log` will be called with that error. +`addErorrLoggingToSchema` takes two arguments: `schema` and `logger`. `schema` must be an instance of `GraphQLSchema`, `logger` must be an Object with a callable property `log`. Every time an error occurs, `logger.log(e)` will be called. ```js import { addErrorLoggingToSchema } from 'graphql-tools'; const logger = { log: (e) => console.error(e.stack) }; From b2a59886502c9f4066608cdba194ad8e42926cbd Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 17:55:16 -0700 Subject: [PATCH 046/409] finish error handling section --- docs/source/apollo-server/tools.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 3ef6932abe3..614cd495b67 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -226,9 +226,15 @@ coming soon ... * attachConnectorsToContext ## Error handling + error logging +GraphQL servers can be tricky to debug. The following functions can help find error faster in many cases. ### forbidUndefinedInResolve(schema) -When +ForbidUndefinedInResolve can be used during debugging to find mistakes in resolve functions faster. Usually, resolve functions only return undefined due to programmer error. `forbidUndefinedInResolve` takes a GraphQLSchema as input, and modifies it in place to throw an error when a resolve function returns undefined, telling you exactly which resolver returned undefined. +```js +import { forbidUndefinedInResolve } from 'graphql-tools'; + +forbidUndefinedInResolve(schema); +``` ### addErrorLoggingToSchema(schema, logger) From 971773020a97d2daf7465675812c8d5c73778b11 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 21:51:22 -0700 Subject: [PATCH 047/409] resolve functions done --- docs/source/apollo-server/tools.md | 45 +++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 614cd495b67..3ecc5ff3e8e 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -208,14 +208,51 @@ export default createSchema([SchemaDefinition, RootQuery, Author]); ## Resolve functions +In order to respond to queries, a schema needs to have resolve functions. Resolve functions cannot be included in the shorthand schema notation, so they must be added separately. -* addResolversToSchema -* addSchemaLevelResolver +### addResolveFunctionsToSchema(schema, resolveFunctions) + +`addResolveFunctionsToSchema` takes two arguments, a GraphQLSchema and an object defining resolve functions, and modifies the schema in place to. The `resolveFunctions` object should have one property for each type that has fields which need a resolve function. The following is an example of a valid resolveFunctions object: +```js +import { addResolveFunctionsToSchema } from 'graphql-tools'; + +const resolveFunctions = { + RootQuery: { + author(root, { name }){ + return Author.find({ name }); + }, + }, +}; + +addResolveFunctionsToSchema(schema, resolveFunctions); +``` + +For types which need to define additional properties, such as `resolveType` for unions and interfaces, the property can be set by prefixing it with two underscores, eg. `__resolveType` for `resolveType`: + +```js +const resolveFunctions = { + SomeUnionType: { + __resolveType(data, context, info){ + if(data.wingspan){ + return info.schema.getType('Airplane'); + } + if(data.horsepower){ + return info.schema.getType('Car'); + } + return null; + }, + }, +}; +``` + +### addSchemaLevelResolver(schema, rootResolveFunction) +Some operations, such as authentication, need to be done only once per query. Logically, these operations belong in a root resolve function, but unfortunately GraphQL-JS does not let you define one. `addSchemaLevelResolver` solves this by modifying the GraphQLSchema that is passed as the first argument. ## Mocking -* mockServer -* addMocksToSchema +### mockServer + +### addMocksToSchema ## Logging and performance profiling From a330b9490fbd8b58f7c101910068855a19092300 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 21:58:51 -0700 Subject: [PATCH 048/409] minor changes and more explanation for resolveType --- docs/source/apollo-server/tools.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 3ecc5ff3e8e..03d2c55f1e1 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -244,9 +244,10 @@ const resolveFunctions = { }, }; ``` +Note that if the types were defined in shorthand schema notation, the `info` argument to `resolveType` must be used to get a reference to the actual type, eg. `return info.schema.getType("Person")`. This may be changed in the future to support returning just the name of the type, eg. `return "Person"`. ### addSchemaLevelResolver(schema, rootResolveFunction) -Some operations, such as authentication, need to be done only once per query. Logically, these operations belong in a root resolve function, but unfortunately GraphQL-JS does not let you define one. `addSchemaLevelResolver` solves this by modifying the GraphQLSchema that is passed as the first argument. +Some operations, such as authentication, need to be done only once per query. Logically, these operations belong in a root resolve function, but unfortunately GraphQL-JS does not let you define one. `addSchemaLevelResolver` solves this by modifying the GraphQLSchema that is passed as the first argument. ## Mocking From 377c28c86cc578ebefe117c2b7260da76b8bf81e Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 22:03:13 -0700 Subject: [PATCH 049/409] clarify what apolloServer is --- docs/source/apollo-server/tools.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 03d2c55f1e1..f821b864903 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -10,7 +10,7 @@ While `apolloServer` can be used as an express middleware, graphql-tools exports ### apolloServer(schema, [...]) -`apolloServer` is a convenient function that generates an express-middleware. It combines all of the tools and has a straightforward interface: +`apolloServer` is a convenient function that generates an express middleware (it uses express-graphql under the hood). It combines all of the tools in graphql-tools and has a simple to use interface: ``` import { apolloServer } from 'graphql-tools'; From e13578457a725ea7372342300ed4d827a00bc067 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 23:31:03 -0700 Subject: [PATCH 050/409] connectors and mocking --- docs/source/apollo-server/tools.md | 49 ++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index f821b864903..3a873c2ded2 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -251,17 +251,60 @@ Some operations, such as authentication, need to be done only once per query. Lo ## Mocking -### mockServer +### mockServer(schema, mocks = {}, preserveResolvers = false) -### addMocksToSchema +For more information about how to use the `mockServer` function, see the [Medium Post about mocking](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd). + +### addMocksToSchema(schema, mocks = {}, preserveResolvers = false) + +`addMocksToSchema` is the function that `mockServer` uses under the hood. Given an instance of GraphQLSchema and a mock object, it modifies the schema in place to return mock data for any valid query that is sent to the server. If `mocks` is not passed, the defaults will be used for each of the scalar types. If `preserveResolvers` is set to `true`, existing resolve functions will not be overwritten to provide mock data. This can be used to mock some parts of the server and not others. ## Logging and performance profiling coming soon ... +## Authentication and authorization + +coming soon ... + ## Connectors +Connectors are the parts that connect the GraphQL server to various backends, such as MySQL servers, MongoDB, Redis, REST, etc. The stores may be on the same server or on a different server, and the same GraphQL server may access a variety of different backend stores to get the data for just one request. + +Resolve functions act as a sort of switchboard, defining which connector should be used for which GraphQL types, and what arguments should be passed to it. While resolve functions should be stateless, connectors need to be stateful in many cases, for example to store information about the currently logged in user, or manage connections with the backend store. Because the same connector may be used in many resolve function, it has to be attached to the context, where all the resolve functions easily have access to it. + +### attachConnectorsToContext(schema, connectors) +`attachConnectorsToContext` takes two arguments: a GraphQLSchema and a `connectors` object that has connector classes as its named properties. The schema is modified in place such that for each query an instance of each connector will be constructed and attached to the context at the beginning of query execution, effectively making it a singleton that can keep state. + +```js +// in connectors.js +import { attachConnectorsToContext } from 'graphql-tools'; + +class AuthorConnector{ + constructor(){ + this.store = new Map() + map.set(1, { id: 1, firstName: 'Bill', lastName: 'Nye' }); + } -* attachConnectorsToContext + get(key){ + return this.store.get(key); + } + set(key, value){ + return this.store.set(key, value); + } +} + +const connectors = { + Author: AuthorConnector, +}; + +attachConnectorsToContext(schema, connectors); + + +// --- in a resolve function --- +resolveAuthor(obj, args, context){ + return context.connectors.Author.get(args.id); +} +``` ## Error handling + error logging GraphQL servers can be tricky to debug. The following functions can help find error faster in many cases. From e9a66621be5578af9f2824c2e4fe8ad3c89d4a75 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 16 Apr 2016 23:39:06 -0700 Subject: [PATCH 051/409] add TODO for section about testing --- docs/source/apollo-server/tools.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 3a873c2ded2..49f713d023e 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -267,6 +267,10 @@ coming soon ... coming soon ... +## Unit- and integration testing + +coming soon ... + ## Connectors Connectors are the parts that connect the GraphQL server to various backends, such as MySQL servers, MongoDB, Redis, REST, etc. The stores may be on the same server or on a different server, and the same GraphQL server may access a variety of different backend stores to get the data for just one request. From b01c79f944e83952c1d597f774737b7c8373e6cf Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 18 Apr 2016 10:35:50 -0700 Subject: [PATCH 052/409] rename shorthand to GraphQL schema language --- docs/source/apollo-server/tools.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 49f713d023e..a1f098b0419 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -45,10 +45,10 @@ apolloServer({ The function `apolloServer` wraps the `graphqlHTTP` middleware from `express-graphql`. If you replace an existing call to `graphqlHTTP` with a call to `apolloServer`, the resulting express middleware will behave in exactly the same way. For the documentation of the graphqlHTTP arguments, refer to the express-graphql [documentation](https://github.com/graphql/express-graphql#options). **schema** -In place of a GraphQLSchema, `apolloServer` also accepts an array of GraphQL shorthand type definitions as described in [Schema creation](#Schema-creation). +In place of a GraphQLSchema, `apolloServer` also accepts an array of GraphQL schema language type definitions as described in [Schema creation](#Schema-creation). **resolvers** -Resolvers is a required option if the schema provided to `apolloServer` is in shorthand GraphQL schema language. If defined, the option `resolvers` expects an Object that defines a resolve function for each non-scalar field of every type defined in the schema. Fields that take arguments also require a resolve function. A simple example defining a single resolve function for the `author` field of the `RootQuery` type is given below. A more detailed description is given in [Resolve functions](#Resolve-functions). Resolve functions should be stateless. +Resolvers is a required option if the schema provided to `apolloServer` is in GraphQL schema language. If defined, the option `resolvers` expects an Object that defines a resolve function for each non-scalar field of every type defined in the schema. Fields that take arguments also require a resolve function. A simple example defining a single resolve function for the `author` field of the `RootQuery` type is given below. A more detailed description is given in [Resolve functions](#Resolve-functions). Resolve functions should be stateless. ```js const resolvers = { @@ -137,7 +137,7 @@ If execution should not continue, resolve functions should return `null` and not ## Schema creation -The graphql-tools package allows you to create a GraphQLSchema object from shorthand schema language by using the function `createSchema`. +The graphql-tools package allows you to create a GraphQLSchema object from GraphQL schema language by using the function `createSchema`. ### createSchema(typeDefinitions) **Function signature** @@ -147,7 +147,7 @@ import { createSchema } from 'graphql-tools'; const jsSchema = createSchema(typeDefinitions); ``` -`typeDefinitions` should be an array of shorthand schema strings or a function that takes no arguments and returns an array of shorthand schema strings. The order of the strings in the array is not important, but it must include a schema definition. The schema must define a query type, which means a minimal schema would look something like this: +`typeDefinitions` should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. The schema must define a query type, which means a minimal schema would look something like this: ```js const typeDefinition = [` schema { @@ -208,7 +208,7 @@ export default createSchema([SchemaDefinition, RootQuery, Author]); ## Resolve functions -In order to respond to queries, a schema needs to have resolve functions. Resolve functions cannot be included in the shorthand schema notation, so they must be added separately. +In order to respond to queries, a schema needs to have resolve functions. Resolve functions cannot be included in the GraphQL schema language, so they must be added separately. ### addResolveFunctionsToSchema(schema, resolveFunctions) @@ -244,7 +244,7 @@ const resolveFunctions = { }, }; ``` -Note that if the types were defined in shorthand schema notation, the `info` argument to `resolveType` must be used to get a reference to the actual type, eg. `return info.schema.getType("Person")`. This may be changed in the future to support returning just the name of the type, eg. `return "Person"`. +Note that if the types were defined in GraphQL schema language, the `info` argument to `resolveType` must be used to get a reference to the actual type, eg. `return info.schema.getType("Person")`. This may be changed in the future to support returning just the name of the type, eg. `return "Person"`. ### addSchemaLevelResolver(schema, rootResolveFunction) Some operations, such as authentication, need to be done only once per query. Logically, these operations belong in a root resolve function, but unfortunately GraphQL-JS does not let you define one. `addSchemaLevelResolver` solves this by modifying the GraphQLSchema that is passed as the first argument. From 079c02dc80040bc92fea0d330c15c27da81f3a6a Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 18 Apr 2016 10:39:10 -0700 Subject: [PATCH 053/409] clarify that we're using GraphQL schema language --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index f753d0fbc40..cb8fde757d4 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -35,7 +35,7 @@ If you already have an express server or a GraphQL server set up, then you can a ## Schema -If you open the `data` folder in the project directory, you will see the file `schema.js` which defines the schema your server currently uses: +If you open the `data` folder in the project directory, you will see the file `schema.js` which defines the schema your server currently uses in GraphQL schema language: ```js const typeDefinitions = ` type Query { From 3cf89ce1fa192856e28960b0244db57e257b6d78 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 18 Apr 2016 10:50:37 -0700 Subject: [PATCH 054/409] add link to @sogko 's cheat sheet --- docs/source/apollo-server/guide.md | 2 +- docs/source/apollo-server/tools.md | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index cb8fde757d4..eef1239f673 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -103,7 +103,7 @@ schema { export default [typeDefinitions]; ``` -For more information about GraphQL's type system and schema language, you can read the [Schema definition subsection in the Tools chapter](http://localhost:4000/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). +For more information about GraphQL's type system and schema language, you can take a look at this [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](http://localhost:4000/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). ## Mocking diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index a1f098b0419..6e8005ff590 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -137,7 +137,7 @@ If execution should not continue, resolve functions should return `null` and not ## Schema creation -The graphql-tools package allows you to create a GraphQLSchema object from GraphQL schema language by using the function `createSchema`. +The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `createSchema`. ### createSchema(typeDefinitions) **Function signature** @@ -206,6 +206,8 @@ const SchemaDefinition = ` export default createSchema([SchemaDefinition, RootQuery, Author]); ``` +This [GraphQL schema language cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png) by Hafiz Ismail is an excellent reference for all the features of the GraphQL schema language. + ## Resolve functions In order to respond to queries, a schema needs to have resolve functions. Resolve functions cannot be included in the GraphQL schema language, so they must be added separately. From 51d6fc3a269751510694734f6ff0022853622fa7 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 18 Apr 2016 10:51:26 -0700 Subject: [PATCH 055/409] minor edit --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index eef1239f673..bbd9fef6dd6 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -103,7 +103,7 @@ schema { export default [typeDefinitions]; ``` -For more information about GraphQL's type system and schema language, you can take a look at this [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](http://localhost:4000/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). +For more information about GraphQL's type system and schema language, you can take a look at the [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](http://localhost:4000/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). ## Mocking From 6faeb8708ddfc5b0ec9de43fd02a4cbd6aa565c3 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 18 Apr 2016 10:54:07 -0700 Subject: [PATCH 056/409] update cheat sheet mention --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index bbd9fef6dd6..fbe4c43182c 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -103,7 +103,7 @@ schema { export default [typeDefinitions]; ``` -For more information about GraphQL's type system and schema language, you can take a look at the [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](http://localhost:4000/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). +For more information about GraphQL's type system and schema language, you can take a look at @sogko's [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](http://localhost:4000/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). ## Mocking From 0f6e435a4cdc087c839ab7c42c96258396071e7f Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 18 Apr 2016 13:34:28 -0700 Subject: [PATCH 057/409] Rename to tutorial --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index fbe4c43182c..d133f8134de 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -1,5 +1,5 @@ --- -title: GraphQL server guide +title: GraphQL server tutorial order: 202 description: These are Apollo Docs!! --- From 4e4b3c286b986c23a8c5a798d774d8700d8c2a6f Mon Sep 17 00:00:00 2001 From: Dan Ahmadi Date: Mon, 18 Apr 2016 15:02:02 -0700 Subject: [PATCH 058/409] Installed Segment.io (#17) * Installed Segment.io * Update to new theme --- docs/_config.yml | 3 +-- themes/meteor | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index 30998406905..db47acd6c86 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -37,8 +37,7 @@ favicon: /logo/square.png # API keys apis: - ga: UA-74643563-2 - marketo: 627-RVJ-941 + segment: wgrIo8Bul0Ujl8USETG3DB6hONdy4kTg # URL ## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' diff --git a/themes/meteor b/themes/meteor index f6333f5c251..802f78cdbba 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit f6333f5c251f1acf3929fac7ee3da791d15077be +Subproject commit 802f78cdbba3be3bddea30ab4e9b33715955d377 From c4cccf89505a9fb99bbf365495467eb1fcf206aa Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 18 Apr 2016 17:24:23 -0700 Subject: [PATCH 059/409] Clarify imports work in TypeScript --- docs/source/apollo-client/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 1589db007cb..16ab73eb6dc 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -28,6 +28,7 @@ Instantiate a new Apollo Client. Here's how you would instantiate a default client that points to `/graphql`: ```js +// In ES2015 or TypeScript import ApolloClient from 'apollo-client'; const client = new ApolloClient(); @@ -36,6 +37,7 @@ const client = new ApolloClient(); If you're not using ES2015, you can also load it with `require`: ```js +// In plain JavaScript var ApolloClient = require('apollo-client').default; ``` From 24838cbf3748ebecc72c29437a7272b337930c7b Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 18 Apr 2016 17:45:54 -0700 Subject: [PATCH 060/409] Document new 0.1.0 observable API --- docs/source/apollo-client/index.md | 55 ++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 16ab73eb6dc..7010a1b89b1 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -179,26 +179,39 @@ client.query({

ApolloClient#watchQuery(options)

-Run a GraphQL query and return a `WatchedQueryHandle` that is updated as the query result in the store changes. +Run a GraphQL query and return a QueryObservable that is updated as the query result in the store changes. - `query: string` A GraphQL query string to fetch. - `variables: Object` The variables to pass along with the query. - `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. - `returnPartialData: boolean` (Optional, default is `false`) If false, wait until the query has finished the initial load from the server to return any data. If true, return any data we might happen to already have in the store immediately. If you pass true for this option, your UI should be ready to deal with the possibility that it will get a partial result at first. -

WatchedQueryHandle

+

QueryObservable

-This is the object you get when you call `watchQuery`. It has some helpful properties and functions you can use to read data from your query and manipulate it: +This is the object you get when you call `watchQuery`. It has just one method, `subscribe`, to which you can pass a `QueryObserver` object: -- `onResult(callback)` Register a callback to be called whenever this query has new data. -- `stop()` Tell the client we are no longer interested in results for this query, and that it can be cleaned up. Any callbacks previously registered with `onResult` will no longer be called. Note that if you don't call this function when you're done with the query, it will never be cleaned up, which could result in a memory leak. Any view layer integration should make sure to call this when UI components that asked for data are unrendered. -- `isStopped(): boolean` Find out if this query has been stopped. -- XXX onError, isLoading, getResult, getError should be added +- `subscribe(observer: QueryObserver)` Pass an observer object which gets called when there is new data. Returns a `QuerySubscription` object which you can use to unsubscribe or refetch. -Here's how you could run a query and then watch the result: +

interface QueryObserver

+ +The object you pass into `QueryObservable#subscribe`. Includes optional callbacks to receive results: + +- `next(result: GraphQLResult)` Called when there is a new result for the query. +- `error(error: Error)` Called when there is a network error for the query. + +

QuerySubscription

+ +The object returned from `QueryObservable#subscribe`. Includes two methods: + +- `refetch()` Refetch this query from the server. Think of it like a refresh button. +- `unsubscribe()` Notify the client to no longer care about this query. After this is called, none of the callbacks on the observer will be fired anymore. + +#### Code sample + +All of the concepts above seem a bit complicated, but it's not hard to use in practice. Here's how you could run a query and then watch the result: ```js -const handle = client.watchQuery({ +const queryObservable = client.watchQuery({ query: ` query getCategory($categoryId: Int!) { category(id: $categoryId) { @@ -214,22 +227,28 @@ const handle = client.watchQuery({ returnPartialData: true, }); -handle.onResult((graphQLResult) => { - const { errors, data } = graphQLResult; +const subscription = queryObservable.subscribe({ + next: (graphQLResult) => { + const { errors, data } = graphQLResult; - if (data) { - console.log('got data', data); - } + if (data) { + console.log('got data', data); + } - if (errors) { - console.log('got some GraphQL execution errors', errors); + if (errors) { + console.log('got some GraphQL execution errors', errors); + } + }, + error: (error) => { + console.log('there was an error sending the query', error); } }); -// XXX onError +// Refetch the query if we want an updated result +subscription.refetch(); // Call when we're done watching this query -handle.stop(); +subscription.unsubscribe(); ``` ## Mutations From bec6955a107f3e422841ccbb065aa6a08e7d0bf1 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 18 Apr 2016 17:46:45 -0700 Subject: [PATCH 061/409] Emphasize subscribe --- docs/source/apollo-client/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 7010a1b89b1..b232df5402e 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -204,7 +204,7 @@ The object you pass into `QueryObservable#subscribe`. Includes optional callback The object returned from `QueryObservable#subscribe`. Includes two methods: - `refetch()` Refetch this query from the server. Think of it like a refresh button. -- `unsubscribe()` Notify the client to no longer care about this query. After this is called, none of the callbacks on the observer will be fired anymore. +- `unsubscribe()` Notify the client to no longer care about this query. After this is called, none of the callbacks on the observer will be fired anymore. It's very important to call this when you are done with the query, because that is what lets the client know that it can clean up the data associated with this subscription. The view integrations will do this for you. #### Code sample From 1097ec83b5253d17729a9eaefb41d4e6b79e8520 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 18 Apr 2016 17:55:10 -0700 Subject: [PATCH 062/409] Split out core API --- docs/_config.yml | 1 + .../index.md => source/apollo-client/core.md | 62 +---------------- .../apollo-client/devtools.md | 2 +- source/apollo-client/index.md | 63 ++++++++++++++++++ .../apollo-client/network.md | 2 +- .../source => source}/apollo-client/react.md | 0 .../source => source}/apollo-client/redux.md | 0 .../apollo-server/graphiql-test.png | Bin .../source => source}/apollo-server/guide.md | 0 .../source => source}/apollo-server/index.md | 0 .../source => source}/apollo-server/tools.md | 0 {docs/source => source}/index.md | 0 {docs/source => source}/logo/large.png | Bin {docs/source => source}/logo/square.png | Bin 14 files changed, 69 insertions(+), 61 deletions(-) rename docs/source/apollo-client/index.md => source/apollo-client/core.md (79%) rename {docs/source => source}/apollo-client/devtools.md (98%) create mode 100644 source/apollo-client/index.md rename {docs/source => source}/apollo-client/network.md (99%) rename {docs/source => source}/apollo-client/react.md (100%) rename {docs/source => source}/apollo-client/redux.md (100%) rename {docs/source => source}/apollo-server/graphiql-test.png (100%) rename {docs/source => source}/apollo-server/guide.md (100%) rename {docs/source => source}/apollo-server/index.md (100%) rename {docs/source => source}/apollo-server/tools.md (100%) rename {docs/source => source}/index.md (100%) rename {docs/source => source}/logo/large.png (100%) rename {docs/source => source}/logo/square.png (100%) diff --git a/docs/_config.yml b/docs/_config.yml index db47acd6c86..73b220d9f79 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -16,6 +16,7 @@ sidebar_categories: - index Apollo Client: - apollo-client/index + - apollo-client/core - apollo-client/react - apollo-client/redux - apollo-client/network diff --git a/docs/source/apollo-client/index.md b/source/apollo-client/core.md similarity index 79% rename from docs/source/apollo-client/index.md rename to source/apollo-client/core.md index b232df5402e..db884fcad4f 100644 --- a/docs/source/apollo-client/index.md +++ b/source/apollo-client/core.md @@ -1,66 +1,10 @@ --- -title: Client overview +title: Client core API order: 101 -description: Basic information on getting started with and using the Apollo Client. +description: How to use the Apollo Client directly, without a view integration. --- -The Apollo Client can easily be dropped into any JavaScript frontend where you want to use data from a GraphQL server. - -## Installing - -```txt -npm install apollo-client -``` - -To use this client in a web browser or mobile app, you'll need a build system capable of loading NPM packages on the client. Some common choices include Browserify, Webpack, and Meteor 1.3. Move on to the next article to see how to import and initialize the client. - -## Client - -The Apollo Client class is the thing you import from this package, and should be instantiated to communicate with your server. You can instantiate as many clients as you want, but most apps will have exactly one of these. If you want to talk to multiple backends, the right place to do that is in your GraphQL server. - -

new ApolloClient(options)

- -Instantiate a new Apollo Client. - -- `networkInterface: NetworkInterface` (Optional, defaults to an interface that points to `/graphql`) The network interface to use when sending GraphQL queries to the server. -- `reduxRootKey: string` (Optional, `apollo` by default) The key under which Apollo data will be stored in the Redux store. [Read more about integrating with Redux](customization.html#redux). If you aren't integrating with an existing Redux store, don't worry about this. - -Here's how you would instantiate a default client that points to `/graphql`: - -```js -// In ES2015 or TypeScript -import ApolloClient from 'apollo-client'; - -const client = new ApolloClient(); -``` - -If you're not using ES2015, you can also load it with `require`: - -```js -// In plain JavaScript -var ApolloClient = require('apollo-client').default; -``` - -The rest of the code snippets will use ES2015 import syntax. - -

createNetworkInterface(url, options)

- -Create a new HTTP network interface that points to a GraphQL server at a specific URI. - -- `url: string` The URL of the remote server, for example `https://example.com/graphql`. -- `options: FetchOptions` (Optional) Options that are passed through to `fetch` XXX link to docs - -Here's how you would instantiate a new client with a custom endpoint URL: - -```js -import ApolloClient, { createNetworkInterface } from 'apollo-client'; - -const networkInterface = createNetworkInterface('https://example.com/graphql'); - -const client = new ApolloClient({ - networkInterface, -}); -``` +Most of the time, when you use the Apollo Client, you'll do it through one of the view layer integrations. But sometimes, you just want to fetch some data directly and use it in your application logic, or your preferred view technology doesn't have an integration package.

Queries

diff --git a/docs/source/apollo-client/devtools.md b/source/apollo-client/devtools.md similarity index 98% rename from docs/source/apollo-client/devtools.md rename to source/apollo-client/devtools.md index e864b6dedd4..24fea8674e9 100644 --- a/docs/source/apollo-client/devtools.md +++ b/source/apollo-client/devtools.md @@ -1,6 +1,6 @@ --- title: Developer tools -order: 141 +order: 142 description: How to use extensions and developer tools to get insight into what your app is doing. --- diff --git a/source/apollo-client/index.md b/source/apollo-client/index.md new file mode 100644 index 00000000000..a85e2fb1bea --- /dev/null +++ b/source/apollo-client/index.md @@ -0,0 +1,63 @@ +--- +title: Client overview +order: 100 +description: Basic information on getting started with and using the Apollo Client. +--- + +The Apollo Client can easily be dropped into any JavaScript frontend where you want to use data from a GraphQL server. + +## Installing + +```txt +npm install apollo-client +``` + +To use this client in a web browser or mobile app, you'll need a build system capable of loading NPM packages on the client. Some common choices include Browserify, Webpack, and Meteor 1.3. Move on to the next article to see how to import and initialize the client. + +## Initializing + +The Apollo Client class is the thing you import from this package, and should be instantiated to communicate with your server. You can instantiate as many clients as you want, but most apps will have exactly one of these. If you want to talk to multiple backends, the right place to do that is in your GraphQL server. + +

new ApolloClient(options)

+ +Instantiate a new Apollo Client. + +- `networkInterface: NetworkInterface` (Optional, defaults to an interface that points to `/graphql`) The network interface to use when sending GraphQL queries to the server. +- `reduxRootKey: string` (Optional, `apollo` by default) The key under which Apollo data will be stored in the Redux store. [Read more about integrating with Redux](customization.html#redux). If you aren't integrating with an existing Redux store, don't worry about this. + +Here's how you would instantiate a default client that points to `/graphql`: + +```js +// In ES2015 or TypeScript +import ApolloClient from 'apollo-client'; + +const client = new ApolloClient(); +``` + +If you're not using ES2015, you can also load it with `require`: + +```js +// In plain JavaScript +var ApolloClient = require('apollo-client').default; +``` + +The rest of the code snippets will use ES2015 import syntax. + +

createNetworkInterface(url, options)

+ +Create a new HTTP network interface that points to a GraphQL server at a specific URI. + +- `url: string` The URL of the remote server, for example `https://example.com/graphql`. +- `options: FetchOptions` (Optional) Options that are passed through to `fetch` XXX link to docs + +Here's how you would instantiate a new client with a custom endpoint URL: + +```js +import ApolloClient, { createNetworkInterface } from 'apollo-client'; + +const networkInterface = createNetworkInterface('https://example.com/graphql'); + +const client = new ApolloClient({ + networkInterface, +}); +``` diff --git a/docs/source/apollo-client/network.md b/source/apollo-client/network.md similarity index 99% rename from docs/source/apollo-client/network.md rename to source/apollo-client/network.md index a8083c925b2..cd07b6d467c 100644 --- a/docs/source/apollo-client/network.md +++ b/source/apollo-client/network.md @@ -1,6 +1,6 @@ --- title: Network layer -order: 140 +order: 141 description: How to point your Apollo client to a different GraphQL server, or use a totally different protocol. --- diff --git a/docs/source/apollo-client/react.md b/source/apollo-client/react.md similarity index 100% rename from docs/source/apollo-client/react.md rename to source/apollo-client/react.md diff --git a/docs/source/apollo-client/redux.md b/source/apollo-client/redux.md similarity index 100% rename from docs/source/apollo-client/redux.md rename to source/apollo-client/redux.md diff --git a/docs/source/apollo-server/graphiql-test.png b/source/apollo-server/graphiql-test.png similarity index 100% rename from docs/source/apollo-server/graphiql-test.png rename to source/apollo-server/graphiql-test.png diff --git a/docs/source/apollo-server/guide.md b/source/apollo-server/guide.md similarity index 100% rename from docs/source/apollo-server/guide.md rename to source/apollo-server/guide.md diff --git a/docs/source/apollo-server/index.md b/source/apollo-server/index.md similarity index 100% rename from docs/source/apollo-server/index.md rename to source/apollo-server/index.md diff --git a/docs/source/apollo-server/tools.md b/source/apollo-server/tools.md similarity index 100% rename from docs/source/apollo-server/tools.md rename to source/apollo-server/tools.md diff --git a/docs/source/index.md b/source/index.md similarity index 100% rename from docs/source/index.md rename to source/index.md diff --git a/docs/source/logo/large.png b/source/logo/large.png similarity index 100% rename from docs/source/logo/large.png rename to source/logo/large.png diff --git a/docs/source/logo/square.png b/source/logo/square.png similarity index 100% rename from docs/source/logo/square.png rename to source/logo/square.png From f36a1fa800d7301d5e293367644a43c144539d2a Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 18 Apr 2016 17:51:06 -0700 Subject: [PATCH 063/409] fix code examples --- {source => docs/source}/apollo-client/core.md | 0 .../source}/apollo-client/devtools.md | 0 .../source}/apollo-client/index.md | 0 .../source}/apollo-client/network.md | 0 .../source}/apollo-client/react.md | 0 .../source}/apollo-client/redux.md | 0 .../source}/apollo-server/graphiql-test.png | Bin .../source}/apollo-server/guide.md | 19 ++++++++++-------- .../source}/apollo-server/index.md | 0 .../source}/apollo-server/tools.md | 0 {source => docs/source}/index.md | 0 {source => docs/source}/logo/large.png | Bin {source => docs/source}/logo/square.png | Bin 13 files changed, 11 insertions(+), 8 deletions(-) rename {source => docs/source}/apollo-client/core.md (100%) rename {source => docs/source}/apollo-client/devtools.md (100%) rename {source => docs/source}/apollo-client/index.md (100%) rename {source => docs/source}/apollo-client/network.md (100%) rename {source => docs/source}/apollo-client/react.md (100%) rename {source => docs/source}/apollo-client/redux.md (100%) rename {source => docs/source}/apollo-server/graphiql-test.png (100%) rename {source => docs/source}/apollo-server/guide.md (97%) rename {source => docs/source}/apollo-server/index.md (100%) rename {source => docs/source}/apollo-server/tools.md (100%) rename {source => docs/source}/index.md (100%) rename {source => docs/source}/logo/large.png (100%) rename {source => docs/source}/logo/square.png (100%) diff --git a/source/apollo-client/core.md b/docs/source/apollo-client/core.md similarity index 100% rename from source/apollo-client/core.md rename to docs/source/apollo-client/core.md diff --git a/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md similarity index 100% rename from source/apollo-client/devtools.md rename to docs/source/apollo-client/devtools.md diff --git a/source/apollo-client/index.md b/docs/source/apollo-client/index.md similarity index 100% rename from source/apollo-client/index.md rename to docs/source/apollo-client/index.md diff --git a/source/apollo-client/network.md b/docs/source/apollo-client/network.md similarity index 100% rename from source/apollo-client/network.md rename to docs/source/apollo-client/network.md diff --git a/source/apollo-client/react.md b/docs/source/apollo-client/react.md similarity index 100% rename from source/apollo-client/react.md rename to docs/source/apollo-client/react.md diff --git a/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md similarity index 100% rename from source/apollo-client/redux.md rename to docs/source/apollo-client/redux.md diff --git a/source/apollo-server/graphiql-test.png b/docs/source/apollo-server/graphiql-test.png similarity index 100% rename from source/apollo-server/graphiql-test.png rename to docs/source/apollo-server/graphiql-test.png diff --git a/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md similarity index 97% rename from source/apollo-server/guide.md rename to docs/source/apollo-server/guide.md index d133f8134de..c21e12730aa 100644 --- a/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -74,7 +74,7 @@ type Post { # the schema allows the following two queries: type RootQuery { - author(firstName: String, lastName: String): User + author(firstName: String, lastName: String): Author posts(tag: String): [Post] } @@ -127,6 +127,7 @@ We're going to modify that now to create more realistic mock data. In order to d ```js import { MockList } from 'graphql-tools'; +import casual from 'casual'; const mocks = { Int: () => casual.integer(1,1000), @@ -136,19 +137,21 @@ const mocks = { posts: () => new MockList([1,6]), }), Post: () => ({ - tags: () => new MockList([1,3]), + tags: () => new MockList([1,3], () => casual.word), title: () => casual.title, - text: () => casual.sentences(4) - }) + text: () => casual.sentences(4), + }), RootQuery: () => ({ author: (o, args) => { if (casual.integer(1,10) > 8){ return null; } return { ...args }; - } - }) -} + }, + }), +}; + +export default mocks; ``` Go ahead and give the server a try with the new mocks. If all went well, you should be able to run the following query and get a similar result. @@ -166,7 +169,7 @@ You can read more about mocking with graphql-tools in our [Medium Post on mockin Without resolve functions, our GraphQL server can only return mock data. To make it return real data and persist the effect of mutations, you have to define resolve functions. Resolve functions tell the server how to find and return the data for each field in the query. -It's probably easiest to explain this with an example: +It's probably easiest to explain this with an example query: ``` { author(firstName: "Jonas"){ diff --git a/source/apollo-server/index.md b/docs/source/apollo-server/index.md similarity index 100% rename from source/apollo-server/index.md rename to docs/source/apollo-server/index.md diff --git a/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md similarity index 100% rename from source/apollo-server/tools.md rename to docs/source/apollo-server/tools.md diff --git a/source/index.md b/docs/source/index.md similarity index 100% rename from source/index.md rename to docs/source/index.md diff --git a/source/logo/large.png b/docs/source/logo/large.png similarity index 100% rename from source/logo/large.png rename to docs/source/logo/large.png diff --git a/source/logo/square.png b/docs/source/logo/square.png similarity index 100% rename from source/logo/square.png rename to docs/source/logo/square.png From ce440c878e48b98a69317f094dcfa970a6affac5 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 18 Apr 2016 19:07:38 -0700 Subject: [PATCH 064/409] fix code and explanations, write section about connectors --- docs/source/apollo-server/guide.md | 128 ++++++++++++++++++++++++++--- 1 file changed, 117 insertions(+), 11 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index c21e12730aa..fc64c344bb6 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -75,7 +75,7 @@ type Post { # the schema allows the following two queries: type RootQuery { author(firstName: String, lastName: String): Author - posts(tag: String): [Post] + fortuneCookie: String } # this schema allows the following two mutations: @@ -183,36 +183,142 @@ To respond to this query, the server will first run the resolve function for the Resolve functions are defined in the 'data/resolvers.js' file, and the format is quite straight-forward, defining a resolve function for each field. ```js +import { Author, Post, View, FortuneCookie } from './connectors'; const resolveFunctions = { RootQuery: { author(_, { firstName, lastName }){ - return Authors.findOne({ firstName: firstName, lastName: lastName }); + return Author.find({ where: { firstName, lastName } }); }, - posts(_, { tag }){ - return Posts.where( tag in tags); // TODO TK + fortuneCookie(){ + return FortuneCookie.getOne(); + }, + }, + RootMutation: { + createAuthor: (root, args) => { return Author.create(args); }, + createPost: (root, { authorId, tags, title, text }) => { + return Author.findOne({ where: { id: authorId } }).then( (author) => { + return author.createPost( { tags: tags.join(','), title, text }); + }); }, }, Author: { posts(author){ - return Author.get(author.id).getPosts(); + return author.getPosts(); }, }, - Posts: { + Post: { author(post){ - return Author.get(post.authorId); + return post.getAuthor(); + }, + tags(post){ + return post.tags.split(','); + }, + views(post){ + return View.findOne({ postId: post.id }).then( (res) => res.views ); } } } + +export default resolveFunctions; ``` -Not every field needs a resolve function. In the example above, `Author.firstName` doesn't have a resolve function, because the value is already on the Author object that the `RootQuery.author` resolve function returned: If the schema doesn't define a resolve function for a field, the server will try to apply the default resolve function, which looks for the property on the input value that has the same name as the field. +Not every field needs a resolve function. In the example above, `Author.firstName` doesn't have a resolve function, because the value is already on the Author object that the `RootQuery.author` resolve function returned. If the schema doesn't define a resolve function for a field, the server will try to apply the default resolve function, which looks for the property on the input value that has the same name as the field. + +Resolve functions should be kept as simple as possible, complicated logic should be encoded in the connectors, which is why the resolve functions on their own will not do anything useful. + +In order for the server to use the resolve functions instead of the mocked schema, mocks has to be commented out from `server.js`: + +```js +import express from 'express'; +import { apolloServer } from 'graphql-tools'; +import Schema from './data/schema'; +import Mocks from './data/mocks'; +import Resolvers from './data/resolvers'; + +const GRAPHQL_PORT = 8080; + +var graphQLServer = express(); +graphQLServer.use('/', apolloServer({ + graphiql: true, + pretty: true, + schema: Schema, + resolvers: Resolvers, + //mocks: Mocks, +})); +graphQLServer.listen(GRAPHQL_PORT, () => console.log( + `GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}` +)); +``` ## Connectors +Connectors are used to connect the GraphQL resolve functions to a backend that stores the actual data. GraphQL doesn't have any opinion when it comes to how the data is actually stored, so it can be used with MySQL, Postgres, MongoDB, RethinkDB, HFS, S3, Redis, Memcache, REST services and pretty much anything that can communicate over the network or a socket. You can also store things in memory or on disk on your GraphQL server. Anything is possible. + +The example below uses three different connectors: Sequelize for SQL, Mongoose for MongoDB and a REST service. The GraphQL schema language file and resolve functions define how these connectors get integrated into a single schema. + +```js +import Sequelize from 'sequelize'; +import Mongoose from 'mongoose'; +import casual from 'casual'; +import rp from 'request-promise'; + +// SQL tables +const db = new Sequelize('blog', null, null, { + dialect: 'sqlite', + storage: './blog.sqlite' +}); -### SQL +const AuthorModel = db.define('author', { + firstName: { + type: Sequelize.STRING, + }, + lastName: { + type: Sequelize.STRING, + }, +}); + +const PostModel = db.define('post', { + title: { + type: Sequelize.STRING, + }, + text: { + type: Sequelize.STRING, + }, + tags: { + type: Sequelize.STRING, + } +}); + +// foreign key relationships +AuthorModel.hasMany(PostModel); +PostModel.belongsTo(AuthorModel); + +const Author = db.models.author; +const Post = db.models.post; -### MongoDB +// MongoDB table +const mongo = Mongoose.connect('mongodb://localhost/views'); + +const ViewSchema = Mongoose.Schema({ + postId: Number, + views: Number, +}) + +const View = Mongoose.model('views', ViewSchema); + +// REST backend / service +const FortuneCookie = { + getOne(){ + return rp('http://fortunecookieapi.com/v1/cookie') + .then((res) => JSON.parse(res)) + .then((res) => { + return res[0].fortune.message; + }); + }, +}; + +export { Author, Post, View, FortuneCookie }; +``` -### REST / HTTP +In this example, we used the Sequelize and Mongoose ORMs for interacting with the SQL and MongoDB databases, but depending on the application this may not be necessary. From 2d8d2255b5922a077c0506f062325961af89a403 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 18 Apr 2016 19:28:56 -0700 Subject: [PATCH 065/409] explain connectors a bit more --- docs/source/apollo-server/guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index fc64c344bb6..74663608304 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -225,7 +225,7 @@ export default resolveFunctions; Not every field needs a resolve function. In the example above, `Author.firstName` doesn't have a resolve function, because the value is already on the Author object that the `RootQuery.author` resolve function returned. If the schema doesn't define a resolve function for a field, the server will try to apply the default resolve function, which looks for the property on the input value that has the same name as the field. -Resolve functions should be kept as simple as possible, complicated logic should be encoded in the connectors, which is why the resolve functions on their own will not do anything useful. +As a general rule of thumb, resolve functions should only use connectors and not depend on any external libraries. They should be kept as simple as possible, and any complicated logic should be moved into a connector, which is why the resolve functions on their own will not do anything without the corresponding connectors. In order for the server to use the resolve functions instead of the mocked schema, mocks has to be commented out from `server.js`: @@ -321,4 +321,4 @@ const FortuneCookie = { export { Author, Post, View, FortuneCookie }; ``` -In this example, we used the Sequelize and Mongoose ORMs for interacting with the SQL and MongoDB databases, but depending on the application this may not be necessary. +In this example, we used the Sequelize and Mongoose ORMs for interacting with the SQL and MongoDB databases, but using an ORM is not required. ORMs just happen to be useful here, because they offer a higher-level abstraction on top of the database technology, which makes them easier to use in resolve functions. From 1a0b9bbd823b724bafa26783a12595329643852e Mon Sep 17 00:00:00 2001 From: James Baxley Date: Mon, 18 Apr 2016 22:52:29 -0400 Subject: [PATCH 066/409] copied docs from react-apollo readme (#18) --- docs/source/apollo-client/react.md | 176 ++++++++++++++++++++++++++++- 1 file changed, 175 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 5a0347d28a8..94b19cadaf6 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -4,4 +4,178 @@ order: 110 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- -TODO +### Provider + +Injects an ApolloClient instance into a React view tree. You can use it instead of the Redux `Provider`, if you want to. But you don't have to: + +Basic Apollo version: + +```js +import ApolloClient from 'apollo-client'; +import { Provider } from 'apollo-react'; + +const client = new ApolloClient(); + +ReactDOM.render( + + + , + rootEl +) +``` + +With an existing Redux store: + +```js +import { createStore, combineReducers, applyMiddleware } from 'redux'; +import ApolloClient from 'apollo-client'; +import { Provider } from 'apollo-react'; + +import { todoReducer, userReducer } from './reducers'; + +const client = new ApolloClient(); + +const store = createStore( + combineReducers({ + todos: todoReducer, + users: userReducer, + apollo: client.reducer(), + }), + applyMiddleware(client.middleware()) +); + +ReactDOM.render( + + + , + rootEl +) +``` + +The wrapper is called `Provider` because in the base case you can use it instead of the Redux provider or you can use it as an Apollo enhanced Redux Provider. + +### connect + +Works like Redux `connect`, but supports two more properties: + +- `mapQueriesToProps` to connect GraphQL queries to fetch data +- `mapMutationsToProps` to connect mutations with your components + +It also uses keyword arguments instead of positional arguments, since that lets you more easily omit certain fields when you don't need them. + +Basic Apollo version: + +```js +import { connect } from 'apollo-react'; + +import Category from '../components/Category'; + +function mapQueriesToProps({ ownProps, state }) { + return { + category: { + query: ` + query getCategory($categoryId: Int!) { + category(id: $categoryId) { + name + color + } + } + `, + variables: { + categoryId: 5, + }, + forceFetch: false, + returnPartialData: true, + }, + }; +}; + +function mapMutationsToProps({ ownProps, state }) { + return { + postReply: (raw) => ({ + mutation: ` + mutation postReply( + $topic_id: ID! + $category_id: ID! + $raw: String! + ) { + createPost( + topic_id: $topic_id + category: $category_id + raw: $raw + ) { + id + cooked + } + } + `, + variables: { + // Use the container component's props + topic_id: ownProps.topic_id, + + // Use the redux state + category_id: state.selectedCategory, + + // Use an argument passed from the triggering of the mutation + raw, + } + }), + }; +}; + +const CategoryWithData = connect({ + mapQueriesToProps, + mapMutationsToProps, +})(Category); + +export default CategoryWithData; +``` + +Each key on the object returned by mapQueriesToProps should be made up of the same possible arguments as [`ApolloClient#watchQuery`](http://docs.apollostack.com/apollo-client/index.html#watchQuery). In this case, the `Category` component will get a prop called `category`, which has the following keys: + +```js +{ + loading: boolean, + error: Error, + result: GraphQLResult, + refetch: Function +} +``` + +`mapMutationsToProps` returns an object made up of keys and values that are custom functions to call the mutation. These can be used in children components (for instance, on a event handler) to trigger the mutation. The resulting function must return the same possible arguents as [`ApolloClient#mutate`](http://docs.apollostack.com/apollo-client/index.html#mutate). In this case, the `Category` component will get a prop called `postReply`, which has the following keys: + +```js +{ + loading: boolean, + error: Error, + result: GraphQLResult, +} +``` + +The `Category` component will also get a prop of `mutations` that will have a key of `postReply`. This key is the method that triggers the mutation and can take custom arguments (e.g. `this.props.mutations.postReply('Apollo and React are really great!')`). These arguments are passed to the method that creates the mutation. + +### Additional Props + +Redux's connect will pass `dispatch` as a prop unless action creators are passed using `mapDisptachToProps`. Likewise, the Apollo connect exposes part of the apollo-client api to props under the keys `query` and `mutate`. These correspond to the Apollo methods and can be used for custom needs outside of the ability of the wrapper component. + +### Using in concert with Redux + +```js +// ... same as above + +function mapStateToProps({ state, ownProps }) { + return { + selectedCategory: state.selectedCategory, + } +} + +const CategoryWithData = connect({ + mapQueriesToProps, + mapMutationsToProps, + mapStateToProps, +})(Category); + +export default CategoryWithData; +``` + +In this case, `CategoryWithData` gets two props: `category` and `selectedCategory`. From 4d341b527f294716ebf349dcec3343b82f0bcd33 Mon Sep 17 00:00:00 2001 From: James Baxley Date: Mon, 18 Apr 2016 23:56:05 -0400 Subject: [PATCH 067/409] update docs for apollo-react (#20) --- docs/source/apollo-client/react.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 94b19cadaf6..174238430b9 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -118,7 +118,7 @@ function mapMutationsToProps({ ownProps, state }) { // Use an argument passed from the triggering of the mutation raw, - } + }, }), }; }; @@ -154,6 +154,31 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa The `Category` component will also get a prop of `mutations` that will have a key of `postReply`. This key is the method that triggers the mutation and can take custom arguments (e.g. `this.props.mutations.postReply('Apollo and React are really great!')`). These arguments are passed to the method that creates the mutation. +One typical pattern is wanting to refetch a query after a mutation has happened. In this example, `this.props.mutations.postReply`is a method that returns the mutation promise. Since queries pass a `refetch` prop, this can be accomplished like so: + +```js + +@connect({ mapMutationsToProps, mapQueriesToProps }) +class Container extends React.Component{ + componentDidMount() { + // call the muation + this.props.mutations.makeListPrivate() + .then((err, data) => { + // if we have the data we want + if (data.id) { + // refetch the categories query + this.props.categories.refetch(); + }; + }); + } + + render() { + return
; + } +}; + +``` + ### Additional Props Redux's connect will pass `dispatch` as a prop unless action creators are passed using `mapDisptachToProps`. Likewise, the Apollo connect exposes part of the apollo-client api to props under the keys `query` and `mutate`. These correspond to the Apollo methods and can be used for custom needs outside of the ability of the wrapper component. From fa6df0741a45acd3d779dc4a187752129c59ae36 Mon Sep 17 00:00:00 2001 From: James Baxley Date: Tue, 19 Apr 2016 01:14:10 -0400 Subject: [PATCH 068/409] use h2's for navigation (#21) --- docs/source/apollo-client/react.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 174238430b9..e1bd8bab4c0 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -4,7 +4,7 @@ order: 110 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- -### Provider +

Provider

Injects an ApolloClient instance into a React view tree. You can use it instead of the Redux `Provider`, if you want to. But you don't have to: @@ -54,7 +54,8 @@ ReactDOM.render( The wrapper is called `Provider` because in the base case you can use it instead of the Redux provider or you can use it as an Apollo enhanced Redux Provider. -### connect +

Connect

+ Works like Redux `connect`, but supports two more properties: @@ -179,11 +180,13 @@ class Container extends React.Component{ ``` -### Additional Props +

Additional Props

+ Redux's connect will pass `dispatch` as a prop unless action creators are passed using `mapDisptachToProps`. Likewise, the Apollo connect exposes part of the apollo-client api to props under the keys `query` and `mutate`. These correspond to the Apollo methods and can be used for custom needs outside of the ability of the wrapper component. -### Using in concert with Redux +

Using in concert with Redux

+ ```js // ... same as above From 65462c6d5edbd2da089f37765f31eb67db700bf4 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 00:05:50 -0700 Subject: [PATCH 069/409] Add Meteor integration --- docs/_config.yml | 1 + docs/source/apollo-client/meteor.md | 129 ++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 docs/source/apollo-client/meteor.md diff --git a/docs/_config.yml b/docs/_config.yml index 73b220d9f79..b182b905e13 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -18,6 +18,7 @@ sidebar_categories: - apollo-client/index - apollo-client/core - apollo-client/react + - apollo-client/meteor - apollo-client/redux - apollo-client/network - apollo-client/devtools diff --git a/docs/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md new file mode 100644 index 00000000000..8f918154f0f --- /dev/null +++ b/docs/source/apollo-client/meteor.md @@ -0,0 +1,129 @@ +--- +title: Meteor integration +order: 111 +description: Specifics about using Apollo serve and fetch GraphQL data in your Meteor application. +--- + +The Apollo client and server tools are published on NPM, which makes them available to all JavaScript applications, including those written with Meteor 1.3 and above. When using Meteor with Apollo, there are a few things to keep in mind to integrate the client and server. + +You can see all of these in action in the [Apollo Meteor starter kit](https://github.com/apollostack/meteor-starter-kit). + +## Client + +### Using with Meteor Accounts + +The only thing you need to do on the client to pass through your Meteor login token into the Apollo server is to create a network interface with a header that passes the login token you can get from the Meteor Accounts client. Then just log in as normal and requests sent after that point will be authenticated. + +```js +import ApolloClient, { createNetworkInterface } from 'apollo-client'; +import { Accounts } from 'meteor/accounts-base'; + +const networkInterface = createNetworkInterface('/graphql'); + +networkInterface.use([{ + applyMiddleware(request, next) { + const currentUserToken = Accounts._storedLoginToken(); + + if (!currentUserToken) { + next(); + return; + } + + if (!request.options.headers) { + request.options.headers = new Headers(); + } + + request.options.headers.Authorization = currentUserToken; + + next(); + } +}]); + +const client = new ApolloClient({ + networkInterface, +}); +``` + +## Server + +### Using Express + +The Apollo server, and the Express GraphQL package that it is based on, rely on the Express server-side API framework. To use it, you will need to initialize a new Express server and proxy it to your Meteor `WebApp` server. + +```js +import { apolloServer } from 'graphql-tools'; +import express from 'express'; +import proxyMiddleware from 'http-proxy-middleware'; + +import { schema, resolvers } from '/imports/api/schema'; + +const GRAPHQL_PORT = 4000; + +const graphQLServer = express(); + +graphQLServer.use('/graphql', apolloServer({ + graphiql: true, + pretty: true, + schema, + resolvers, +})); + +graphQLServer.listen(GRAPHQL_PORT, () => console.log( + `GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}` +)); + +// This redirects all requests to /graphql to our Express GraphQL server +WebApp.rawConnectHandlers.use(proxyMiddleware(`http://localhost:${GRAPHQL_PORT}/graphql`)); +``` + +### Getting the current user + +If you are passing in the login token from the client as detailed above, you probably want to get the current user on the server, and use that in your resolvers. To do so, you should make your `apolloServer` options a function of the current request, and use some Meteor packages to get the user from the login token. + +```js +// Some more imports +import { Meteor } from 'meteor/meteor'; +import { Accounts } from 'meteor/accounts-base'; +import { check } from 'meteor/check'; + +// ... same setup code as above + +graphQLServer.use('/graphql', apolloServer(async (req) => { + let user = null; + + // Get the token from the header + if (req.headers.authorization) { + const token = req.headers.authorization; + check(token, String); + const hashedToken = Accounts._hashLoginToken(token); + + // Get the user from the database + user = await Meteor.users.findOne( + {"services.resume.loginTokens.hashedToken": hashedToken}); + } + + return { + graphiql: true, + pretty: true, + schema, + resolvers, + + // Attach the user to the context object + context: { + // The current user will now be available on context.user in all resolvers + user, + }, + }; +})); +``` + +Now, you can use `context.user` from your resolvers: + +```js +user(root, args, context) { + // Only return data if the fetched id matches the current user, for security + if (context.user._id === args.id) { + return context.user; + } +} +``` From 8178b032e7e731ff0c87b4c5d8c6f2af00ec21e9 Mon Sep 17 00:00:00 2001 From: James Baxley Date: Tue, 19 Apr 2016 03:23:46 -0400 Subject: [PATCH 070/409] update to use correct error syntax --- docs/source/apollo-client/react.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index e1bd8bab4c0..9fb22ef5473 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -137,7 +137,7 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa ```js { loading: boolean, - error: Error, + errors: Error[], result: GraphQLResult, refetch: Function } @@ -148,7 +148,7 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa ```js { loading: boolean, - error: Error, + errors: Error[], result: GraphQLResult, } ``` From 7945d7ff7bc0bc4b3e200a527556e1192a8e6fe6 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 08:39:39 -0700 Subject: [PATCH 071/409] Add alpha/preview subtitle --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index b182b905e13..e5878d3d234 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -4,7 +4,7 @@ # Site title: Apollo Docs -subtitle: Documentation +subtitle: Documentation (Technical preview alpha) description: author: language: From da796bb8db1ee60ad458ee374f0c1669daaaf7b1 Mon Sep 17 00:00:00 2001 From: John Pinkerton Date: Tue, 19 Apr 2016 12:00:29 -0400 Subject: [PATCH 072/409] Update react docs (#25) --- docs/source/apollo-client/react.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 9fb22ef5473..9e0a85a7956 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -12,7 +12,7 @@ Basic Apollo version: ```js import ApolloClient from 'apollo-client'; -import { Provider } from 'apollo-react'; +import { Provider } from 'react-apollo'; const client = new ApolloClient(); @@ -29,7 +29,7 @@ With an existing Redux store: ```js import { createStore, combineReducers, applyMiddleware } from 'redux'; import ApolloClient from 'apollo-client'; -import { Provider } from 'apollo-react'; +import { Provider } from 'react-apollo'; import { todoReducer, userReducer } from './reducers'; @@ -67,7 +67,7 @@ It also uses keyword arguments instead of positional arguments, since that lets Basic Apollo version: ```js -import { connect } from 'apollo-react'; +import { connect } from 'react-apollo'; import Category from '../components/Category'; From 3f7f5e35f7ff9973fc276be959bb1c54cf9a4fe1 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 09:08:40 -0700 Subject: [PATCH 073/409] Formatting --- docs/source/apollo-server/guide.md | 2 +- docs/source/apollo-server/index.md | 3 ++- docs/source/apollo-server/tools.md | 41 ++++++++++++++++++++++-------- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 74663608304..aa6b626ec96 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -1,7 +1,7 @@ --- title: GraphQL server tutorial order: 202 -description: These are Apollo Docs!! +description: A step-by-step guide for setting up a basic GraphQL server with Apollo. --- This guide will explain all the parts required for a simple GraphQL Blog server. If you're looking for a tutorial, check out this Medium post or our GraphQL server tutorial video on Youtube. diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md index 4ec47c6a134..4b090da7954 100644 --- a/docs/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -1,7 +1,7 @@ --- title: Overview order: 201 -description: These are Apollo Docs!! +description: How to install the Apollo GraphQL server tools. --- Apollo GraphQL Tools is a collection of functions and an opinionated guide for how to build a GraphQL server in JavaScript. @@ -10,4 +10,5 @@ Apollo GraphQL Tools is a collection of functions and an opinionated guide for h ```txt npm install graphql-tools ``` + The Apollo GraphQL tools are not just useful for building servers, they can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. Information on how to use individual tools with GraphQL-JS can be found in the Tools section of this guide. diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 6e8005ff590..832fa315e6b 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -1,14 +1,14 @@ --- title: Documentation for graphql-tools order: 203 -description: These are Apollo Docs!! +description: API documentation for the Apollo GraphQL tools. --- While `apolloServer` can be used as an express middleware, graphql-tools exports all the functions that `apolloServer` uses internally, so they can be used separately with any GraphQL-JS schema. This section documents all the functions that graphql-tools exports, and explains how they can be used. ## Express middleware -### apolloServer(schema, [...]) +

apolloServer(schema, [...])

`apolloServer` is a convenient function that generates an express middleware (it uses express-graphql under the hood). It combines all of the tools in graphql-tools and has a simple to use interface: @@ -20,8 +20,8 @@ var app = express(); app.use('/graphql', apolloServer({ schema: typeDefinitionArray, graphiql: true })); ``` - **Function signature** + ``` apolloServer({ // options in common with graphqlHTTP from express-graphql @@ -139,7 +139,8 @@ If execution should not continue, resolve functions should return `null` and not The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `createSchema`. -### createSchema(typeDefinitions) +

createSchema(typeDefinitions)

+ **Function signature** ``` import { createSchema } from 'graphql-tools'; @@ -212,7 +213,9 @@ This [GraphQL schema language cheat sheet](https://raw.githubusercontent.com/sog ## Resolve functions In order to respond to queries, a schema needs to have resolve functions. Resolve functions cannot be included in the GraphQL schema language, so they must be added separately. -### addResolveFunctionsToSchema(schema, resolveFunctions) +

+ addResolveFunctionsToSchema(schema, resolveFunctions) +

`addResolveFunctionsToSchema` takes two arguments, a GraphQLSchema and an object defining resolve functions, and modifies the schema in place to. The `resolveFunctions` object should have one property for each type that has fields which need a resolve function. The following is an example of a valid resolveFunctions object: ```js @@ -248,16 +251,23 @@ const resolveFunctions = { ``` Note that if the types were defined in GraphQL schema language, the `info` argument to `resolveType` must be used to get a reference to the actual type, eg. `return info.schema.getType("Person")`. This may be changed in the future to support returning just the name of the type, eg. `return "Person"`. -### addSchemaLevelResolver(schema, rootResolveFunction) +

+ addSchemaLevelResolver(schema, rootResolveFunction) +

+ Some operations, such as authentication, need to be done only once per query. Logically, these operations belong in a root resolve function, but unfortunately GraphQL-JS does not let you define one. `addSchemaLevelResolver` solves this by modifying the GraphQLSchema that is passed as the first argument. ## Mocking -### mockServer(schema, mocks = {}, preserveResolvers = false) +

+ mockServer(schema, mocks = {}, preserveResolvers = false) +

For more information about how to use the `mockServer` function, see the [Medium Post about mocking](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd). -### addMocksToSchema(schema, mocks = {}, preserveResolvers = false) +

+ addMocksToSchema(schema, mocks = {}, preserveResolvers = false) +

`addMocksToSchema` is the function that `mockServer` uses under the hood. Given an instance of GraphQLSchema and a mock object, it modifies the schema in place to return mock data for any valid query that is sent to the server. If `mocks` is not passed, the defaults will be used for each of the scalar types. If `preserveResolvers` is set to `true`, existing resolve functions will not be overwritten to provide mock data. This can be used to mock some parts of the server and not others. @@ -278,7 +288,10 @@ Connectors are the parts that connect the GraphQL server to various backends, su Resolve functions act as a sort of switchboard, defining which connector should be used for which GraphQL types, and what arguments should be passed to it. While resolve functions should be stateless, connectors need to be stateful in many cases, for example to store information about the currently logged in user, or manage connections with the backend store. Because the same connector may be used in many resolve function, it has to be attached to the context, where all the resolve functions easily have access to it. -### attachConnectorsToContext(schema, connectors) +

+ attachConnectorsToContext(schema, connectors) +

+ `attachConnectorsToContext` takes two arguments: a GraphQLSchema and a `connectors` object that has connector classes as its named properties. The schema is modified in place such that for each query an instance of each connector will be constructed and attached to the context at the beginning of query execution, effectively making it a singleton that can keep state. ```js @@ -315,7 +328,10 @@ resolveAuthor(obj, args, context){ ## Error handling + error logging GraphQL servers can be tricky to debug. The following functions can help find error faster in many cases. -### forbidUndefinedInResolve(schema) +

+ forbidUndefinedInResolve(schema) +

+ ForbidUndefinedInResolve can be used during debugging to find mistakes in resolve functions faster. Usually, resolve functions only return undefined due to programmer error. `forbidUndefinedInResolve` takes a GraphQLSchema as input, and modifies it in place to throw an error when a resolve function returns undefined, telling you exactly which resolver returned undefined. ```js import { forbidUndefinedInResolve } from 'graphql-tools'; @@ -324,7 +340,10 @@ forbidUndefinedInResolve(schema); ``` -### addErrorLoggingToSchema(schema, logger) +

+ addErrorLoggingToSchema(schema, logger) +

+ This function may be deprecated in the near future. Instead of using addErrorLoggingToSchema, the `formatError` option of `apolloServer` or `graphqlHTTP` should be used, which was recently added in graphql-js v0.5.0 `addErorrLoggingToSchema` takes two arguments: `schema` and `logger`. `schema` must be an instance of `GraphQLSchema`, `logger` must be an Object with a callable property `log`. Every time an error occurs, `logger.log(e)` will be called. From 9bf823585f579a6aa85d8c3df88c0e225bd37e67 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 09:13:27 -0700 Subject: [PATCH 074/409] Formatting --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index e5878d3d234..6bf99c018e2 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -4,7 +4,7 @@ # Site title: Apollo Docs -subtitle: Documentation (Technical preview alpha) +subtitle: Technical preview docs description: author: language: From 44cadc7e119b7bb0d06649f67f6e54eaf686014b Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 09:14:21 -0700 Subject: [PATCH 075/409] Change URL and var Fixes #19 --- docs/source/apollo-server/guide.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index aa6b626ec96..44239fe1ac4 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -238,16 +238,18 @@ import Resolvers from './data/resolvers'; const GRAPHQL_PORT = 8080; -var graphQLServer = express(); -graphQLServer.use('/', apolloServer({ +const graphQLServer = express(); + +graphQLServer.use('/graphql', apolloServer({ graphiql: true, pretty: true, schema: Schema, resolvers: Resolvers, //mocks: Mocks, })); + graphQLServer.listen(GRAPHQL_PORT, () => console.log( - `GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}` + `GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}/graphql` )); ``` From e045598de39d78eacf89595150d7a230244a768f Mon Sep 17 00:00:00 2001 From: Uri Goldshtein Date: Tue, 19 Apr 2016 19:15:58 +0300 Subject: [PATCH 076/409] Feature/angular2 docs (#26) * chore(docs): Angular2 docs * fix(layout): Fix too many underlines... --- docs/_config.yml | 1 + docs/source/apollo-client/angular2.md | 206 ++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) create mode 100644 docs/source/apollo-client/angular2.md diff --git a/docs/_config.yml b/docs/_config.yml index 6bf99c018e2..dcbb435060f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -18,6 +18,7 @@ sidebar_categories: - apollo-client/index - apollo-client/core - apollo-client/react + - apollo-client/angular2 - apollo-client/meteor - apollo-client/redux - apollo-client/network diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md new file mode 100644 index 00000000000..d4139c49713 --- /dev/null +++ b/docs/source/apollo-client/angular2.md @@ -0,0 +1,206 @@ +--- +title: Angular 2.0 integration +order: 112 +description: How to use the Apollo Client to fetch GraphQL data in your Angular 2.0 application. +--- + +

Install

+ +```bash +npm install angular2-apollo --save +``` + +

Bootstrap

+ +```ts +import { + bootstrap +} from 'angular2/platform/browser'; + +import { + defaultApolloClient, + APOLLO_PROVIDERS +} from 'angular2-apollo'; + +import ApolloClient, { + createNetworkInterface +} from 'apollo-client'; + +import { + MyAppClass +} from './app/'; + +const client = new ApolloClient({ + networkInterface: createNetworkInterface('http://localhost:8080') +}); + +bootstrap(, [ + APOLLO_PROVIDERS, + defaultApolloClient(client) + ]); +``` + +

Inject Angular2Apollo

+ +```ts +import { + Component, + Injectable +} from 'angular2/core'; + +import { + Angular2Apollo +} from 'angular2-apollo'; + +@Component({ + selector: 'postsList', + templateUrl: 'client/postsList.html' +}) +@Injectable() +class postsList { + constructor(private angularApollo : Angular2Apollo) { + } +} +``` + +

Bind to query

+ +```ts +import { + Component, Injectable +} from 'angular2/core'; +import { + Angular2Apollo +} from 'angular2-apollo'; +import { + Observable +} from 'rxjs/Observable'; + +@Component({ + selector: 'postsList', + templateUrl: 'client/postsList.html' +}) +@Injectable() +class postsList { + posts: Observable; + + constructor(private angularApollo : Angular2Apollo) { + this.posts = angularApollo.watchQuery({ + query: ` + query getPosts($tag: String) { + posts(tag: $tag) { + title + } + } + `, + variables: { + tag: "1234" + } + }); + } +} +``` + +

ApolloQueryPipe

+ +Apollo client exposes queries as observables, but each Apollo query can include few queries. + +So inside an Apollo observable the data comes in the following form: `obs.data.queryName` + +To handle that more easily we've created the `ApolloQueryPipe`. here is how it works: + +template: +```html +
    +
  • + {{ post.title }} +
  • +
+``` + +We are pondering about a solution that will return an observable per single query and then we won't need that pipe anymore. + +

Mutations

+ +```ts +import { + Component, Injectable +} from 'angular2/core'; + +import { + Angular2Apollo +} from 'angular2-apollo'; + +import { + graphQLResult +} from 'graphql'; + +@Component({ + selector: 'postsList', + templateUrl: 'client/postsList.html' +}) +@Injectable() +class postsList { + constructor(private angularApollo : Angular2Apollo) { + + } + + postReply({ + token, + topicId, + categoryId, + raw + }) { + angularApollo.mutate({ + mutation: ` + mutation postReply( + $token: String! + $topic_id: ID! + $category_id: ID! + $raw: String! + ) { + createPost( + token: $token + topic_id: $topic_id + category: $category_id + raw: $raw + ) { + id + cooked + } + } + `, + variables: { + token: token, + topic_id: topicId, + category_id: categoryId, + raw: raw, + } + }).then((graphQLResult) => { + const { errors, data } = graphQLResult; + + if (data) { + console.log('got data', data); + } + + if (errors) { + console.log('got some GraphQL execution errors', errors); + } + }).catch((error) => { + console.log('there was an error sending the query', error); + }); + } +} +``` + +

Development

+ +Running tests locally: + +``` +# nvm use node +npm install +npm test +``` + +This project uses TypeScript for static typing and TSLint for linting. You can get both of these built into your editor with no configuration by opening this project in [Visual Studio Code](https://code.visualstudio.com/), an open source IDE which is available for free on all platforms. From 4bfd5a2006ca707fd47ae6ed91cc820385508882 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 09:42:17 -0700 Subject: [PATCH 077/409] Make homepage useful --- docs/source/index.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index d987fb63631..e31a5057720 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -4,4 +4,11 @@ order: 0 description: Introduction to the Apollo Data Stack. --- -Hello world! +Apollo is a data stack for modern apps, built with [GraphQL](https://medium.com/apollo-stack/the-basics-of-graphql-in-5-links-9e1dc4cac055#.576me0i04). It's a decoupled set of packages, including a GraphQL client, a set of tools for a GraphQL-JS server, and various client-side integrations. + +Apollo is currently in the technical preview stage. This means there are still many features to build and bugs to iron out (check the GitHub issues for the [various repositories](https://github.com/apollostack)), but we think what we have now shows the general direction of the project, and is usable by adventurous developers who want to participate actively in the project. Give it a shot, and let us know how it goes! + +To read more about Apollo in general, visit: + +- [Our website](http://www.apollostack.com/) +- [Our Medium blog](https://medium.com/apollo-stack) From 6b33f4798a26774fd22af16f737b666e748ebb06 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 09:50:55 -0700 Subject: [PATCH 078/409] Add links to packages --- docs/source/apollo-client/angular2.md | 4 +++- docs/source/apollo-client/devtools.md | 2 +- docs/source/apollo-client/index.md | 4 +++- docs/source/apollo-client/meteor.md | 8 ++++---- docs/source/apollo-client/react.md | 8 ++++++++ docs/source/apollo-client/redux.md | 4 ++++ 6 files changed, 23 insertions(+), 7 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index d4139c49713..a5fecc4d481 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -1,6 +1,6 @@ --- title: Angular 2.0 integration -order: 112 +order: 111 description: How to use the Apollo Client to fetch GraphQL data in your Angular 2.0 application. --- @@ -10,6 +10,8 @@ description: How to use the Apollo Client to fetch GraphQL data in your Angular npm install angular2-apollo --save ``` +[Follow apollostack/angular2-apollo on GitHub.](https://github.com/apollostack/angular2-apollo) +

Bootstrap

```ts diff --git a/docs/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md index 24fea8674e9..c6d0970803b 100644 --- a/docs/source/apollo-client/devtools.md +++ b/docs/source/apollo-client/devtools.md @@ -10,4 +10,4 @@ If you don't pass in an existing Redux store into the `ApolloClient` constructor

Inspecting the example app

-XXX add screenshots after we have example app +To fill in later. TL;DR just open the Redux DevTools. diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index a85e2fb1bea..eb057264d72 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -1,11 +1,13 @@ --- -title: Client overview +title: Apollo Client order: 100 description: Basic information on getting started with and using the Apollo Client. --- The Apollo Client can easily be dropped into any JavaScript frontend where you want to use data from a GraphQL server. +[Follow apollostack/apollo-client on GitHub.](https://github.com/apollostack/apollo-client) + ## Installing ```txt diff --git a/docs/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md index 8f918154f0f..a47a36bd8a4 100644 --- a/docs/source/apollo-client/meteor.md +++ b/docs/source/apollo-client/meteor.md @@ -1,10 +1,10 @@ --- title: Meteor integration -order: 111 -description: Specifics about using Apollo serve and fetch GraphQL data in your Meteor application. +order: 112 +description: Specifics about using Apollo in your Meteor application. --- -The Apollo client and server tools are published on NPM, which makes them available to all JavaScript applications, including those written with Meteor 1.3 and above. When using Meteor with Apollo, there are a few things to keep in mind to integrate the client and server. +The Apollo client and server tools are published on NPM, which makes them available to all JavaScript applications, including those written with Meteor 1.3 and above. When using Meteor with Apollo, there are a few things to keep in mind to have a smooth integration between the client and server. You can see all of these in action in the [Apollo Meteor starter kit](https://github.com/apollostack/meteor-starter-kit). @@ -46,7 +46,7 @@ const client = new ApolloClient({ ## Server -### Using Express +### Using Express with WebApp The Apollo server, and the Express GraphQL package that it is based on, rely on the Express server-side API framework. To use it, you will need to initialize a new Express server and proxy it to your Meteor `WebApp` server. diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 9e0a85a7956..155c75c0d9a 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -4,6 +4,14 @@ order: 110 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- +This package allows you to easily integrate your Apollo client and Redux store with your React components. It works almost exactly like [react-redux](https://github.com/reactjs/react-redux). + +```txt +npm install apollo-client +``` + +[Follow apollostack/react-apollo on GitHub.](https://github.com/apollostack/react-apollo) +

Provider

Injects an ApolloClient instance into a React view tree. You can use it instead of the Redux `Provider`, if you want to. But you don't have to: diff --git a/docs/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md index 2f966ffa27d..1b3182a853a 100644 --- a/docs/source/apollo-client/redux.md +++ b/docs/source/apollo-client/redux.md @@ -72,3 +72,7 @@ store.getState(); // myDifferentKey: {}, // } ``` + +

react-redux

+ +The `react-apollo` integration package is a drop-in replacement for `react-redux`, so if you are using Redux and Apollo together you don't need to have nested data containers. [Read the docs for `react-apollo` to see how to do this.](http://localhost:4000/apollo-client/react.html) From 8ad72f2faa16a3f39a1fd8d7fbc8759123a5f61b Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 10:18:34 -0700 Subject: [PATCH 079/409] Put underlines on links Fixes #13 --- themes/meteor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/meteor b/themes/meteor index 802f78cdbba..b58ed19861f 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit 802f78cdbba3be3bddea30ab4e9b33715955d377 +Subproject commit b58ed19861fa33df32e42346262b5cb21f6530c8 From 6988ad982d29f3f2dea5b176d33d274460336410 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 10:38:12 -0700 Subject: [PATCH 080/409] Update redux.md --- docs/source/apollo-client/redux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md index 1b3182a853a..a9e373e5e21 100644 --- a/docs/source/apollo-client/redux.md +++ b/docs/source/apollo-client/redux.md @@ -18,7 +18,7 @@ Here's what it looks like all together: ```js import { createStore, combineReducers, applyMiddleware } from 'redux'; -import { ApolloClient } from 'apollo-client'; +import ApolloClient from 'apollo-client'; import { todoReducer, userReducer } from './reducers'; const client = new ApolloClient(); From bcbb637310cbfb1414c1849e91c623f58351222c Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 13:18:00 -0700 Subject: [PATCH 081/409] Add some example apps --- docs/source/index.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/source/index.md b/docs/source/index.md index e31a5057720..7b29881f8f2 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -12,3 +12,10 @@ To read more about Apollo in general, visit: - [Our website](http://www.apollostack.com/) - [Our Medium blog](https://medium.com/apollo-stack) + +## Example apps + +We have put together some basic example apps using various parts of Apollo; check them out to see how everything fits together. We're always looking for improvements and feedback on these apps, and they'll get better as Apollo becomes more production-ready! + +- [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) +- [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) From ddce7150d06bc013bbfeb7ad168cc2bb9a64a266 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 19 Apr 2016 13:26:29 -0700 Subject: [PATCH 082/409] added third example app: apollo server tutorial --- docs/source/index.md | 1 + themes/meteor | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index 7b29881f8f2..013bf5344b5 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -18,4 +18,5 @@ To read more about Apollo in general, visit: We have put together some basic example apps using various parts of Apollo; check them out to see how everything fits together. We're always looking for improvements and feedback on these apps, and they'll get better as Apollo becomes more production-ready! - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) +- [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) diff --git a/themes/meteor b/themes/meteor index b58ed19861f..f6333f5c251 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit b58ed19861fa33df32e42346262b5cb21f6530c8 +Subproject commit f6333f5c251f1acf3929fac7ee3da791d15077be From feb0cb7db06ab27baff38ddc9c19c7e45368e507 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 14:06:17 -0700 Subject: [PATCH 083/409] Improve index --- docs/source/index.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/source/index.md b/docs/source/index.md index 013bf5344b5..b058cdbec37 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -6,6 +6,12 @@ description: Introduction to the Apollo Data Stack. Apollo is a data stack for modern apps, built with [GraphQL](https://medium.com/apollo-stack/the-basics-of-graphql-in-5-links-9e1dc4cac055#.576me0i04). It's a decoupled set of packages, including a GraphQL client, a set of tools for a GraphQL-JS server, and various client-side integrations. +We're building Apollo to be: + +1. **Incrementally adoptable**, so that you can drop it into any JavaScript app +3. **Simple to get started with**, you can just read one guide and get going +4. **Inspectable and understandable**, so that you can have great developer tools to understand exactly what is happening in your app + Apollo is currently in the technical preview stage. This means there are still many features to build and bugs to iron out (check the GitHub issues for the [various repositories](https://github.com/apollostack)), but we think what we have now shows the general direction of the project, and is usable by adventurous developers who want to participate actively in the project. Give it a shot, and let us know how it goes! To read more about Apollo in general, visit: From 9fe814b50d0fb2b5b776eacf52ddb4cd822df167 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 19 Apr 2016 14:07:05 -0700 Subject: [PATCH 084/409] Update theme --- themes/meteor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/meteor b/themes/meteor index f6333f5c251..b58ed19861f 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit f6333f5c251f1acf3929fac7ee3da791d15077be +Subproject commit b58ed19861fa33df32e42346262b5cb21f6530c8 From 374245b287801e1e5a6572e5a8e6fa8db17a866b Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Tue, 19 Apr 2016 23:35:40 +0200 Subject: [PATCH 085/409] Angular2 - Apollo decorator --- docs/source/apollo-client/angular2.md | 156 +++++++++++++++++++++++++- 1 file changed, 154 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index a5fecc4d481..89dbc8efb50 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -67,13 +67,18 @@ class postsList {

Bind to query

+

Using Angular2Apollo service

+ ```ts import { - Component, Injectable + Component, + Injectable } from 'angular2/core'; + import { Angular2Apollo } from 'angular2-apollo'; + import { Observable } from 'rxjs/Observable'; @@ -103,6 +108,59 @@ class postsList { } ``` + +

Using Apollo decorator

+ +```ts +import { + Component, Injectable +} from 'angular2/core'; + +import { + Apollo +} from 'angular2-apollo'; + +import ApolloClient, { + createNetworkInterface +} from 'apollo-client'; + +import { + Observable +} from 'rxjs/Observable'; + +const client = new ApolloClient({ + networkInterface: createNetworkInterface('http://localhost:8080') +}); + +@Component({ + selector: 'postsList', + templateUrl: 'client/postsList.html' +}) +@Injectable() +@Apollo({ + client, + queries(context) { + return { + posts: { + query: ` + query getPosts($tag: String) { + posts(tag: $tag) { + title + } + } + `, + variables: { + tag: "1234" + } + } + }; + } +}) +class postsList { + posts: Observable; +} +``` +

ApolloQueryPipe

Apollo client exposes queries as observables, but each Apollo query can include few queries. @@ -124,9 +182,12 @@ We are pondering about a solution that will return an observable per single quer

Mutations

+

Using Angular2Apollo service

+ ```ts import { - Component, Injectable + Component, + Injectable } from 'angular2/core'; import { @@ -195,6 +256,97 @@ class postsList { } ``` +

Using Apollo decorator

+ +```ts +import { + Component, + Injectable +} from 'angular2/core'; + +import { + Apollo +} from 'angular2-apollo'; + +import { + graphQLResult +} from 'graphql'; + +import ApolloClient, { + createNetworkInterface +} from 'apollo-client'; + +const client = new ApolloClient({ + networkInterface: createNetworkInterface('http://localhost:8080') +}); + +@Component({ + selector: 'postsList', + templateUrl: 'client/postsList.html' +}) +@Injectable() +@Apollo({ + client, + mutations(context) { + return { + postReply: ({ + token, + topicId, + categoryId, + raw + }) => ({ + mutation: ` + mutation postReply( + $token: String! + $topic_id: ID! + $category_id: ID! + $raw: String! + ) { + createPost( + token: $token + topic_id: $topic_id + category: $category_id + raw: $raw + ) { + id + cooked + } + } + `, + variables: { + token: token, + topic_id: topicId, + category_id: categoryId, + raw: raw, + } + }) + }; + } +}) +class postsList { + constructor() { + + } + + reply(reply) { + this.postReply(reply) + .then((graphQLResult) => { + const { errors, data } = graphQLResult; + + if (data) { + console.log('got data', data); + } + + if (errors) { + console.log('got some GraphQL execution errors', errors); + } + }).catch((error) => { + console.log('there was an error sending the query', error); + }); + } +} +``` +

Development

Running tests locally: From 1b582b27e247e48de31936e2befa69816e58de11 Mon Sep 17 00:00:00 2001 From: Alexander Podkidyshev Date: Wed, 20 Apr 2016 18:26:20 +0300 Subject: [PATCH 086/409] Update guide.md Changed localhost:4000 to docs.apollostack.com --- docs/source/apollo-server/guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 44239fe1ac4..6f778995b52 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -51,7 +51,7 @@ export default [typeDefinitions]; ``` ApolloServer uses the GraphQL schema language notation, which it then compiles to a GraphQL-JS schema. With the current schema, our server provides exactly one entry point `testString`, which returns a String. -The schema notation supports all GraphQL types. In this tutorial we are only going to use a few of them. You can learn about all the others in the [schema creation subsection of Tools](http://localhost:4000/apollo-server/tools.html#Schema-creation). +The schema notation supports all GraphQL types. In this tutorial we are only going to use a few of them. You can learn about all the others in the [schema creation subsection of Tools](http://docs.apollostack.com//apollo-server/tools.html#Schema-creation). For the todos app, we're going to use a schema that has the following two types: Authors and Posts. For each type, the schema defines which fields it has, and how it relates to the other types. The fields of the RootQuery and RootMutation types are the client's entry points to the schema. Every query or mutation has to start there, but it can ask for as much or as little data as it wants by expanding the fields when necessary. @@ -103,7 +103,7 @@ schema { export default [typeDefinitions]; ``` -For more information about GraphQL's type system and schema language, you can take a look at @sogko's [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](http://localhost:4000/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). +For more information about GraphQL's type system and schema language, you can take a look at @sogko's [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](http://docs.apollostack.com/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). ## Mocking From c4525a7c3f72f48b6894cbe502b2899ded98eb64 Mon Sep 17 00:00:00 2001 From: Alexander Podkidyshev Date: Wed, 20 Apr 2016 18:26:54 +0300 Subject: [PATCH 087/409] Update redux.md Wrong URL --- docs/source/apollo-client/redux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md index a9e373e5e21..b303455fb2d 100644 --- a/docs/source/apollo-client/redux.md +++ b/docs/source/apollo-client/redux.md @@ -75,4 +75,4 @@ store.getState();

react-redux

-The `react-apollo` integration package is a drop-in replacement for `react-redux`, so if you are using Redux and Apollo together you don't need to have nested data containers. [Read the docs for `react-apollo` to see how to do this.](http://localhost:4000/apollo-client/react.html) +The `react-apollo` integration package is a drop-in replacement for `react-redux`, so if you are using Redux and Apollo together you don't need to have nested data containers. [Read the docs for `react-apollo` to see how to do this.](http://docs.apollostack.com/apollo-client/react.html) From 47c54243660ad4d3d86d677977b57f988b9d05c1 Mon Sep 17 00:00:00 2001 From: Hugh Willson Date: Wed, 20 Apr 2016 12:25:01 -0400 Subject: [PATCH 088/409] No todos here! (switched "todos" to "blog") (#34) --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 6f778995b52..6074d2ff559 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -53,7 +53,7 @@ ApolloServer uses the GraphQL schema language notation, which it then compiles t The schema notation supports all GraphQL types. In this tutorial we are only going to use a few of them. You can learn about all the others in the [schema creation subsection of Tools](http://docs.apollostack.com//apollo-server/tools.html#Schema-creation). -For the todos app, we're going to use a schema that has the following two types: Authors and Posts. For each type, the schema defines which fields it has, and how it relates to the other types. The fields of the RootQuery and RootMutation types are the client's entry points to the schema. Every query or mutation has to start there, but it can ask for as much or as little data as it wants by expanding the fields when necessary. +For the blog app, we're going to use a schema that has the following two types: Authors and Posts. For each type, the schema defines which fields it has, and how it relates to the other types. The fields of the RootQuery and RootMutation types are the client's entry points to the schema. Every query or mutation has to start there, but it can ask for as much or as little data as it wants by expanding the fields when necessary. ````js const typeDefinitions = ` From fdcf35f8e4c52231b787f1b3317fa94e0d4abe65 Mon Sep 17 00:00:00 2001 From: Gaurav Tiwari Date: Wed, 20 Apr 2016 20:26:09 +0300 Subject: [PATCH 089/409] Document session passing via network interface (#35) --- docs/source/apollo-client/index.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index eb057264d72..d7e725c372b 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -63,3 +63,31 @@ const client = new ApolloClient({ networkInterface, }); ``` + +To automatically send cookies for the current domain (same server-client environment), the credentials option must be provided, + +```js +import ApolloClient, { createNetworkInterface } from 'apollo-client'; + +const networkInterface = createNetworkInterface('/graphql', { + credentials: 'same-origin', + headers: { + 'X-CSRF-Token': "xyz", // Rails or Phoenix framework + token: 'supersecret' // Custom auth token + } +}); + +const client = new ApolloClient({ networkInterface }); +``` + +Use the include value to send cookies in a cross-origin resource sharing (CORS) request. + +```js +const networkInterface = createNetworkInterface('/graphql', { + credentials: 'include', + headers: { + 'X-CSRF-Token': "xyz", + token: 'supersecret' + } +}); +``` From 7bbb6d8279e09c5af25fc3bc3b811e2b223b39fb Mon Sep 17 00:00:00 2001 From: Gaurav Tiwari Date: Wed, 20 Apr 2016 23:50:44 +0300 Subject: [PATCH 090/409] Document refetch() with variables support --- docs/source/apollo-client/react.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 155c75c0d9a..56adafb193a 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -147,7 +147,7 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa loading: boolean, errors: Error[], result: GraphQLResult, - refetch: Function + refetch: Function(variables) } ``` @@ -163,7 +163,9 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa The `Category` component will also get a prop of `mutations` that will have a key of `postReply`. This key is the method that triggers the mutation and can take custom arguments (e.g. `this.props.mutations.postReply('Apollo and React are really great!')`). These arguments are passed to the method that creates the mutation. -One typical pattern is wanting to refetch a query after a mutation has happened. In this example, `this.props.mutations.postReply`is a method that returns the mutation promise. Since queries pass a `refetch` prop, this can be accomplished like so: +

Refetch query (with new variables)

+ +One typical pattern is wanting to refetch a query after a mutation has happened. In this example, `this.props.mutations.postReply`is a method that returns the mutation promise. Since queries pass a `refetch()` prop, this can be accomplished like so: ```js @@ -175,7 +177,8 @@ class Container extends React.Component{ .then((err, data) => { // if we have the data we want if (data.id) { - // refetch the categories query + // refetch the categories query without variables, + // just refresh client store this.props.categories.refetch(); }; }); @@ -188,8 +191,20 @@ class Container extends React.Component{ ``` -

Additional Props

+`refetch(variables: optional)` also supports passing variables to refetch the same query with different set of variables. This would be handy for cases, when you just want to modify the variables to get new data. + +**For example:** +```js + this.props.categories.refetch({ id: 5 }); + this.props.posts.refetch({ first: 20, page: 2 }); +``` +Example use cases: `Infinite scroll`, `Data filtering` + +*Note: If you just want to refresh the store with updated data, just `refetch()` without variables.* + + +

Additional Props

Redux's connect will pass `dispatch` as a prop unless action creators are passed using `mapDisptachToProps`. Likewise, the Apollo connect exposes part of the apollo-client api to props under the keys `query` and `mutate`. These correspond to the Apollo methods and can be used for custom needs outside of the ability of the wrapper component. From eb7f82027f5b93ae7dddb79ccd6c50a58056f08d Mon Sep 17 00:00:00 2001 From: Geoff Schmidt Date: Wed, 20 Apr 2016 14:16:55 -0700 Subject: [PATCH 091/409] Typo fix :) Those "Edit on GitHub" links are really cool :) --- docs/source/apollo-client/angular2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index 89dbc8efb50..8153dd12b43 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -167,7 +167,7 @@ Apollo client exposes queries as observables, but each Apollo query can include So inside an Apollo observable the data comes in the following form: `obs.data.queryName` -To handle that more easily we've created the `ApolloQueryPipe`. here is how it works: +To handle that more easily we've created the `ApolloQueryPipe`. Here is how it works: template: ```html From ec64fee0f9ce9b5802006da646accbbeac751393 Mon Sep 17 00:00:00 2001 From: James Baxley Date: Wed, 20 Apr 2016 22:36:48 -0400 Subject: [PATCH 092/409] Include docs on store rehydration via initial state --- docs/source/apollo-client/index.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index d7e725c372b..e9fa3b8f1b3 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -91,3 +91,25 @@ const networkInterface = createNetworkInterface('/graphql', { } }); ``` + +

Loading Intial Data from Server

+ +For applications that support server side rendering, or that can perform some queries on the server prior to rendering the client, ApolloClient allows for setting the intial state of data. This is sometimes called store rehydration for redux applications. + +> Note: if you are using redux externally to apollo, and already have store rehydration, this key isn't needed. + +```js +// on server during render +// after application has gotten all of the data it needs +const initialState = client.store.getState() +// inject into template + + +// on client +const client = new ApolloClient({ + initialState: __APOLLO_STORE__, +}); +``` + +Then, when a client calls ApolloClient#query or ApolloClient#watchQuery, the data should be returned instantly because it is already in the store! This also makes full page server side rendering without a page rebuild (if using react for instance) possible because the server rendered template won't differ from the client) + From 80c0849c401e5a8d89e51aa769b1105a2590e585 Mon Sep 17 00:00:00 2001 From: Patrick Metzdorf Date: Thu, 21 Apr 2016 07:27:28 +0100 Subject: [PATCH 093/409] Document fetch polyfill (#40) --- docs/source/apollo-client/core.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index db884fcad4f..447eb33279e 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -86,11 +86,20 @@ Run a GraphQL query and return a promise that resolves to a `GraphQLResult`. - `variables: Object` The variables to pass along with the query. - `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. +

Fetch Polyfill

+ +Apollo uses [fetch](https://fetch.spec.whatwg.org/) behind the scenes to make HTTP requests. Be aware that many browser versions now support the `window.fetch` function natively (check [caniuse.com](http://caniuse.com/#feat=fetch)), but Node, for example, doesn't (as of v5). + +Where it is not supported, you can use one of several popular polyfills, including [whatwg-fetch](https://github.com/github/fetch), [node-fetch](https://github.com/bitinn/node-fetch) or [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch). + Here's how you would run a single query and get the result: ```js import ApolloClient from 'apollo-client'; +// Polyfill fetch into the global namespace if required. +import fetch from 'isomorphic-fetch'; + const client = new ApolloClient(); client.query({ From 32cfc17f9fa4482a21dc6048a11acbb1daffa6b8 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Wed, 20 Apr 2016 23:41:03 -0700 Subject: [PATCH 094/409] Reorg fetch polyfill --- docs/source/apollo-client/core.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index 447eb33279e..62da724debf 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -86,19 +86,13 @@ Run a GraphQL query and return a promise that resolves to a `GraphQLResult`. - `variables: Object` The variables to pass along with the query. - `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. -

Fetch Polyfill

- -Apollo uses [fetch](https://fetch.spec.whatwg.org/) behind the scenes to make HTTP requests. Be aware that many browser versions now support the `window.fetch` function natively (check [caniuse.com](http://caniuse.com/#feat=fetch)), but Node, for example, doesn't (as of v5). - -Where it is not supported, you can use one of several popular polyfills, including [whatwg-fetch](https://github.com/github/fetch), [node-fetch](https://github.com/bitinn/node-fetch) or [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch). - Here's how you would run a single query and get the result: ```js import ApolloClient from 'apollo-client'; // Polyfill fetch into the global namespace if required. -import fetch from 'isomorphic-fetch'; +// import fetch from 'isomorphic-fetch'; const client = new ApolloClient(); @@ -263,3 +257,9 @@ client.mutate({ ``` Right now, this is a bit verbose because you have to list the names of the variables three times, but we hope to improve this in the future. + +

Fetch Polyfill

+ +Apollo uses [fetch](https://fetch.spec.whatwg.org/) behind the scenes to make HTTP requests. Be aware that many browser versions now support the `window.fetch` function natively (check [caniuse.com](http://caniuse.com/#feat=fetch)), but Node, for example, doesn't (as of v5). + +Where it is not supported, you can use one of several popular polyfills, including [whatwg-fetch](https://github.com/github/fetch), [node-fetch](https://github.com/bitinn/node-fetch) or [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch). From 86764ad5108f228d0f81e1176348cc3bb533215d Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Thu, 21 Apr 2016 02:30:43 -0700 Subject: [PATCH 095/409] Add link to youtube video --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 6074d2ff559..544cb93fecd 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -4,7 +4,7 @@ order: 202 description: A step-by-step guide for setting up a basic GraphQL server with Apollo. --- -This guide will explain all the parts required for a simple GraphQL Blog server. If you're looking for a tutorial, check out this Medium post or our GraphQL server tutorial video on Youtube. +This guide will explain all the parts required for a simple GraphQL Blog server. If you're looking for a tutorial, check out this Medium post or our [GraphQL server tutorial video on Youtube](https://www.youtube.com/watch?v=PHabPhgRUuU). We'll be using a package called [graphql-tools](https://www.npmjs.com/package/graphql-tools), which is actively being developed for [Apollo](http://www.apollostack.com). There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. From 72fd76cf2de050b4056c41dcb1ede0d46dd4ae68 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Thu, 21 Apr 2016 13:17:06 +0200 Subject: [PATCH 096/409] Angular2: Describe service, decorator and examples --- docs/source/apollo-client/angular2.md | 198 +++++++++++++++----------- 1 file changed, 117 insertions(+), 81 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index 8153dd12b43..de15bb462c7 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -4,7 +4,7 @@ order: 111 description: How to use the Apollo Client to fetch GraphQL data in your Angular 2.0 application. --- -

Install

+This package allows you to easily integrate your Apollo client with your Angular 2.0 app. ```bash npm install angular2-apollo --save @@ -14,6 +14,8 @@ npm install angular2-apollo --save

Bootstrap

+If you want to define the default *ApolloClient* to be used by `Angular2Apollo` service, you can use `defaultApolloClient` provider. + ```ts import { bootstrap @@ -42,7 +44,13 @@ bootstrap(, [ ]); ``` -

Inject Angular2Apollo

+

Angular2Apollo service

+ +This service allows you to bind queries and call mutations. + +

Inject

+ +Since you previously used `APOLLO_PROVIDERS` to bootstrap you app, it is possible now just to define `Angular2Apollo` service inside the constructor. ```ts import { @@ -65,9 +73,11 @@ class postsList { } ``` -

Bind to query

+

Queries

+ +To bind to query you can use `watchQuery` method with the same arguments as [`ApolloClient#watchQuery`](http://docs.apollostack.com/apollo-client/core.html#watchQuery). In this case as the result you will receive the [`QueryObservable`](http://docs.apollostack.com/apollo-client/core.html#watchQuery). -

Using Angular2Apollo service

+Here's how you could run a query: ```ts import { @@ -101,88 +111,18 @@ class postsList { } `, variables: { - tag: "1234" + tag: '1234' } }); } } ``` +

Mutations

-

Using Apollo decorator

- -```ts -import { - Component, Injectable -} from 'angular2/core'; - -import { - Apollo -} from 'angular2-apollo'; +To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](http://docs.apollostack.com/apollo-client/core.html#mutate). In this case as the result you will receive a promise that resolves to a GraphQLResult. -import ApolloClient, { - createNetworkInterface -} from 'apollo-client'; - -import { - Observable -} from 'rxjs/Observable'; - -const client = new ApolloClient({ - networkInterface: createNetworkInterface('http://localhost:8080') -}); - -@Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' -}) -@Injectable() -@Apollo({ - client, - queries(context) { - return { - posts: { - query: ` - query getPosts($tag: String) { - posts(tag: $tag) { - title - } - } - `, - variables: { - tag: "1234" - } - } - }; - } -}) -class postsList { - posts: Observable; -} -``` - -

ApolloQueryPipe

- -Apollo client exposes queries as observables, but each Apollo query can include few queries. - -So inside an Apollo observable the data comes in the following form: `obs.data.queryName` - -To handle that more easily we've created the `ApolloQueryPipe`. Here is how it works: - -template: -```html -
    -
  • - {{ post.title }} -
  • -
-``` - -We are pondering about a solution that will return an observable per single query and then we won't need that pipe anymore. - -

Mutations

- -

Using Angular2Apollo service

+Here's how you would call a mutation and pass in arguments via variables: ```ts import { @@ -256,7 +196,82 @@ class postsList { } ``` -

Using Apollo decorator

+

Apollo decorator

+ +It allows you to define queries and mutations and to make them reactive. You can use the component's context inside of them and they will be always up to date. + +- `client` to define the ApolloClient +- `queries` to map queries to component's context +- `mutations` to map mutations to component's context + +

Queries

+ +Each key on the object returned by `queries` function should be made up of the same possible arguments as [`ApolloClient#watchQuery`](http://docs.apollostack.com/apollo-client/core.html#watchQuery). + +Since `queries` function receives one argument which is a component's context you can use it to define variables. +It is also reactive so your variables will be always up to date. + +Here's how you could run a query: + +```ts +import { + Component, Injectable +} from 'angular2/core'; + +import { + Apollo +} from 'angular2-apollo'; + +import ApolloClient, { + createNetworkInterface +} from 'apollo-client'; + +import { + Observable +} from 'rxjs/Observable'; + +const client = new ApolloClient({ + networkInterface: createNetworkInterface('http://localhost:8080') +}); + +@Component({ + selector: 'postsList', + templateUrl: 'client/postsList.html' +}) +@Injectable() +@Apollo({ + client, + queries(context) { + return { + posts: { + query: ` + query getPosts($tag: String) { + posts(tag: $tag) { + title + } + } + `, + variables: { + tag: context.tag + } + } + }; + } +}) +class postsList { + public tag: string = '1234'; + public posts: Observable; +} +``` + +

Mutations

+ +`mutations` function returns an object made up of keys and values that are custom functions to call the mutation. The resulting function must return the same possible arguments as [`ApolloClient#mutate`](http://docs.apollostack.com/apollo-client/core.html#mutate) + +Since `mutations` function receives one argument which is a component's context you can use it to inside variables. +It is also reactive so your variables will be always up to date. + +Here's how you could run a mutation: ```ts import { @@ -314,7 +329,7 @@ const client = new ApolloClient({ } `, variables: { - token: token, + token: context.token, topic_id: topicId, category_id: categoryId, raw: raw, @@ -324,10 +339,12 @@ const client = new ApolloClient({ } }) class postsList { + public token: string = 'random'; + constructor() { } - + reply(reply) { this.postReply(reply) .then((graphQLResult) => { @@ -347,6 +364,25 @@ class postsList { } ``` +

ApolloQueryPipe

+ +Apollo client exposes queries as observables, but each Apollo query can include few queries. + +So inside an Apollo observable the data comes in the following form: `obs.data.queryName` + +To handle that more easily we've created the `ApolloQueryPipe`. Here is how it works: + +template: +```html +
    +
  • + {{ post.title }} +
  • +
+``` + +We are pondering about a solution that will return an observable per single query and then we won't need that pipe anymore. +

Development

Running tests locally: From 5620d26ce546d5af1b37711cdf89ea903455d10d Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Thu, 21 Apr 2016 14:39:07 -0700 Subject: [PATCH 097/409] Fix: change createSchema to generateSchema --- docs/source/apollo-server/tools.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 832fa315e6b..4264bdef491 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -137,15 +137,15 @@ If execution should not continue, resolve functions should return `null` and not ## Schema creation -The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `createSchema`. +The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `generateSchema`. -

createSchema(typeDefinitions)

+

generateSchema(typeDefinitions)

**Function signature** ``` -import { createSchema } from 'graphql-tools'; +import { generateSchema } from 'graphql-tools'; -const jsSchema = createSchema(typeDefinitions); +const jsSchema = generateSchema(typeDefinitions); ``` `typeDefinitions` should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. The schema must define a query type, which means a minimal schema would look something like this: @@ -159,10 +159,10 @@ type RootQuery { aNumber: Int }`]; -const jsSchema = createSchema(typeDefinition); +const jsSchema = generateSchema(typeDefinition); ``` -If your schema gets large, you may want to define parts of it in different files and import them to create the full schema. This is possible by including them in the array. If there are circular dependencies, the array should be wrapped in arrow function. `createSchema` will only include each type definition once, even if it is imported multiple times by different types. +If your schema gets large, you may want to define parts of it in different files and import them to create the full schema. This is possible by including them in the array. If there are circular dependencies, the array should be wrapped in arrow function. `generateSchema` will only include each type definition once, even if it is imported multiple times by different types. ```js // in author.js ------------------- @@ -204,7 +204,7 @@ const SchemaDefinition = ` } `; -export default createSchema([SchemaDefinition, RootQuery, Author]); +export default generateSchema([SchemaDefinition, RootQuery, Author]); ``` This [GraphQL schema language cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png) by Hafiz Ismail is an excellent reference for all the features of the GraphQL schema language. From a15c28aab440c76c546a5b2a6f9a6b91e2554d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20K=C3=A4ll?= Date: Fri, 22 Apr 2016 17:07:04 +0200 Subject: [PATCH 098/409] Remove extra forward slash in link (#45) --- {docs/source => source}/apollo-client/angular2.md | 0 {docs/source => source}/apollo-client/core.md | 0 {docs/source => source}/apollo-client/devtools.md | 0 {docs/source => source}/apollo-client/index.md | 0 {docs/source => source}/apollo-client/meteor.md | 0 {docs/source => source}/apollo-client/network.md | 0 {docs/source => source}/apollo-client/react.md | 0 {docs/source => source}/apollo-client/redux.md | 0 .../apollo-server/graphiql-test.png | Bin {docs/source => source}/apollo-server/guide.md | 2 +- {docs/source => source}/apollo-server/index.md | 0 {docs/source => source}/apollo-server/tools.md | 0 {docs/source => source}/index.md | 0 {docs/source => source}/logo/large.png | Bin {docs/source => source}/logo/square.png | Bin 15 files changed, 1 insertion(+), 1 deletion(-) rename {docs/source => source}/apollo-client/angular2.md (100%) rename {docs/source => source}/apollo-client/core.md (100%) rename {docs/source => source}/apollo-client/devtools.md (100%) rename {docs/source => source}/apollo-client/index.md (100%) rename {docs/source => source}/apollo-client/meteor.md (100%) rename {docs/source => source}/apollo-client/network.md (100%) rename {docs/source => source}/apollo-client/react.md (100%) rename {docs/source => source}/apollo-client/redux.md (100%) rename {docs/source => source}/apollo-server/graphiql-test.png (100%) rename {docs/source => source}/apollo-server/guide.md (99%) rename {docs/source => source}/apollo-server/index.md (100%) rename {docs/source => source}/apollo-server/tools.md (100%) rename {docs/source => source}/index.md (100%) rename {docs/source => source}/logo/large.png (100%) rename {docs/source => source}/logo/square.png (100%) diff --git a/docs/source/apollo-client/angular2.md b/source/apollo-client/angular2.md similarity index 100% rename from docs/source/apollo-client/angular2.md rename to source/apollo-client/angular2.md diff --git a/docs/source/apollo-client/core.md b/source/apollo-client/core.md similarity index 100% rename from docs/source/apollo-client/core.md rename to source/apollo-client/core.md diff --git a/docs/source/apollo-client/devtools.md b/source/apollo-client/devtools.md similarity index 100% rename from docs/source/apollo-client/devtools.md rename to source/apollo-client/devtools.md diff --git a/docs/source/apollo-client/index.md b/source/apollo-client/index.md similarity index 100% rename from docs/source/apollo-client/index.md rename to source/apollo-client/index.md diff --git a/docs/source/apollo-client/meteor.md b/source/apollo-client/meteor.md similarity index 100% rename from docs/source/apollo-client/meteor.md rename to source/apollo-client/meteor.md diff --git a/docs/source/apollo-client/network.md b/source/apollo-client/network.md similarity index 100% rename from docs/source/apollo-client/network.md rename to source/apollo-client/network.md diff --git a/docs/source/apollo-client/react.md b/source/apollo-client/react.md similarity index 100% rename from docs/source/apollo-client/react.md rename to source/apollo-client/react.md diff --git a/docs/source/apollo-client/redux.md b/source/apollo-client/redux.md similarity index 100% rename from docs/source/apollo-client/redux.md rename to source/apollo-client/redux.md diff --git a/docs/source/apollo-server/graphiql-test.png b/source/apollo-server/graphiql-test.png similarity index 100% rename from docs/source/apollo-server/graphiql-test.png rename to source/apollo-server/graphiql-test.png diff --git a/docs/source/apollo-server/guide.md b/source/apollo-server/guide.md similarity index 99% rename from docs/source/apollo-server/guide.md rename to source/apollo-server/guide.md index 544cb93fecd..4a7322b62e7 100644 --- a/docs/source/apollo-server/guide.md +++ b/source/apollo-server/guide.md @@ -51,7 +51,7 @@ export default [typeDefinitions]; ``` ApolloServer uses the GraphQL schema language notation, which it then compiles to a GraphQL-JS schema. With the current schema, our server provides exactly one entry point `testString`, which returns a String. -The schema notation supports all GraphQL types. In this tutorial we are only going to use a few of them. You can learn about all the others in the [schema creation subsection of Tools](http://docs.apollostack.com//apollo-server/tools.html#Schema-creation). +The schema notation supports all GraphQL types. In this tutorial we are only going to use a few of them. You can learn about all the others in the [schema creation subsection of Tools](http://docs.apollostack.com/apollo-server/tools.html#Schema-creation). For the blog app, we're going to use a schema that has the following two types: Authors and Posts. For each type, the schema defines which fields it has, and how it relates to the other types. The fields of the RootQuery and RootMutation types are the client's entry points to the schema. Every query or mutation has to start there, but it can ask for as much or as little data as it wants by expanding the fields when necessary. diff --git a/docs/source/apollo-server/index.md b/source/apollo-server/index.md similarity index 100% rename from docs/source/apollo-server/index.md rename to source/apollo-server/index.md diff --git a/docs/source/apollo-server/tools.md b/source/apollo-server/tools.md similarity index 100% rename from docs/source/apollo-server/tools.md rename to source/apollo-server/tools.md diff --git a/docs/source/index.md b/source/index.md similarity index 100% rename from docs/source/index.md rename to source/index.md diff --git a/docs/source/logo/large.png b/source/logo/large.png similarity index 100% rename from docs/source/logo/large.png rename to source/logo/large.png diff --git a/docs/source/logo/square.png b/source/logo/square.png similarity index 100% rename from docs/source/logo/square.png rename to source/logo/square.png From 497d1c0aee0483ecd21c72ffff7d9e52c1e65d18 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 22 Apr 2016 13:31:40 -0700 Subject: [PATCH 099/409] Split server docs into many pages (#47) * Split docs into many pages * Rename, format * Redundant * Fix ref * Eliminate absolute links * Broken link --- docs/_config.yml | 5 + .../source}/apollo-client/angular2.md | 8 +- {source => docs/source}/apollo-client/core.md | 0 .../source}/apollo-client/devtools.md | 0 .../source}/apollo-client/index.md | 0 .../source}/apollo-client/meteor.md | 0 .../source}/apollo-client/network.md | 0 .../source}/apollo-client/react.md | 8 +- .../source}/apollo-client/redux.md | 2 +- docs/source/apollo-server/connectors.md | 46 +++ docs/source/apollo-server/errors.md | 32 ++ docs/source/apollo-server/generate-schema.md | 77 ++++ .../source}/apollo-server/graphiql-test.png | Bin .../source}/apollo-server/guide.md | 13 +- .../source}/apollo-server/index.md | 2 +- docs/source/apollo-server/mocking.md | 17 + docs/source/apollo-server/resolvers.md | 52 +++ docs/source/apollo-server/tools.md | 134 +++++++ {source => docs/source}/index.md | 0 {source => docs/source}/logo/large.png | Bin {source => docs/source}/logo/square.png | Bin source/apollo-server/tools.md | 354 ------------------ 22 files changed, 381 insertions(+), 369 deletions(-) rename {source => docs/source}/apollo-client/angular2.md (93%) rename {source => docs/source}/apollo-client/core.md (100%) rename {source => docs/source}/apollo-client/devtools.md (100%) rename {source => docs/source}/apollo-client/index.md (100%) rename {source => docs/source}/apollo-client/meteor.md (100%) rename {source => docs/source}/apollo-client/network.md (100%) rename {source => docs/source}/apollo-client/react.md (92%) rename {source => docs/source}/apollo-client/redux.md (96%) create mode 100644 docs/source/apollo-server/connectors.md create mode 100644 docs/source/apollo-server/errors.md create mode 100644 docs/source/apollo-server/generate-schema.md rename {source => docs/source}/apollo-server/graphiql-test.png (100%) rename {source => docs/source}/apollo-server/guide.md (96%) rename {source => docs/source}/apollo-server/index.md (77%) create mode 100644 docs/source/apollo-server/mocking.md create mode 100644 docs/source/apollo-server/resolvers.md create mode 100644 docs/source/apollo-server/tools.md rename {source => docs/source}/index.md (100%) rename {source => docs/source}/logo/large.png (100%) rename {source => docs/source}/logo/square.png (100%) delete mode 100644 source/apollo-server/tools.md diff --git a/docs/_config.yml b/docs/_config.yml index dcbb435060f..8c7d0f93aa5 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -27,6 +27,11 @@ sidebar_categories: - apollo-server/index - apollo-server/guide - apollo-server/tools + - apollo-server/generate-schema + - apollo-server/resolvers + - apollo-server/mocking + - apollo-server/connectors + - apollo-server/errors github_repo: apollostack/docs content_root: source logo: diff --git a/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md similarity index 93% rename from source/apollo-client/angular2.md rename to docs/source/apollo-client/angular2.md index de15bb462c7..2dcd264e062 100644 --- a/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -75,7 +75,7 @@ class postsList {

Queries

-To bind to query you can use `watchQuery` method with the same arguments as [`ApolloClient#watchQuery`](http://docs.apollostack.com/apollo-client/core.html#watchQuery). In this case as the result you will receive the [`QueryObservable`](http://docs.apollostack.com/apollo-client/core.html#watchQuery). +To bind to query you can use `watchQuery` method with the same arguments as [`ApolloClient#watchQuery`](core.html#watchQuery). In this case as the result you will receive the [`QueryObservable`](core.html#watchQuery). Here's how you could run a query: @@ -120,7 +120,7 @@ class postsList {

Mutations

-To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](http://docs.apollostack.com/apollo-client/core.html#mutate). In this case as the result you will receive a promise that resolves to a GraphQLResult. +To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](core.html#mutate). In this case as the result you will receive a promise that resolves to a GraphQLResult. Here's how you would call a mutation and pass in arguments via variables: @@ -206,7 +206,7 @@ It allows you to define queries and mutations and to make them reactive. You can

Queries

-Each key on the object returned by `queries` function should be made up of the same possible arguments as [`ApolloClient#watchQuery`](http://docs.apollostack.com/apollo-client/core.html#watchQuery). +Each key on the object returned by `queries` function should be made up of the same possible arguments as [`ApolloClient#watchQuery`](core.html#watchQuery). Since `queries` function receives one argument which is a component's context you can use it to define variables. It is also reactive so your variables will be always up to date. @@ -266,7 +266,7 @@ class postsList {

Mutations

-`mutations` function returns an object made up of keys and values that are custom functions to call the mutation. The resulting function must return the same possible arguments as [`ApolloClient#mutate`](http://docs.apollostack.com/apollo-client/core.html#mutate) +`mutations` function returns an object made up of keys and values that are custom functions to call the mutation. The resulting function must return the same possible arguments as [`ApolloClient#mutate`](core.html#mutate) Since `mutations` function receives one argument which is a component's context you can use it to inside variables. It is also reactive so your variables will be always up to date. diff --git a/source/apollo-client/core.md b/docs/source/apollo-client/core.md similarity index 100% rename from source/apollo-client/core.md rename to docs/source/apollo-client/core.md diff --git a/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md similarity index 100% rename from source/apollo-client/devtools.md rename to docs/source/apollo-client/devtools.md diff --git a/source/apollo-client/index.md b/docs/source/apollo-client/index.md similarity index 100% rename from source/apollo-client/index.md rename to docs/source/apollo-client/index.md diff --git a/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md similarity index 100% rename from source/apollo-client/meteor.md rename to docs/source/apollo-client/meteor.md diff --git a/source/apollo-client/network.md b/docs/source/apollo-client/network.md similarity index 100% rename from source/apollo-client/network.md rename to docs/source/apollo-client/network.md diff --git a/source/apollo-client/react.md b/docs/source/apollo-client/react.md similarity index 92% rename from source/apollo-client/react.md rename to docs/source/apollo-client/react.md index 56adafb193a..465d6feb884 100644 --- a/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -140,7 +140,7 @@ const CategoryWithData = connect({ export default CategoryWithData; ``` -Each key on the object returned by mapQueriesToProps should be made up of the same possible arguments as [`ApolloClient#watchQuery`](http://docs.apollostack.com/apollo-client/index.html#watchQuery). In this case, the `Category` component will get a prop called `category`, which has the following keys: +Each key on the object returned by mapQueriesToProps should be made up of the same possible arguments as [`ApolloClient#watchQuery`](index.html#watchQuery). In this case, the `Category` component will get a prop called `category`, which has the following keys: ```js { @@ -151,7 +151,7 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa } ``` -`mapMutationsToProps` returns an object made up of keys and values that are custom functions to call the mutation. These can be used in children components (for instance, on a event handler) to trigger the mutation. The resulting function must return the same possible arguents as [`ApolloClient#mutate`](http://docs.apollostack.com/apollo-client/index.html#mutate). In this case, the `Category` component will get a prop called `postReply`, which has the following keys: +`mapMutationsToProps` returns an object made up of keys and values that are custom functions to call the mutation. These can be used in children components (for instance, on a event handler) to trigger the mutation. The resulting function must return the same possible arguents as [`ApolloClient#mutate`](index.html#mutate). In this case, the `Category` component will get a prop called `postReply`, which has the following keys: ```js { @@ -177,7 +177,7 @@ class Container extends React.Component{ .then((err, data) => { // if we have the data we want if (data.id) { - // refetch the categories query without variables, + // refetch the categories query without variables, // just refresh client store this.props.categories.refetch(); }; @@ -191,7 +191,7 @@ class Container extends React.Component{ ``` -`refetch(variables: optional)` also supports passing variables to refetch the same query with different set of variables. This would be handy for cases, when you just want to modify the variables to get new data. +`refetch(variables: optional)` also supports passing variables to refetch the same query with different set of variables. This would be handy for cases, when you just want to modify the variables to get new data. **For example:** diff --git a/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md similarity index 96% rename from source/apollo-client/redux.md rename to docs/source/apollo-client/redux.md index b303455fb2d..828afd7a14f 100644 --- a/source/apollo-client/redux.md +++ b/docs/source/apollo-client/redux.md @@ -75,4 +75,4 @@ store.getState();

react-redux

-The `react-apollo` integration package is a drop-in replacement for `react-redux`, so if you are using Redux and Apollo together you don't need to have nested data containers. [Read the docs for `react-apollo` to see how to do this.](http://docs.apollostack.com/apollo-client/react.html) +The `react-apollo` integration package is a drop-in replacement for `react-redux`, so if you are using Redux and Apollo together you don't need to have nested data containers. [Read the docs for `react-apollo` to see how to do this.](react.html) diff --git a/docs/source/apollo-server/connectors.md b/docs/source/apollo-server/connectors.md new file mode 100644 index 00000000000..0472ec08c77 --- /dev/null +++ b/docs/source/apollo-server/connectors.md @@ -0,0 +1,46 @@ +--- +title: Backend connectors +order: 207 +description: Factor out your code data loading logic into connectors. +--- + +Connectors are the parts that connect the GraphQL server to various backends, such as MySQL servers, MongoDB, Redis, REST, etc. The stores may be on the same server or on a different server, and the same GraphQL server may access a variety of different backend stores to get the data for just one request. + +Resolve functions act as a sort of switchboard, defining which connector should be used for which GraphQL types, and what arguments should be passed to it. While resolve functions should be stateless, connectors need to be stateful in many cases, for example to store information about the currently logged in user, or manage connections with the backend store. Because the same connector may be used in many resolve function, it has to be attached to the context, where all the resolve functions easily have access to it. + +

+ attachConnectorsToContext(schema, connectors) +

+ +`attachConnectorsToContext` takes two arguments: a GraphQLSchema and a `connectors` object that has connector classes as its named properties. The schema is modified in place such that for each query an instance of each connector will be constructed and attached to the context at the beginning of query execution, effectively making it a singleton that can keep state. + +```js +// in connectors.js +import { attachConnectorsToContext } from 'graphql-tools'; + +class AuthorConnector{ + constructor(){ + this.store = new Map() + map.set(1, { id: 1, firstName: 'Bill', lastName: 'Nye' }); + } + + get(key){ + return this.store.get(key); + } + set(key, value){ + return this.store.set(key, value); + } +} + +const connectors = { + Author: AuthorConnector, +}; + +attachConnectorsToContext(schema, connectors); + + +// --- in a resolve function --- +resolveAuthor(obj, args, context){ + return context.connectors.Author.get(args.id); +} +``` diff --git a/docs/source/apollo-server/errors.md b/docs/source/apollo-server/errors.md new file mode 100644 index 00000000000..3a452e83c61 --- /dev/null +++ b/docs/source/apollo-server/errors.md @@ -0,0 +1,32 @@ +--- +title: Error handling and logging +order: 204 +description: Add better error logging to your GraphQL schema. +--- + +GraphQL servers can be tricky to debug. The following functions can help find error faster in many cases. + +

+ forbidUndefinedInResolve(schema) +

+ +ForbidUndefinedInResolve can be used during debugging to find mistakes in resolve functions faster. Usually, resolve functions only return undefined due to programmer error. `forbidUndefinedInResolve` takes a GraphQLSchema as input, and modifies it in place to throw an error when a resolve function returns undefined, telling you exactly which resolver returned undefined. +```js +import { forbidUndefinedInResolve } from 'graphql-tools'; + +forbidUndefinedInResolve(schema); +``` + + +

+ addErrorLoggingToSchema(schema, logger) +

+ +This function may be deprecated in the near future. Instead of using addErrorLoggingToSchema, the `formatError` option of `apolloServer` or `graphqlHTTP` should be used, which was recently added in graphql-js v0.5.0 + +`addErorrLoggingToSchema` takes two arguments: `schema` and `logger`. `schema` must be an instance of `GraphQLSchema`, `logger` must be an Object with a callable property `log`. Every time an error occurs, `logger.log(e)` will be called. +```js +import { addErrorLoggingToSchema } from 'graphql-tools'; +const logger = { log: (e) => console.error(e.stack) }; +addErrorLoggingToSchema(mySchema, logger); +``` diff --git a/docs/source/apollo-server/generate-schema.md b/docs/source/apollo-server/generate-schema.md new file mode 100644 index 00000000000..1ae8c551360 --- /dev/null +++ b/docs/source/apollo-server/generate-schema.md @@ -0,0 +1,77 @@ +--- +title: GraphQL type language +order: 204 +description: Generate a GraphQL schema from the concise type definition language. +--- + +The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `generateSchema`. + +

generateSchema(typeDefinitions)

+ +``` +import { generateSchema } from 'graphql-tools'; + +const jsSchema = generateSchema(typeDefinitions); +``` + +`typeDefinitions` should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. The schema must define a query type, which means a minimal schema would look something like this: +```js +const typeDefinition = [` + schema { + query: RootQuery + } + + type RootQuery { + aNumber: Int + } +`]; + +const jsSchema = generateSchema(typeDefinition); +``` + +If your schema gets large, you may want to define parts of it in different files and import them to create the full schema. This is possible by including them in the array. If there are circular dependencies, the array should be wrapped in arrow function. `generateSchema` will only include each type definition once, even if it is imported multiple times by different types. + +```js +// in author.js ------------------- +import Book from './book'; + +const Author = ` + type Author { + name: String + books: [Book] + } +`; + +export default () => [Author, Book]; + +// in book.js ----------------------- +import Author from './author'; + +const Book = ` + type Book { + title: String + author: Author + } +`; + +export default () => [Book, Author]; + +// in schema.js ---------------------- +import Author from './author.js'; + +const RootQuery = ` + type RootQuery { + author(name: String): Author + } +`; + +const SchemaDefinition = ` + schema { + query: RootQuery + } +`; + +export default generateSchema([SchemaDefinition, RootQuery, Author]); +``` + +This [GraphQL schema language cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png) by Hafiz Ismail is an excellent reference for all the features of the GraphQL schema language. diff --git a/source/apollo-server/graphiql-test.png b/docs/source/apollo-server/graphiql-test.png similarity index 100% rename from source/apollo-server/graphiql-test.png rename to docs/source/apollo-server/graphiql-test.png diff --git a/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md similarity index 96% rename from source/apollo-server/guide.md rename to docs/source/apollo-server/guide.md index 4a7322b62e7..1db5e3ffea2 100644 --- a/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -1,5 +1,5 @@ --- -title: GraphQL server tutorial +title: Tutorial order: 202 description: A step-by-step guide for setting up a basic GraphQL server with Apollo. --- @@ -9,6 +9,7 @@ This guide will explain all the parts required for a simple GraphQL Blog server. We'll be using a package called [graphql-tools](https://www.npmjs.com/package/graphql-tools), which is actively being developed for [Apollo](http://www.apollostack.com). There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. ## Setup + For the remainder of this guide, we'll assume that you are familiar with using the command line of your operating system and already have Node 5 and npm set up for your environment. If that's not the case, you should [do that first](https://nodejs.org/en/download/package-manager/) before you read the rest of this guide. @@ -30,7 +31,8 @@ If all goes well, the server should now print out a message that it is listening ![Testing the server with GraphiQL](graphiql-test.png) **For advanced users:** -If you already have an express server or a GraphQL server set up, then you can also simply install graphql-tools with the command `npm install graphql-tools` and jump to the [Tools](tools.html) section in this guide to learn about using the individual parts of the graphql-tools package. + +If you already have an express server or a GraphQL server set up, then you can also simply install graphql-tools with the command `npm install graphql-tools` and read the articles listed in the sidebar to learn about using the individual parts of the graphql-tools package. ## Schema @@ -51,11 +53,11 @@ export default [typeDefinitions]; ``` ApolloServer uses the GraphQL schema language notation, which it then compiles to a GraphQL-JS schema. With the current schema, our server provides exactly one entry point `testString`, which returns a String. -The schema notation supports all GraphQL types. In this tutorial we are only going to use a few of them. You can learn about all the others in the [schema creation subsection of Tools](http://docs.apollostack.com/apollo-server/tools.html#Schema-creation). +The schema notation supports all GraphQL types. In this tutorial we are only going to use a few of them. You can learn about all the others in the [schema generation docs](generate-schema.html). For the blog app, we're going to use a schema that has the following two types: Authors and Posts. For each type, the schema defines which fields it has, and how it relates to the other types. The fields of the RootQuery and RootMutation types are the client's entry points to the schema. Every query or mutation has to start there, but it can ask for as much or as little data as it wants by expanding the fields when necessary. -````js +```js const typeDefinitions = ` type Author { id: Int! # the ! means that every author object _must_ have an id @@ -103,7 +105,8 @@ schema { export default [typeDefinitions]; ``` -For more information about GraphQL's type system and schema language, you can take a look at @sogko's [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](http://docs.apollostack.com/apollo-server/tools.html#Schema-creation) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). + +For more information about GraphQL's type system and schema language, you can take a look at @sogko's [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](schema-generation.html) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). ## Mocking diff --git a/source/apollo-server/index.md b/docs/source/apollo-server/index.md similarity index 77% rename from source/apollo-server/index.md rename to docs/source/apollo-server/index.md index 4b090da7954..3cf3843ba30 100644 --- a/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -11,4 +11,4 @@ Apollo GraphQL Tools is a collection of functions and an opinionated guide for h npm install graphql-tools ``` -The Apollo GraphQL tools are not just useful for building servers, they can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. Information on how to use individual tools with GraphQL-JS can be found in the Tools section of this guide. +The Apollo GraphQL tools are not just useful for building servers, they can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. diff --git a/docs/source/apollo-server/mocking.md b/docs/source/apollo-server/mocking.md new file mode 100644 index 00000000000..22e2b940537 --- /dev/null +++ b/docs/source/apollo-server/mocking.md @@ -0,0 +1,17 @@ +--- +title: Mocking +order: 206 +description: Mock your GraphQL data based on a schema. +--- + +

+ mockServer(schema, mocks = {}, preserveResolvers = false) +

+ +For more information about how to use the `mockServer` function, see the [Medium Post about mocking](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd). + +

+ addMocksToSchema(schema, mocks = {}, preserveResolvers = false) +

+ +`addMocksToSchema` is the function that `mockServer` uses under the hood. Given an instance of GraphQLSchema and a mock object, it modifies the schema in place to return mock data for any valid query that is sent to the server. If `mocks` is not passed, the defaults will be used for each of the scalar types. If `preserveResolvers` is set to `true`, existing resolve functions will not be overwritten to provide mock data. This can be used to mock some parts of the server and not others. diff --git a/docs/source/apollo-server/resolvers.md b/docs/source/apollo-server/resolvers.md new file mode 100644 index 00000000000..1822c28be3a --- /dev/null +++ b/docs/source/apollo-server/resolvers.md @@ -0,0 +1,52 @@ +--- +title: Adding resolvers +order: 205 +description: Add resolvers to a GraphQL schema. +--- + +## Resolve functions +In order to respond to queries, a schema needs to have resolve functions. Resolve functions cannot be included in the GraphQL schema language, so they must be added separately. + +

+ addResolveFunctionsToSchema(schema, resolveFunctions) +

+ +`addResolveFunctionsToSchema` takes two arguments, a GraphQLSchema and an object defining resolve functions, and modifies the schema in place to. The `resolveFunctions` object should have one property for each type that has fields which need a resolve function. The following is an example of a valid resolveFunctions object: +```js +import { addResolveFunctionsToSchema } from 'graphql-tools'; + +const resolveFunctions = { + RootQuery: { + author(root, { name }){ + return Author.find({ name }); + }, + }, +}; + +addResolveFunctionsToSchema(schema, resolveFunctions); +``` + +For types which need to define additional properties, such as `resolveType` for unions and interfaces, the property can be set by prefixing it with two underscores, eg. `__resolveType` for `resolveType`: + +```js +const resolveFunctions = { + SomeUnionType: { + __resolveType(data, context, info){ + if(data.wingspan){ + return info.schema.getType('Airplane'); + } + if(data.horsepower){ + return info.schema.getType('Car'); + } + return null; + }, + }, +}; +``` +Note that if the types were defined in GraphQL schema language, the `info` argument to `resolveType` must be used to get a reference to the actual type, eg. `return info.schema.getType("Person")`. This may be changed in the future to support returning just the name of the type, eg. `return "Person"`. + +

+ addSchemaLevelResolver(schema, rootResolveFunction) +

+ +Some operations, such as authentication, need to be done only once per query. Logically, these operations belong in a root resolve function, but unfortunately GraphQL-JS does not let you define one. `addSchemaLevelResolver` solves this by modifying the GraphQLSchema that is passed as the first argument. diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md new file mode 100644 index 00000000000..914ef38a5e0 --- /dev/null +++ b/docs/source/apollo-server/tools.md @@ -0,0 +1,134 @@ +--- +title: Apollo Server +order: 203 +description: Put together all of the Apollo GraphQL tools to create an HTTP server. +--- + +While `apolloServer` can be used as an express middleware, graphql-tools exports all the functions that `apolloServer` uses internally, so they can be used separately with any GraphQL-JS schema. This section documents all the functions that graphql-tools exports, and explains how they can be used. + +

apolloServer(schema, [...])

+ +`apolloServer` is a convenient function that generates an express middleware (it uses express-graphql under the hood). It combines all of the tools in graphql-tools and has a simple to use interface: + +``` +import { apolloServer } from 'graphql-tools'; + +var app = express(); + +app.use('/graphql', apolloServer({ schema: typeDefinitionArray, graphiql: true })); +``` + +**Function signature** + +``` +apolloServer({ + // options in common with graphqlHTTP from express-graphql + schema: GraphQLSchema | [typeDefinition], + formatError: function, // optional + graphiql: Boolean, // optional + pretty: Boolean, // optional + validationRules: Array, // optional + context: any, // optional + rootValue: any // optional + + // options specific to apolloServer + resolvers: Object, // required if schema is an array of type definitions + connectors: Object, // optional + mocks: Object, // optional + allowUndefinedInResolve: Boolean, // optional + printErrors: Boolean, // optional + }) +``` + +The function `apolloServer` wraps the `graphqlHTTP` middleware from `express-graphql`. If you replace an existing call to `graphqlHTTP` with a call to `apolloServer`, the resulting express middleware will behave in exactly the same way. For the documentation of the graphqlHTTP arguments, refer to the express-graphql [documentation](https://github.com/graphql/express-graphql#options). + +**schema** +In place of a GraphQLSchema, `apolloServer` also accepts an array of GraphQL schema language type definitions as described in [Schema creation](#Schema-creation). + +**resolvers** +Resolvers is a required option if the schema provided to `apolloServer` is in GraphQL schema language. If defined, the option `resolvers` expects an Object that defines a resolve function for each non-scalar field of every type defined in the schema. Fields that take arguments also require a resolve function. A simple example defining a single resolve function for the `author` field of the `RootQuery` type is given below. A more detailed description is given in [Resolve functions](#Resolve-functions). Resolve functions should be stateless. + +```js +const resolvers = { + RootQuery: { + author(root, args){ + return Authors.findOne(args); + } + } +} +``` + +**connectors** +Connectors is not a required option. If provided, the option `connectors` expects an Object that has connector classes as its named property. An instance of each connector will be constructed and attached to the context at the beginning of query execution, effectively making it a singleton that can keep state. This requires that if given, the `context` argument is an object. + +```js +// in connectors.js +class AuthorConnector{ + constructor(){ + this.store = new Map() + map.set(1, { id: 1, firstName: 'Bill', lastName: 'Nye' }); + } + + get(key){ + return this.store.get(key); + } + set(key, value){ + return this.store.set(key, value); + } +} + +const connectors = { + author: AuthorConnector +}; + +export default connectors; +``` + +To use connectors in a resolve function: +```js +// in resolvers.js +const resolvers = { + RootQuery: { + author(root, args, context) => { + return context.connectors.author.get(args.id); + }); + } +} +``` + +**mocks** +If provided, `mocks` will mock the results of the GraphQL query, overriding any resolve functions defined on the schema. `mocks` expects an object with one function per type that should be mocked. If no function is provided for a type, the default mock will be used, which means that you can call `apolloServer` with `mocks: {}` to get started quickly. + +Mocks for scalar types, such as Int and Boolean will be used everywhere, unless they are overridden by a more specific mock defined in a non-scalar type. Mocks for non-scalar types must be a function that returns an object with the desired properties. + +```js +import { MockList } from 'graphql-tools'; + +const mocks = { + Int: () => 55, + RootQuery: () => ({ + author: (_, args) => { + return {id: args.id}, // results in a mocked author object with id args.id + }, + posts: (_, args) => { + // results in a mocked list of posts of length between 1 and 5, all having + // tags = [args.tag] + return new MockList([1,5], (_, args) => ({ tags: [args.tag] })); + } + }) +``` + +Mock functions are a special kind of resolve function, which means they have access to the same arguments that resolve functions have, including arguments and context. + +`MockList` can be used to mock a list of items of a specific (or random) length. + +You can read more about mocking with graphql-tools in this [Medium Post on mocking with GraphQL](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd), which also includes more code snippets and a demo. + + +**printErrors** +If `printErrors` is set to `true`, the GraphQL server will print all errors that occurred inside resolve functions to the console. By default this option is false, and GraphQL errors will not be printed to the server console, but only returned in the errors field of the query response. + +**allowUndefinedInResolve** +If `allowUndefinedInResolve` is set to `false`, `apolloServer` will throw an Error every time a resolve function returns `undefined`. Usually returning `undefined` from a user-defined resolve function is due to a programming mistake, so this option can be helpful for debugging. + +If execution should not continue, resolve functions should return `null` and not `undefined`. diff --git a/source/index.md b/docs/source/index.md similarity index 100% rename from source/index.md rename to docs/source/index.md diff --git a/source/logo/large.png b/docs/source/logo/large.png similarity index 100% rename from source/logo/large.png rename to docs/source/logo/large.png diff --git a/source/logo/square.png b/docs/source/logo/square.png similarity index 100% rename from source/logo/square.png rename to docs/source/logo/square.png diff --git a/source/apollo-server/tools.md b/source/apollo-server/tools.md deleted file mode 100644 index 4264bdef491..00000000000 --- a/source/apollo-server/tools.md +++ /dev/null @@ -1,354 +0,0 @@ ---- -title: Documentation for graphql-tools -order: 203 -description: API documentation for the Apollo GraphQL tools. ---- - -While `apolloServer` can be used as an express middleware, graphql-tools exports all the functions that `apolloServer` uses internally, so they can be used separately with any GraphQL-JS schema. This section documents all the functions that graphql-tools exports, and explains how they can be used. - -## Express middleware - -

apolloServer(schema, [...])

- -`apolloServer` is a convenient function that generates an express middleware (it uses express-graphql under the hood). It combines all of the tools in graphql-tools and has a simple to use interface: - -``` -import { apolloServer } from 'graphql-tools'; - -var app = express(); - -app.use('/graphql', apolloServer({ schema: typeDefinitionArray, graphiql: true })); -``` - -**Function signature** - -``` -apolloServer({ - // options in common with graphqlHTTP from express-graphql - schema: GraphQLSchema | [typeDefinition], - formatError: function, // optional - graphiql: Boolean, // optional - pretty: Boolean, // optional - validationRules: Array, // optional - context: any, // optional - rootValue: any // optional - - // options specific to apolloServer - resolvers: Object, // required if schema is an array of type definitions - connectors: Object, // optional - mocks: Object, // optional - allowUndefinedInResolve: Boolean, // optional - printErrors: Boolean, // optional - }) -``` - -The function `apolloServer` wraps the `graphqlHTTP` middleware from `express-graphql`. If you replace an existing call to `graphqlHTTP` with a call to `apolloServer`, the resulting express middleware will behave in exactly the same way. For the documentation of the graphqlHTTP arguments, refer to the express-graphql [documentation](https://github.com/graphql/express-graphql#options). - -**schema** -In place of a GraphQLSchema, `apolloServer` also accepts an array of GraphQL schema language type definitions as described in [Schema creation](#Schema-creation). - -**resolvers** -Resolvers is a required option if the schema provided to `apolloServer` is in GraphQL schema language. If defined, the option `resolvers` expects an Object that defines a resolve function for each non-scalar field of every type defined in the schema. Fields that take arguments also require a resolve function. A simple example defining a single resolve function for the `author` field of the `RootQuery` type is given below. A more detailed description is given in [Resolve functions](#Resolve-functions). Resolve functions should be stateless. - -```js -const resolvers = { - RootQuery: { - author(root, args){ - return Authors.findOne(args); - } - } -} -``` - -**connectors** -Connectors is not a required option. If provided, the option `connectors` expects an Object that has connector classes as its named property. An instance of each connector will be constructed and attached to the context at the beginning of query execution, effectively making it a singleton that can keep state. This requires that if given, the `context` argument is an object. - -```js -// in connectors.js -class AuthorConnector{ - constructor(){ - this.store = new Map() - map.set(1, { id: 1, firstName: 'Bill', lastName: 'Nye' }); - } - - get(key){ - return this.store.get(key); - } - set(key, value){ - return this.store.set(key, value); - } -} - -const connectors = { - author: AuthorConnector -}; - -export default connectors; -``` - -To use connectors in a resolve function: -```js -// in resolvers.js -const resolvers = { - RootQuery: { - author(root, args, context) => { - return context.connectors.author.get(args.id); - }); - } -} -``` - -**mocks** -If provided, `mocks` will mock the results of the GraphQL query, overriding any resolve functions defined on the schema. `mocks` expects an object with one function per type that should be mocked. If no function is provided for a type, the default mock will be used, which means that you can call `apolloServer` with `mocks: {}` to get started quickly. - -Mocks for scalar types, such as Int and Boolean will be used everywhere, unless they are overridden by a more specific mock defined in a non-scalar type. Mocks for non-scalar types must be a function that returns an object with the desired properties. - -```js -import { MockList } from 'graphql-tools'; - -const mocks = { - Int: () => 55, - RootQuery: () => ({ - author: (_, args) => { - return {id: args.id}, // results in a mocked author object with id args.id - }, - posts: (_, args) => { - // results in a mocked list of posts of length between 1 and 5, all having - // tags = [args.tag] - return new MockList([1,5], (_, args) => ({ tags: [args.tag] })); - } - }) -``` - -Mock functions are a special kind of resolve function, which means they have access to the same arguments that resolve functions have, including arguments and context. - -`MockList` can be used to mock a list of items of a specific (or random) length. - -You can read more about mocking with graphql-tools in this [Medium Post on mocking with GraphQL](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd), which also includes more code snippets and a demo. - - -**printErrors** -If `printErrors` is set to `true`, the GraphQL server will print all errors that occurred inside resolve functions to the console. By default this option is false, and GraphQL errors will not be printed to the server console, but only returned in the errors field of the query response. - -**allowUndefinedInResolve** -If `allowUndefinedInResolve` is set to `false`, `apolloServer` will throw an Error every time a resolve function returns `undefined`. Usually returning `undefined` from a user-defined resolve function is due to a programming mistake, so this option can be helpful for debugging. - -If execution should not continue, resolve functions should return `null` and not `undefined`. - -## Schema creation - -The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `generateSchema`. - -

generateSchema(typeDefinitions)

- -**Function signature** -``` -import { generateSchema } from 'graphql-tools'; - -const jsSchema = generateSchema(typeDefinitions); -``` - -`typeDefinitions` should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. The schema must define a query type, which means a minimal schema would look something like this: -```js -const typeDefinition = [` -schema { - query: RootQuery -} - -type RootQuery { - aNumber: Int -}`]; - -const jsSchema = generateSchema(typeDefinition); -``` - -If your schema gets large, you may want to define parts of it in different files and import them to create the full schema. This is possible by including them in the array. If there are circular dependencies, the array should be wrapped in arrow function. `generateSchema` will only include each type definition once, even if it is imported multiple times by different types. - -```js -// in author.js ------------------- -import Book from './book'; - -const Author = ` - type Author { - name: String - books: [Book] - } -`; - -export default () => [Author, Book]; - -// in book.js ----------------------- -import Author from './author'; - -const Book = ` - type Book { - title: String - author: Author - } -`; - -export default () => [Book, Author]; - -// in schema.js ---------------------- -import Author from './author.js'; - -const RootQuery = ` - type RootQuery { - author(name: String): Author - } -`; - -const SchemaDefinition = ` - schema { - query: RootQuery - } -`; - -export default generateSchema([SchemaDefinition, RootQuery, Author]); -``` - -This [GraphQL schema language cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png) by Hafiz Ismail is an excellent reference for all the features of the GraphQL schema language. - - -## Resolve functions -In order to respond to queries, a schema needs to have resolve functions. Resolve functions cannot be included in the GraphQL schema language, so they must be added separately. - -

- addResolveFunctionsToSchema(schema, resolveFunctions) -

- -`addResolveFunctionsToSchema` takes two arguments, a GraphQLSchema and an object defining resolve functions, and modifies the schema in place to. The `resolveFunctions` object should have one property for each type that has fields which need a resolve function. The following is an example of a valid resolveFunctions object: -```js -import { addResolveFunctionsToSchema } from 'graphql-tools'; - -const resolveFunctions = { - RootQuery: { - author(root, { name }){ - return Author.find({ name }); - }, - }, -}; - -addResolveFunctionsToSchema(schema, resolveFunctions); -``` - -For types which need to define additional properties, such as `resolveType` for unions and interfaces, the property can be set by prefixing it with two underscores, eg. `__resolveType` for `resolveType`: - -```js -const resolveFunctions = { - SomeUnionType: { - __resolveType(data, context, info){ - if(data.wingspan){ - return info.schema.getType('Airplane'); - } - if(data.horsepower){ - return info.schema.getType('Car'); - } - return null; - }, - }, -}; -``` -Note that if the types were defined in GraphQL schema language, the `info` argument to `resolveType` must be used to get a reference to the actual type, eg. `return info.schema.getType("Person")`. This may be changed in the future to support returning just the name of the type, eg. `return "Person"`. - -

- addSchemaLevelResolver(schema, rootResolveFunction) -

- -Some operations, such as authentication, need to be done only once per query. Logically, these operations belong in a root resolve function, but unfortunately GraphQL-JS does not let you define one. `addSchemaLevelResolver` solves this by modifying the GraphQLSchema that is passed as the first argument. - -## Mocking - -

- mockServer(schema, mocks = {}, preserveResolvers = false) -

- -For more information about how to use the `mockServer` function, see the [Medium Post about mocking](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd). - -

- addMocksToSchema(schema, mocks = {}, preserveResolvers = false) -

- -`addMocksToSchema` is the function that `mockServer` uses under the hood. Given an instance of GraphQLSchema and a mock object, it modifies the schema in place to return mock data for any valid query that is sent to the server. If `mocks` is not passed, the defaults will be used for each of the scalar types. If `preserveResolvers` is set to `true`, existing resolve functions will not be overwritten to provide mock data. This can be used to mock some parts of the server and not others. - -## Logging and performance profiling - -coming soon ... - -## Authentication and authorization - -coming soon ... - -## Unit- and integration testing - -coming soon ... - -## Connectors -Connectors are the parts that connect the GraphQL server to various backends, such as MySQL servers, MongoDB, Redis, REST, etc. The stores may be on the same server or on a different server, and the same GraphQL server may access a variety of different backend stores to get the data for just one request. - -Resolve functions act as a sort of switchboard, defining which connector should be used for which GraphQL types, and what arguments should be passed to it. While resolve functions should be stateless, connectors need to be stateful in many cases, for example to store information about the currently logged in user, or manage connections with the backend store. Because the same connector may be used in many resolve function, it has to be attached to the context, where all the resolve functions easily have access to it. - -

- attachConnectorsToContext(schema, connectors) -

- -`attachConnectorsToContext` takes two arguments: a GraphQLSchema and a `connectors` object that has connector classes as its named properties. The schema is modified in place such that for each query an instance of each connector will be constructed and attached to the context at the beginning of query execution, effectively making it a singleton that can keep state. - -```js -// in connectors.js -import { attachConnectorsToContext } from 'graphql-tools'; - -class AuthorConnector{ - constructor(){ - this.store = new Map() - map.set(1, { id: 1, firstName: 'Bill', lastName: 'Nye' }); - } - - get(key){ - return this.store.get(key); - } - set(key, value){ - return this.store.set(key, value); - } -} - -const connectors = { - Author: AuthorConnector, -}; - -attachConnectorsToContext(schema, connectors); - - -// --- in a resolve function --- -resolveAuthor(obj, args, context){ - return context.connectors.Author.get(args.id); -} -``` - -## Error handling + error logging -GraphQL servers can be tricky to debug. The following functions can help find error faster in many cases. - -

- forbidUndefinedInResolve(schema) -

- -ForbidUndefinedInResolve can be used during debugging to find mistakes in resolve functions faster. Usually, resolve functions only return undefined due to programmer error. `forbidUndefinedInResolve` takes a GraphQLSchema as input, and modifies it in place to throw an error when a resolve function returns undefined, telling you exactly which resolver returned undefined. -```js -import { forbidUndefinedInResolve } from 'graphql-tools'; - -forbidUndefinedInResolve(schema); -``` - - -

- addErrorLoggingToSchema(schema, logger) -

- -This function may be deprecated in the near future. Instead of using addErrorLoggingToSchema, the `formatError` option of `apolloServer` or `graphqlHTTP` should be used, which was recently added in graphql-js v0.5.0 - -`addErorrLoggingToSchema` takes two arguments: `schema` and `logger`. `schema` must be an instance of `GraphQLSchema`, `logger` must be an Object with a callable property `log`. Every time an error occurs, `logger.log(e)` will be called. -```js -import { addErrorLoggingToSchema } from 'graphql-tools'; -const logger = { log: (e) => console.error(e.stack) }; -addErrorLoggingToSchema(mySchema, logger); -``` From e3f57d617f61c61dc25f2f6453c8268a82997413 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 22 Apr 2016 16:27:07 -0700 Subject: [PATCH 100/409] fix generateSchema signature --- docs/source/apollo-server/generate-schema.md | 10 +++++++--- themes/meteor | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-server/generate-schema.md b/docs/source/apollo-server/generate-schema.md index 1ae8c551360..dedc548c28f 100644 --- a/docs/source/apollo-server/generate-schema.md +++ b/docs/source/apollo-server/generate-schema.md @@ -6,15 +6,19 @@ description: Generate a GraphQL schema from the concise type definition language The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `generateSchema`. -

generateSchema(typeDefinitions)

+

generateSchema(typeDefinitions, resolveFunctions)

``` import { generateSchema } from 'graphql-tools'; -const jsSchema = generateSchema(typeDefinitions); +const jsSchema = generateSchema(typeDefinitions, resolveFunctions ); ``` -`typeDefinitions` should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. The schema must define a query type, which means a minimal schema would look something like this: +`typeDefinitions` should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. + +`resolveFunctions` should be an object that follows the pattern explained in the guide [section on resolvers](http://docs.apollostack.com/apollo-server/resolvers.html). + +The type definitions must define a query type, which means a minimal schema would look something like this: ```js const typeDefinition = [` schema { diff --git a/themes/meteor b/themes/meteor index b58ed19861f..f6333f5c251 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit b58ed19861fa33df32e42346262b5cb21f6530c8 +Subproject commit f6333f5c251f1acf3929fac7ee3da791d15077be From f870d09dc2e7a1e1633fe4149e5bee5762147de6 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 23 Apr 2016 16:43:46 -0700 Subject: [PATCH 101/409] update docs for mocking --- docs/source/apollo-server/mocking.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/apollo-server/mocking.md b/docs/source/apollo-server/mocking.md index 22e2b940537..c2c282fa135 100644 --- a/docs/source/apollo-server/mocking.md +++ b/docs/source/apollo-server/mocking.md @@ -15,3 +15,4 @@ For more information about how to use the `mockServer` function, see the [Medium `addMocksToSchema` is the function that `mockServer` uses under the hood. Given an instance of GraphQLSchema and a mock object, it modifies the schema in place to return mock data for any valid query that is sent to the server. If `mocks` is not passed, the defaults will be used for each of the scalar types. If `preserveResolvers` is set to `true`, existing resolve functions will not be overwritten to provide mock data. This can be used to mock some parts of the server and not others. +`mockServer` will set the `context` to `{}` when invoking `graphql`, which means that the mock functions could use that context to store additional information for mocking, such as relationships between different types. From e79e7944d11fbe0aabdea29c4edff3f6cf64b6b4 Mon Sep 17 00:00:00 2001 From: Aayush Kapoor Date: Sun, 24 Apr 2016 20:58:14 +0530 Subject: [PATCH 102/409] Update react.md --- docs/source/apollo-client/react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 465d6feb884..21b2eb9512a 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -7,7 +7,7 @@ description: How to use the Apollo Client to fetch GraphQL data in your React ap This package allows you to easily integrate your Apollo client and Redux store with your React components. It works almost exactly like [react-redux](https://github.com/reactjs/react-redux). ```txt -npm install apollo-client +npm install react-apollo --save ``` [Follow apollostack/react-apollo on GitHub.](https://github.com/apollostack/react-apollo) From b0ab897c038154ed684fbf5a73b297e7e2b63322 Mon Sep 17 00:00:00 2001 From: abhiaiyer91 Date: Mon, 25 Apr 2016 19:40:55 -0700 Subject: [PATCH 103/409] Add meteor integration example to index.md --- docs/source/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/index.md b/docs/source/index.md index b058cdbec37..e69b767de27 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -26,3 +26,4 @@ We have put together some basic example apps using various parts of Apollo; chec - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) +- [A Meteor Integration example that uses SQL, MonogDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) From 5fc6c55de979c3a6c83f7b62bd6fec0859cf93ea Mon Sep 17 00:00:00 2001 From: James Baxley Date: Mon, 25 Apr 2016 23:03:47 -0400 Subject: [PATCH 104/409] update react-apollo api for changes to returned prop (#49) Corresponding PR (https://github.com/apollostack/react-apollo/pull/31) and issue (https://github.com/apollostack/react-apollo/issues/30) --- docs/source/apollo-client/react.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 21b2eb9512a..f6d19678c36 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -146,8 +146,8 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa { loading: boolean, errors: Error[], - result: GraphQLResult, - refetch: Function(variables) + refetch: Function(variables), + getCategory: Data // only when the query has returned } ``` @@ -157,7 +157,7 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa { loading: boolean, errors: Error[], - result: GraphQLResult, + postReply: Data, // only when the muation has returned } ``` From 9e939999622fbb6648a020885dd7012e6806aeef Mon Sep 17 00:00:00 2001 From: Patrick Metzdorf Date: Wed, 27 Apr 2016 17:22:58 +0100 Subject: [PATCH 105/409] Update Node version being referenced * Document fetch polyfill * update current node version * get rid of old paragraph. * comment out fetch as before --- docs/source/apollo-client/core.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index 62da724debf..1ff61f76e6f 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -91,7 +91,7 @@ Here's how you would run a single query and get the result: ```js import ApolloClient from 'apollo-client'; -// Polyfill fetch into the global namespace if required. +// Polyfill fetch into the namespace if required. // import fetch from 'isomorphic-fetch'; const client = new ApolloClient(); @@ -260,6 +260,6 @@ Right now, this is a bit verbose because you have to list the names of the varia

Fetch Polyfill

-Apollo uses [fetch](https://fetch.spec.whatwg.org/) behind the scenes to make HTTP requests. Be aware that many browser versions now support the `window.fetch` function natively (check [caniuse.com](http://caniuse.com/#feat=fetch)), but Node, for example, doesn't (as of v5). +Apollo uses [fetch](https://fetch.spec.whatwg.org/) behind the scenes to make HTTP requests. Be aware that many browser versions now support the `window.fetch` function natively (check [caniuse.com](http://caniuse.com/#feat=fetch)), but Node, for example, doesn't (as of v6). Where it is not supported, you can use one of several popular polyfills, including [whatwg-fetch](https://github.com/github/fetch), [node-fetch](https://github.com/bitinn/node-fetch) or [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch). From 3299f5a14b4542a00c6467fc90386aa49bc4b121 Mon Sep 17 00:00:00 2001 From: Brady Whitten Date: Wed, 27 Apr 2016 10:43:31 -0700 Subject: [PATCH 106/409] add concrete example of store rehydration using react (#52) --- docs/source/apollo-client/index.md | 31 ++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index e9fa3b8f1b3..b86a8db9bc9 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -98,18 +98,33 @@ For applications that support server side rendering, or that can perform some qu > Note: if you are using redux externally to apollo, and already have store rehydration, this key isn't needed. +On the server during render and after the application has retrieved all of the data it needs, send the initial state context by assigning the serialized value of the state to somewhere which will be accessible to the client. + +For example, using React +```jsx +// on the server +import { renderToStaticMarkup } from 'react-dom/server'; + +// client is an instance of ApolloClient +const initialState = client.store.getState(); + +const Html = (props) => ( + + + + + +); + +const staticMarkup = renderToStaticMarkup(); +// Now return the static markup to the client... +``` +After using the above as the initial server-side rendered HTML, on the client you would will then rehydrate the client using the initial state passed from the server ```js -// on server during render -// after application has gotten all of the data it needs -const initialState = client.store.getState() -// inject into template - - // on client const client = new ApolloClient({ - initialState: __APOLLO_STORE__, + initialState: window.__APOLLO_CONTEXT__, }); ``` Then, when a client calls ApolloClient#query or ApolloClient#watchQuery, the data should be returned instantly because it is already in the store! This also makes full page server side rendering without a page rebuild (if using react for instance) possible because the server rendered template won't differ from the client) - From 3284e33b1f02b80fdb11a4f5234fe35884f9d903 Mon Sep 17 00:00:00 2001 From: Matteo De Micheli Date: Sat, 30 Apr 2016 17:26:55 +0200 Subject: [PATCH 107/409] Fix wrong spelling of MongoDB --- docs/source/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index e69b767de27..3433d19ff0a 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -26,4 +26,4 @@ We have put together some basic example apps using various parts of Apollo; chec - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) -- [A Meteor Integration example that uses SQL, MonogDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) +- [A Meteor Integration example that uses SQL, MongoDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) From babfa1c29d416535d6bfac42173a3f46a2a6dc6a Mon Sep 17 00:00:00 2001 From: abhiaiyer91 Date: Mon, 2 May 2016 09:58:28 -0700 Subject: [PATCH 108/409] add more to docs --- docs/source/index.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/source/index.md b/docs/source/index.md index e69b767de27..65938e00486 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -23,7 +23,14 @@ To read more about Apollo in general, visit: We have put together some basic example apps using various parts of Apollo; check them out to see how everything fits together. We're always looking for improvements and feedback on these apps, and they'll get better as Apollo becomes more production-ready! -- [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) -- [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) +### Meteor Examples - [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) +- [A simple counter example](https://github.com/abhiaiyer91/meteor-apollo-counter) +- [Instagram Recent Search](https://github.com/abhiaiyer91/meteor-instagram-apollo) +- [Shopping Cart](https://github.com/abhiaiyer91/meteor-pg-apollo-shopping-cart) - [A Meteor Integration example that uses SQL, MonogDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) + +### General JS Examples +- [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) +- [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) + From 2ca54670b755dcf84d7948870643db7ea83c6982 Mon Sep 17 00:00:00 2001 From: Abhi Aiyer Date: Mon, 2 May 2016 10:02:45 -0700 Subject: [PATCH 109/409] add more to docs (#57) --- docs/source/index.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/source/index.md b/docs/source/index.md index 3433d19ff0a..65938e00486 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -23,7 +23,14 @@ To read more about Apollo in general, visit: We have put together some basic example apps using various parts of Apollo; check them out to see how everything fits together. We're always looking for improvements and feedback on these apps, and they'll get better as Apollo becomes more production-ready! +### Meteor Examples +- [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) +- [A simple counter example](https://github.com/abhiaiyer91/meteor-apollo-counter) +- [Instagram Recent Search](https://github.com/abhiaiyer91/meteor-instagram-apollo) +- [Shopping Cart](https://github.com/abhiaiyer91/meteor-pg-apollo-shopping-cart) +- [A Meteor Integration example that uses SQL, MonogDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) + +### General JS Examples - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) -- [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) -- [A Meteor Integration example that uses SQL, MongoDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) + From fac45272daa36f77ddab46294a357e89c3c2e35b Mon Sep 17 00:00:00 2001 From: James Baxley Date: Mon, 2 May 2016 17:23:42 -0400 Subject: [PATCH 110/409] add in information about the option to poll a query (#53) --- docs/source/apollo-client/core.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index 1ff61f76e6f..588d27b88c8 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -132,6 +132,7 @@ Run a GraphQL query and return a QueryObservable that is updated as the query re - `variables: Object` The variables to pass along with the query. - `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. - `returnPartialData: boolean` (Optional, default is `false`) If false, wait until the query has finished the initial load from the server to return any data. If true, return any data we might happen to already have in the store immediately. If you pass true for this option, your UI should be ready to deal with the possibility that it will get a partial result at first. +- `pollInterval: number` (Optional, default is no polling). Setting a polling interval (in ms) will refetch your query from the server (forceFetch) on the interval rate provided by the key.

QueryObservable

@@ -148,10 +149,12 @@ The object you pass into `QueryObservable#subscribe`. Includes optional callback

QuerySubscription

-The object returned from `QueryObservable#subscribe`. Includes two methods: +The object returned from `QueryObservable#subscribe`. Includes four methods: -- `refetch()` Refetch this query from the server. Think of it like a refresh button. +- `refetch(variables: Object)` Refetch this query from the server. Think of it like a refresh button. This can take an object of new variables - `unsubscribe()` Notify the client to no longer care about this query. After this is called, none of the callbacks on the observer will be fired anymore. It's very important to call this when you are done with the query, because that is what lets the client know that it can clean up the data associated with this subscription. The view integrations will do this for you. +- `stopPolling()` Stop an actively polling query. +- `startPolling(pollInterval: number)` Start polling a query #### Code sample @@ -172,6 +175,7 @@ const queryObservable = client.watchQuery({ }, forceFetch: false, returnPartialData: true, + pollInterval: 50, }); const subscription = queryObservable.subscribe({ @@ -194,6 +198,12 @@ const subscription = queryObservable.subscribe({ // Refetch the query if we want an updated result subscription.refetch(); +// Stop polling this query +subscription.stopPolling(); + +// Start polling this query +subscription.startPolling(100); + // Call when we're done watching this query subscription.unsubscribe(); ``` From b19560e151029007220a9b50f69af859459f1fc4 Mon Sep 17 00:00:00 2001 From: abhiaiyer91 Date: Mon, 2 May 2016 22:52:38 -0700 Subject: [PATCH 111/409] change docs --- docs/source/apollo-client/react.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index f6d19678c36..f825e9c1722 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -12,22 +12,22 @@ npm install react-apollo --save [Follow apollostack/react-apollo on GitHub.](https://github.com/apollostack/react-apollo) -

Provider

+

ApolloProvider

-Injects an ApolloClient instance into a React view tree. You can use it instead of the Redux `Provider`, if you want to. But you don't have to: +Injects an ApolloClient instance into a React view tree. Basic Apollo version: ```js import ApolloClient from 'apollo-client'; -import { Provider } from 'react-apollo'; +import { ApolloProvider } from 'react-apollo'; const client = new ApolloClient(); ReactDOM.render( - + - , + , rootEl ) ``` @@ -37,7 +37,7 @@ With an existing Redux store: ```js import { createStore, combineReducers, applyMiddleware } from 'redux'; import ApolloClient from 'apollo-client'; -import { Provider } from 'react-apollo'; +import { ApolloProvider } from 'react-apollo'; import { todoReducer, userReducer } from './reducers'; @@ -53,14 +53,15 @@ const store = createStore( ); ReactDOM.render( - + - , + , rootEl ) ``` -The wrapper is called `Provider` because in the base case you can use it instead of the Redux provider or you can use it as an Apollo enhanced Redux Provider. + +The wrapper is called `ApolloProvider` because in the base case you can use it instead of the Redux provider or you can use it as an Apollo enhanced Redux Provider.

Connect

From 8a0524eab749554b5f9b24c0da70db3dfae21b37 Mon Sep 17 00:00:00 2001 From: abhiaiyer91 Date: Mon, 2 May 2016 22:55:26 -0700 Subject: [PATCH 112/409] readme update' --- docs/source/apollo-client/react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index f825e9c1722..6c9e4f2ad07 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -61,7 +61,7 @@ ReactDOM.render( ``` -The wrapper is called `ApolloProvider` because in the base case you can use it instead of the Redux provider or you can use it as an Apollo enhanced Redux Provider. +The wrapper is called `ApolloProvider` because in the base case you can use it instead of the Redux `Provider` or you can use it as an Apollo enhanced Redux `Provider`.

Connect

From cab4d65f396bbbcd5ed4f8544cd74e432941f11f Mon Sep 17 00:00:00 2001 From: Scott Swarthout Date: Tue, 3 May 2016 12:37:21 -0400 Subject: [PATCH 113/409] add feathers-apollo to general js examples (#62) I made this simple prototype app to demonstrate the power of integrating Apollo with Feathers. The readme highlights some of the key features. --- docs/source/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index 65938e00486..c7d2f5c3b18 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -33,4 +33,4 @@ We have put together some basic example apps using various parts of Apollo; chec ### General JS Examples - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - +- [A simple GraphQL blog that uses Feathersjs for managing database services](https://github.com/swarthout/feathers-apollo) From b449e646749425ea2ca3446dbcb60307253e3d97 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Tue, 3 May 2016 16:03:30 -0700 Subject: [PATCH 114/409] Update theme to fix https://github.com/apollostack/docs/issues/59 --- themes/meteor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/meteor b/themes/meteor index f6333f5c251..da6b839fbdc 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit f6333f5c251f1acf3929fac7ee3da791d15077be +Subproject commit da6b839fbdc458876e93f58159196155c6fefe11 From 381c6666106105e40b284d249a0ed5eaa35116d9 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 3 May 2016 17:03:28 -0700 Subject: [PATCH 115/409] Update theme --- themes/meteor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/meteor b/themes/meteor index da6b839fbdc..94485262479 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit da6b839fbdc458876e93f58159196155c6fefe11 +Subproject commit 94485262479eabc1d9e9c8917570a5bb11530bf7 From b88993c4a36734435a6be1bfae0352cd2f1220c2 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 3 May 2016 17:41:12 -0700 Subject: [PATCH 116/409] Add `gql` to docs (#63) --- docs/source/apollo-client/core.md | 48 +++++++++++++++++++++++++++--- docs/source/apollo-client/react.md | 6 ++-- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index 588d27b88c8..54dedb1039a 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -6,6 +6,46 @@ description: How to use the Apollo Client directly, without a view integration. Most of the time, when you use the Apollo Client, you'll do it through one of the view layer integrations. But sometimes, you just want to fetch some data directly and use it in your application logic, or your preferred view technology doesn't have an integration package. +

gql template literals

+ +When using Apollo Client, you will often write your queries using multiline template literals. These literals need to be tagged with the `gql` tag, like this: + +```js +const query = gql` + { + user(id: 5) { + username + } + } +` +``` + +There are two ways to import and use the `gql` tag. You can either register it globally: + +```js +// Register it globally +import { registerGqlTag } from 'apollo-client/gql'; +registerGqlTag(); + +// Now, in any part of your app you can use the gql tag +const query = gql`...`; +``` + +Alternatively, you can import it in every file if you want to be more explicit: + +```js +import gql from 'apollo-client/gql'; + +const query = gql`...`; +``` + +This template literal tag serves two functions: + +1. It parses the query string. +2. It tells developer tools like `eslint-plugin-graphql` which strings in your app are GraphQL queries, so that they can be treated specially. + +We hope to soon release a build tool you can run on your queries when deploying to production so that you can avoid the overhead of loading the GraphQL parser at runtime, much like Relay does with `Relay.QL`. +

Queries

The primary function of the Apollo Client is running GraphQL queries to retrieve data from the server. There are two ways to get data: running a query once and getting a single result, and running a query then watching the result via a callback. @@ -97,7 +137,7 @@ import ApolloClient from 'apollo-client'; const client = new ApolloClient(); client.query({ - query: ` + query: gql` query getCategory($categoryId: Int!) { category(id: $categoryId) { name @@ -154,7 +194,7 @@ The object returned from `QueryObservable#subscribe`. Includes four methods: - `refetch(variables: Object)` Refetch this query from the server. Think of it like a refresh button. This can take an object of new variables - `unsubscribe()` Notify the client to no longer care about this query. After this is called, none of the callbacks on the observer will be fired anymore. It's very important to call this when you are done with the query, because that is what lets the client know that it can clean up the data associated with this subscription. The view integrations will do this for you. - `stopPolling()` Stop an actively polling query. -- `startPolling(pollInterval: number)` Start polling a query +- `startPolling(pollInterval: number)` Start polling a query #### Code sample @@ -162,7 +202,7 @@ All of the concepts above seem a bit complicated, but it's not hard to use in pr ```js const queryObservable = client.watchQuery({ - query: ` + query: gql` query getCategory($categoryId: Int!) { category(id: $categoryId) { name @@ -227,7 +267,7 @@ import ApolloClient from 'apollo-client'; const client = new ApolloClient(); client.mutate({ - mutation: ` + mutation: gql` mutation postReply( $token: String! $topic_id: ID! diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 6c9e4f2ad07..2d325b1d546 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -14,7 +14,7 @@ npm install react-apollo --save

ApolloProvider

-Injects an ApolloClient instance into a React view tree. +Injects an ApolloClient instance into a React view tree. Basic Apollo version: @@ -83,7 +83,7 @@ import Category from '../components/Category'; function mapQueriesToProps({ ownProps, state }) { return { category: { - query: ` + query: gql` query getCategory($categoryId: Int!) { category(id: $categoryId) { name @@ -103,7 +103,7 @@ function mapQueriesToProps({ ownProps, state }) { function mapMutationsToProps({ ownProps, state }) { return { postReply: (raw) => ({ - mutation: ` + mutation: gql` mutation postReply( $topic_id: ID! $category_id: ID! From 0a6f75012f12f3361c8a70fc83025257d76e37b4 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 3 May 2016 17:46:57 -0700 Subject: [PATCH 117/409] Wording --- docs/source/apollo-client/core.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index 54dedb1039a..25ea608fce6 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -8,7 +8,7 @@ Most of the time, when you use the Apollo Client, you'll do it through one of th

gql template literals

-When using Apollo Client, you will often write your queries using multiline template literals. These literals need to be tagged with the `gql` tag, like this: +When using Apollo Client, you usually write your queries using multiline template literals. These literals need to be tagged with the `gql` tag, like this: ```js const query = gql` From c93009ee5ff2968fed4e43e33b5bcbcf9812aa59 Mon Sep 17 00:00:00 2001 From: Maarten Busstra Date: Mon, 9 May 2016 12:28:16 +0200 Subject: [PATCH 118/409] fix store ref --- docs/source/apollo-server/connectors.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-server/connectors.md b/docs/source/apollo-server/connectors.md index 0472ec08c77..d38716ff552 100644 --- a/docs/source/apollo-server/connectors.md +++ b/docs/source/apollo-server/connectors.md @@ -20,8 +20,8 @@ import { attachConnectorsToContext } from 'graphql-tools'; class AuthorConnector{ constructor(){ - this.store = new Map() - map.set(1, { id: 1, firstName: 'Bill', lastName: 'Nye' }); + this.store = new Map(); + this.store.set(1, { id: 1, firstName: 'Bill', lastName: 'Nye' }); } get(key){ From c05a41c89cb7afd0facf3f5f29cd7755a597128e Mon Sep 17 00:00:00 2001 From: Daniel Rinehart Date: Tue, 10 May 2016 13:15:30 -0400 Subject: [PATCH 119/409] Correct link to Redux customization documentation. --- docs/source/apollo-client/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index b86a8db9bc9..4e1e0b59af5 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -25,7 +25,7 @@ The Apollo Client class is the thing you import from this package, and should be Instantiate a new Apollo Client. - `networkInterface: NetworkInterface` (Optional, defaults to an interface that points to `/graphql`) The network interface to use when sending GraphQL queries to the server. -- `reduxRootKey: string` (Optional, `apollo` by default) The key under which Apollo data will be stored in the Redux store. [Read more about integrating with Redux](customization.html#redux). If you aren't integrating with an existing Redux store, don't worry about this. +- `reduxRootKey: string` (Optional, `apollo` by default) The key under which Apollo data will be stored in the Redux store. [Read more about integrating with Redux](redux.html). If you aren't integrating with an existing Redux store, don't worry about this. Here's how you would instantiate a default client that points to `/graphql`: From 2957fc4ae24da91f3fb8f4e481f5f137c0fa801d Mon Sep 17 00:00:00 2001 From: Abhi Aiyer Date: Tue, 10 May 2016 12:16:23 -0700 Subject: [PATCH 120/409] Add docs for redux devtools (#65) --- docs/source/apollo-client/devtools.md | 63 +++++++++++++++++- docs/source/assets/devtools/devtools.png | Bin 0 -> 239823 bytes docs/source/assets/devtools/mutation-init.png | Bin 0 -> 117710 bytes .../assets/devtools/mutation-result-data.png | Bin 0 -> 113597 bytes .../assets/devtools/mutation-result.png | Bin 0 -> 98882 bytes .../assets/devtools/query-init-data.png | Bin 0 -> 105469 bytes docs/source/assets/devtools/query-init.png | Bin 0 -> 112853 bytes docs/source/assets/devtools/query-result.png | Bin 0 -> 163333 bytes 8 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 docs/source/assets/devtools/devtools.png create mode 100644 docs/source/assets/devtools/mutation-init.png create mode 100644 docs/source/assets/devtools/mutation-result-data.png create mode 100644 docs/source/assets/devtools/mutation-result.png create mode 100644 docs/source/assets/devtools/query-init-data.png create mode 100644 docs/source/assets/devtools/query-init.png create mode 100644 docs/source/assets/devtools/query-result.png diff --git a/docs/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md index c6d0970803b..1a135cf1542 100644 --- a/docs/source/apollo-client/devtools.md +++ b/docs/source/apollo-client/devtools.md @@ -6,8 +6,65 @@ description: How to use extensions and developer tools to get insight into what The Apollo Client is written from the ground up with the intention of making it easy to understand what is going on in your application. This is one of the main reasons we decided to build on top of Redux, which has an amazing ecosystem of developer tools. -If you don't pass in an existing Redux store into the `ApolloClient` constructor, then you will get integration by default with the [Redux DevTools](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=en) extension. Just install it, open the window, and you'll be able to keep track of all of the requests your client is making and how that affects the internal data store. +If you don't pass in an existing Redux Store into the `ApolloClient` constructor, then you will get integration by default with the [Redux DevTools](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=en) extension. Just install it, open the window, and you'll be able to keep track of all of the requests your client is making and how that affects the internal data Store. -

Inspecting the example app

+

Inspecting your app

-To fill in later. TL;DR just open the Redux DevTools. +To get started with Redux DevTools, click the DevTools icon in your chrome browser. You will now see the Redux logger. + +![DevTools](../assets/devtools/devtools.png) + +### Features + +* Lets you inspect every state and action that comes through either your existing Redux Store or the Apollo Store integration. +* Lets you go back in time by “cancelling” action. +* If the change in Apollo's `apolloReducer` throws, you will see which action caused this to happen, and what the error was. + +### Lifecycles + +Redux Store's can be created with initial states. At the top of your DevTools you should see an action for `@@INIT`. The `@@INIT` action is responsible for calling `combineReducers` which bootstraps our store with 3 special state keys: + +* `queries` +* `mutations` +* `data` + +Along with these keys, any non-apollo reducer will have the same behavior as they don in vanilla Redux today. + +As you interact with your application, the GraphQL server will resolve queries and mutations from the client. We utilize Redux to manage the state change our application goes through as we issue queries and mutations from the client. + +### Queries + +When a query is sent to your GraphQL server, Apollo dispatches an action to the Redux Store of type `QUERY_INIT`. + +![QUERY_INIT](../assets/devtools/query-init.png) + +Taking a closer look at the metadata that comes with a `QUERY_INIT` action, we see that `QUERY_INIT` sends over `queryId`, `queryString`, and `query`. The action takes these pieces of metadata and adds it to the Redux store. These properties can now be found saved in Redux. +The beauty of these state changes is the management for data "readyness". When the Store dispatches `QUERY_INIT`, the particular query we are trying to resolve will have this structure: + +![QUERY_INIT_DATA](../assets/devtools/query-init-data.png) + +* The keys `loading` to manage our data "readyness", +* `networkError` and `graphQLErrors` to have complete visibility of errors to the end user. + +When a query is executed and data has been resolved, the Store dispatches `QUERY_RESULT`. + +![QUERY_RESULT](../assets/devtools/query-result.png) + +When the Store gets a `QUERY_RESULT`, a couple pieces of state change. First our query is no longer `loading`, so we can see that state has updated in oure Store. Next we see that the `data` property is hyrdated with the data resolved by our query. From here you can use one of the Frontend integrations to bind the data from `QUERY_RESULT` to your UI Components. + +### Mutations + +When a mutation is sent to your GraphQL server, Apollo dispatches an action to the Redux Store of type `MUTATION_INIT`. + +![MUTATION_INIT](../assets/devtools/mutation-init.png) + +Here we can see the `selection set` of our mutation and the variables used in the mutation. + +When a mutation has been resolved, the Store dispatches `MUTATION_RESULT`. + +![MUTATION_RESULT](../assets/devtools/mutation-result.png) + +* The keys `loading` to manage our mutation "readyness" +* `error` to have complete visibility of errors to the end user. + +![MUTATION_RESULT](../assets/devtools/mutation-result-data.png) diff --git a/docs/source/assets/devtools/devtools.png b/docs/source/assets/devtools/devtools.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1609b3e07229118f0da4dc5df0a7bcb9081dd5 GIT binary patch literal 239823 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"p0WNO*2fSbrZ7>q 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 BrgH!Q literal 0 HcmV?d00001 diff --git a/docs/source/assets/devtools/mutation-init.png b/docs/source/assets/devtools/mutation-init.png new file mode 100644 index 0000000000000000000000000000000000000000..1123b4d85b2ae1269440c7138dca05b2ba50ccc5 GIT binary patch literal 117710 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≫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 literal 0 HcmV?d00001 diff --git a/docs/source/assets/devtools/mutation-result-data.png b/docs/source/assets/devtools/mutation-result-data.png new file mode 100644 index 0000000000000000000000000000000000000000..4823a7170446226658c569f30ffd96cc22a4f202 GIT binary patch literal 113597 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

6IPPP)E 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 Dul~H) literal 0 HcmV?d00001 diff --git a/docs/source/assets/devtools/mutation-result.png b/docs/source/assets/devtools/mutation-result.png new file mode 100644 index 0000000000000000000000000000000000000000..27fcc43abab11f8d679a3241c7af489b0151c782 GIT binary patch literal 98882 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

p!a9L%wyXiISEaV1l`f1fxrswO1Np?9N znmv>*&3ez7N?Fc)+)tP<81|WPOJh^)s#RP@A2A*d;@UT5-#E!!Ld;E~$#~H89gl>6 z2+s8yvUQ48CC718_J8YGF+SH0TJ;{g$#zWNgT3uzagy9D>*rEMrp?Mx_8hTUZE1rUW9}ov&%t@_Q&XxoF=l-RrW~?q6ncX) zeZ~EKd2x(G6`Vn9`z_RLz zAueCe@|W%fDKYTf8Rf~_?Y5vD(Mz+u3HFpyX#VXC_yK7?Veu=GTH&W4#Aa5_h^4W~ zXZ>7jk98%}l7da%joTQ>-z4R?RY|jq3f5j=-AMAfFzJt*py1&s2|Q2ITeBb z{IdUiM(<76K(!{m`GEL>X>Nsew((QB#(8&oLEcYhg&S^2LjlkL+p;s;Mey30y2*kH z$77jP_vzvJeh#X=U>Bl@T)Of?`{!n>Jt9>1B5sm>8Mb>>XYF?Mlo?beP%QlNbwtAT z?ZZA)f17LA`9`wio9|e}^o}*5sT>L;L09U%VeN7_&$mRy2fNH;FT~W_A%@k?GOSbNP)8+iTu18qbni>vAV>l2wZEM7} zMH}toEN7#66TUBwzQgН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

;UgrlRDui45XV-)=o&I_xXGW!RM= z#OzE9UF(C(yj{v5F8RJ633K=w5wz;G+B_#AQ+m8$hEjncM`3D&9sA?YSfR(J8ywC= zrsjog6(PQi=2k>6ORiEPDrcS+NebcR-$`o4jFpBG^Une ztJ&BUPE4|4&Lh{_fZ43LTzcWQE|QbYgzsL8}CSgj1P z1HH{5VzGBiukWg_lBHc499wtOP~Q{5PiZ)=Yj5zWm1yd$r)qDSNIXnCL{Bt4B6_sF zlOj^y#3Y=lLc`gxE+JJ?bnPo+N>^0LyS2gbHy;G=c-mcGpldKbY_;`%*bD{1#LTH( zXI{4#yuORHVt8fd$Ie<-tq?wOtMH2wZ(fAQ!D}R08j~$76^&TNH_mD?`EhfL*+wk|R!LhQEhAnBPcQ@Yu~10{VO#V_+Y20tl5jJPA~>)So@=xDkp z{yV|&kz3u1A-kh--WFJTxo9GhB37}8_*Ln5#Jf%*pkJquEV2hcgIKew zCgVx-7a@Z@S~AyyQA^tiwBj9m29r#0gr|fv>$RzeC?owxsn|C+J`7N^T4ll<_21Q8 zmRROVIcKQkN^he?5#q3|wh~ONCLi0$B!f+%JobV4DjITz+`Rw&jKFAaC>h2>|~q`wC2N7aJ_f&J^jZfyFci$NJu7pP7B_#jgY;=(m+|XA-{#@dkliPLndXkmJa-Ttin)$0 zGd=(FZGbBr5&v^+|2D244#4EsZCc}f{fFlT+ynj}%=Q1>;eU9&X@E7v`#-+;w~zm~oaB->TP3A@-_HQy9`GkF MEF)AX@XqW104sKZKmY&$ literal 0 HcmV?d00001 diff --git a/docs/source/assets/devtools/query-init-data.png b/docs/source/assets/devtools/query-init-data.png new file mode 100644 index 0000000000000000000000000000000000000000..bc69a5a08aa43038e736091272744dd38d444d86 GIT binary patch literal 105469 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 literal 0 HcmV?d00001 diff --git a/docs/source/assets/devtools/query-init.png b/docs/source/assets/devtools/query-init.png new file mode 100644 index 0000000000000000000000000000000000000000..35cda6bef85a4a72aa23aa8eb3df6d6b60f09256 GIT binary patch literal 112853 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

I`y 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 Ng@>xL#nL7({|{I!jhp}g literal 0 HcmV?d00001 diff --git a/docs/source/assets/devtools/query-result.png b/docs/source/assets/devtools/query-result.png new file mode 100644 index 0000000000000000000000000000000000000000..267ace970a023e18136f17e11988b04cee04dc0c GIT binary patch literal 163333 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 z
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

VOc-xsgvyDT12YwGus+xp{Hg;`Tf)%cx>FFQ4^ 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 literal 0 HcmV?d00001 From 1a7ee9306b1817530891d81744353a78dbe114f5 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Thu, 12 May 2016 16:26:20 -0700 Subject: [PATCH 121/409] Add initial cuts of some diagrams (#71) * Add initial cuts of some diagrams * Update diagrams, and name in order * Add wrapper article --- docs/_config.yml | 1 + docs/source/apollo-client/how-it-works.md | 31 ++++++++++++++++++ .../assets/client-diagrams/1-overview.png | Bin 0 -> 43490 bytes docs/source/assets/client-diagrams/2-map.png | Bin 0 -> 52584 bytes .../assets/client-diagrams/3-minimize.png | Bin 0 -> 59007 bytes .../assets/client-diagrams/4-normalize.png | Bin 0 -> 48668 bytes 6 files changed, 32 insertions(+) create mode 100644 docs/source/apollo-client/how-it-works.md create mode 100644 docs/source/assets/client-diagrams/1-overview.png create mode 100644 docs/source/assets/client-diagrams/2-map.png create mode 100644 docs/source/assets/client-diagrams/3-minimize.png create mode 100644 docs/source/assets/client-diagrams/4-normalize.png diff --git a/docs/_config.yml b/docs/_config.yml index 8c7d0f93aa5..ff28ce3f9dd 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -23,6 +23,7 @@ sidebar_categories: - apollo-client/redux - apollo-client/network - apollo-client/devtools + - apollo-client/how-it-works Apollo Server: - apollo-server/index - apollo-server/guide diff --git a/docs/source/apollo-client/how-it-works.md b/docs/source/apollo-client/how-it-works.md new file mode 100644 index 00000000000..a263b562042 --- /dev/null +++ b/docs/source/apollo-client/how-it-works.md @@ -0,0 +1,31 @@ +--- +title: How it works +order: 143 +description: An explanation of Apollo Client internals and query lifecycle +--- + +For now, we just have a few diagrams, with the goal of adding descriptive text with links to the actual source code. + +The current diagrams are aspirational - the code doesn't always reflect this structure exactly, but it should after a bit more work. + +

Overview

+ +Here's a high level overview of the data flow in Apollo Client: + +![Overview](../assets/client-diagrams/1-overview.png) + +The client is split into two main flows, which we will explain in more detail below: + +![Map](../assets/client-diagrams/2-map.png) + +

Minimization

+ +In this flow, queries arrive from UI components and are processed before being sent to the server. + +![Minimize](../assets/client-diagrams/3-minimize.png) + +

Normalization

+ +In this flow, query results arrive from the server, and are saved to the store in normalized form. The query shape is then reconstructed before passing the results to any UI components affected by the new state. + +![Normalize](../assets/client-diagrams/4-normalize.png) diff --git a/docs/source/assets/client-diagrams/1-overview.png b/docs/source/assets/client-diagrams/1-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4adacb44b436f1bd88a71ae825987e976af539 GIT binary patch literal 43490 zcmeFXV|!&=)FvF;tk@MB72CF1Nh-E&t5RXbHY>JW$&PK?=DTyw>F(#c`UkvUdVgAb zt%>1rk1=P2qPzqm94;IP2neE-q^L3o2xt!o2pBpH6!48-VX+bj2wb;?h=`(;hzPNw zqumb+Yf}&q$%v#BXjK(0+@TAvBa&Q5;dnGp3C|>ba4Jb?C0N*CMPW&yfzaVim{>?u zR8=VF61Z5%pF(1EnqMF=PUU|J2@ycU=jE{=YxYi@FRj&mIGuZRd0%v1_-yz*WZfWx z6evN(r9h2={hYwO7J1{fm}0JF%lIM)f*9@(B8wvn3LqmVhapbudea3L1Yq)t^)ll$ ziuKFRL?=8Bxs(98B!>zDK=}uYZ`ad(#TyZs7F!G)+qOqVl2}ao{nwC0H@e2c({m8P zjo3Q%Qo&=8qAJ)|13vR+UXm9spga+a_<6G8ymw?;Zp9WU_)V0IL9*>aXnd zMmot~0`Ux6q5%qvyp#^!M>iRn_=M~Lt&CyQ8#+luc-_<;iijJr++S%4kDb2=XCUDl zm~r4Q(7uMfFwUaTmxd)Bo{>d3k&)kc2rEd*>uV1SzghVHY9^+Yy{IeN_tew%Pc=k4E}#VoE(IDiF*ZP-lMi(lrfDezO~_P9fg?#u zt8St`hN?^f8CQ z4O$n@Ho}k%#58o#B+^IV=_a%%#z(3SUb6q1fq2lvv!&b&#}D1> zUuZfknE_nGv)cE?FV=9be6G;(rW;a7MMf2DXbf{V-(xyoar)}fZ5)}SJT(}V1QG7*NGf%a$%KQgTyLP=+qePMS^PO+-s-q-CeMqm`p!RCd*nS7lJNRVGw?uMk$b zQj$_z%Ad}=*2Ju|tZ3DBi8(f!qb;k(qNa1y@7GnWIo!>Iwya63)h=1~Y#_5-vqV3} zJ@!53y#qf^nKiIbWM5@hW{YH>u!^=&X47NmN*hSSW;2+?upq2w)22RSvC);08#9n8 zP%E9wXD_tLA;`@vUn_Xi3@h2mNhnaMm?>qgDlctQbqlf$ItS+q%nH)~v+mo$&>`gm z{zmm?^GyGo4>bzq9Aq5?6(kXABJ!s8i(UR0OXqIQ86 zeuKL?wH=P(Z>yyrPxGUTkrryUE<O%}ygLbjBTNL>qC2HV~bXH48jBk1t$ICKJ;3-Go`BY zCE*a@>EOL_P4N4XEp^}+5j9)gj`B@C$C}5q1BICQ-0d!RP=bE`{b`VF zoDxRIXz)%q%i=6zuJMJ!+C|f6G0YxtskenphCn8YniudnTidqk&a`_lTnzX5Ao~9$FMyHf0MrCPmC2y+yAj;}P2tijitg z{S20gbc~P0$i$J^&DpfsqxzEiB4=+;?`N$l-fu}>Tq0z~HsVBp;1mG58Mo>A82$nD zbvfiu!@?Z3693d}+xXl=o+-s-D|L_gA@+DH`N|}nF};jL+>@aE~st%=L7{E_gD@8BitY<>mV`a`{&rdi2cNmKdJ6xwMhhKSCO>dna0YaoqphB=(gK&Uh9hXXR#4n}??%+49^( zJu$MMX`k&KU;xgz6?n7Ve4mByLn4s$hsvW)qxv$-d5H8QJDm@%ugCZ_z^ZlIj=k=b zQzRBbtQZ!St9kSUy!y7p$K=}5$JZLy%zPW(?quWi6mIBWbSgVyJ8XPpo+lpK?hM+` zd|r+To-@*>9V_%VLFLU5tFKG)vlvB8DPa?<$okQj{Q4WBKdJUpxQDgzH&k`Zy+BCSu9#TeN(aHv; z27=p63sp^LO*vU^V>=rLBNMytrVQ>j_CTx)0>bOg4ScjQbv7b)x3RW$;&$gF{bvL> z@cHvKBPsDeL!7PnNHygYiAC%jO^MkV*cg~d`QeC(iFqAOesC*`ivKqq_>Yg&+}YWl zn~~AY&5gm0mBG%@jFFj(i;Izog^`7Y9yo&D$-~y!$erHSiR|A+{?|I9rcTC=7WU2- zcDBTy>l%Hxb8+S)CH>s!fB*ia)70JK|LkPz^dDP51{puUFfubRG5+thfm3-u-*PKj zxSLvQidxv1+ByOE;Admw;{9j*|Mlhn?D#)sYW<&??5xcHbLRi}^50Be#!m+R2Sfi# z>z}tkaq+|PGX8JT^TYX)p0j~~2!cq73aPq-o@PRN>quM=`LVF_G@|pkZZom6vK5jS z(z3GZ{(iZ*^ITZJ8?~4Fy#;46Q*Y6SnBQkU6#JWi^+cd95`T$#IN3x-p)MOxm$kmq zbg8G6zm%Cdbwn-n3k3yCSP%vVl#+aNJJ=_g0Unfu7$VpoMG-<2W)xZo_yzbsBiSED zsF=X>sQKUF;V6j!|9>Aj=|NEg<#}$W9sZq%LPC}O-xBuPV5AV4u7`y?|Lj0QEUd^6 z{_o>vJ#cyMvq_nukbl<+&hdrieZoIw${s5bIA%@SWuR!Bawb@J?Wqw`qk?Ma%AQPtc+HqmNQdt*!tX>vkw0*x3Te$m=fjx_WxG)_YLAPp^3Hn-f-7 zgL#aKT52);SGDf9>nB%_8~P&Z^8C-!FMfP48n@B0!o68R%|}@ueUJweJ<|g7Wv>AN z@9uX*$i|DCzGb6#Z1gX;0_&nexk4Zl>FhWP{Lb*+?H#yTT`$SBmrLJdRI}D=rydVx z9!fl0K<2Hp-xmCmKxU7en{SF_9M&)o%Ku>Nx?;vtX!*71U2PIU(Jt5y!dH9yuf7V~do1X8D)QyCj1mDuz-h9-d7vu~+x<)p zS;SBh@fVgFg}NAScXC*Tj~jZ5;dPHEDP2xKq|PTJ9R82{6!E974-YPV_kI2hpF!2a zfVG#!sOGm&87WQOP_lyfN@Ah!X&iPNF+=a3=!9=4F(p-Hy-tku%1w1n*O!wjj3k^? zAk`h0RJP5}U}*IxSI=z*sr<3koiCWkt1dBUol?{mk3M%_U9#ExhCc40zQz*7UhsS1 zEEst3^Su;WCe->H_zZA*i+t5kt1H)#GF)-Slx!a!>T2$D0v^H6T+?)`d%-s@O$?S+D4v;;p zfe0Ab(UF`@vaLD2B#ox-U&8~`QyBT}2q*ZQxT{*-`B&FgrGj`&(g+rQatu6Zf#dOc z*Pto$-nAS9DoaW#dhgf>#&A~%$R)LAUQCzL!~u2oyiWHRx~@}NWqfT9gz67|l;ib9 zjZoMOsrmJdzg31x7tY#{*?0vk9|c!k-v-J$&<7EVspn)fs2Id_0p~FA@aj+ENCY4| z$lwIdl6j>|<0}t_x5EKnnCtySv>Zu+Vf_sag~Yte*tj7X68b5>z5S|H!{T>O30Zg% z&WbcIWSW6yaR2V?kGda|X(Yw(K0C9t3IX>=1W~uq)_3cVVUUoNetrgh6n#3)Ep0t3 zE8t0(YN03NuQ8FwMO9ccp2p(pvD_C5DkX#c^JS~W-_cYD`)7V-Jk9|CDMf0CR$kU? zqemkL>)rGZ??mTbw~)ah5TK!^(k_5SbzgKrfMZz&Zv#gOL+a}j;0Bqr(=9q}o$n-X zrS``gM?#w;4UmJ5PY$Zdj0ap@;vxlIZH4-taj<Eg3lxEo6PqLrWw#A>ROU`GupyM z*-RtcrTxhwmGiDe?90hJl89!a+7`d6M!#xrxrnq9cxM~s;T(N^2zVbp+h z4%E+imz_E6X}0e*-0xSjeD3ds50~8ujMM?{YkLO)^rG}q6;Eq7!|;}Gwx`1+?w467 zst#MZJ&%A5B2wdwZ&y^XL=$d=u+J;D&5ISsnmJv!t3mGP8yEgDPMlY`>sn4lX?OXC zJzT6;Gj`=y^DhQFJB)t4ZrPpDaDUu8UZ(tVI;#l(?vFs*sm;{Ysw zHU5J(ZF*MI7MXA(b6O>r%n|<3XgcExv2NR~1Izu({X^Hc2X>j&y;TF}oyy^fgalOD z_(byQ_3wSKk7ZQ<4)SVn-GO}m-Cwx0?*;5_KhSg{p?>b~o$W3CU29}CJ=pJCSkcky zYRr65Mf&mkx0p*pH*1x{b=KhPEBbB#Wx>?@h>8N&xt4B;c~dNp=k)bFO!(JDT!NT2 z){4>)ompBpw}&5)#Mq-yRO7HivFgJD0L|uxubbMAS3hhsPg$zSBDC%~Td*v>v)K2~ zm6EU6lPRi!N!l3+R15tSe?nP?2j+45KC%aV8&&uPgaXJoF@&`gFmdVRln)$DVzttw zgb1cXm~hw2iT>&lf(`$Am;+8Zj`c5g8-oo;sn5twBnG+{5ceT{BD)}@3^tvA0V*9O z5ZXD0DhK`tN~wT}8;RR~+WKE$Sd#(7uVXmUu>a!1&74p4dDtyg_b>YFb_BWwy%`n7 zKVUc5KM3f*|8Mips^I??dvWn@j!nvs|5YZ`gacD9)>cB;f0B#`>dAR`DxvYe0b)Q& zYX>V3{-;KXuRuM;ODHTe{HsSSRA8h;<@eD1SB?0;fqIf4Ng_+IOzcYf#J+WPYLx{A;aG*j*!D6;`!JzeV!}?NYG~Ur{2#Oxva-%kqLv%KHevfoH@=!^nCeg8g0ey>i~J3dA&t0 zQd>Yf;rt4;p;#_kq_yKRk+4LRdQ-~VhK3R{n*^1;^^RfhZP-~%?3F*#)So5@O%CJ> z6ncCrT~|tY(yALI-8H|e28HPgMl&-t{O=H<2)#wvuYXKe9B6AXW!C}4=6<_gN|qaBz_IbrCKe7Xww+zNx`Bq`q++L+ zGn?fw8oTEdX)`1ghi(e`KXz^&c#U(Y3TBOAd{U}-jsh(K`#ffV@^-%x?z@BNjz|=H zjfltHP_6tMC|w|C49Wa%!Wfi*)Csgnpavh)XNuFmj!w~oM*1H zXO`1?7b{4Nl&NLvH>pwq)&5_8&u>XqyZZVhp9*IKoAFVhMMXg}d=m1njAVhdc_VSh z2x`cM;PM=z;=wQYgEV-oyUTq7AA4J%2s6E2c^V${Dq$VX-hNDAfd7^!a4D6AS^Ngn z+C3kCnnh-35!Bqs$mQuulg!KRHyhkh4m)waN;zq?&xrC_!3q|mlyG}uoHH}qU)`Q2 zK5Litvs1z72SMe^-Xk;yOIE>y{#P=#op7(<$k&aZWeO-nL?)HAG?QneOtJyDN+Z;N zIm&QMTZ4Q7Pbb@CwZ$(>_%)f~H?@B~#tu|Uy$p~Q*P;0;&mYL*%;Ln{Zf=kASqQPb zj8dOE{&a_yp)M6q1Cc2_&Wd<1QPJXAGkFSM)*r)(C0se=aVV3Vz-@4e480Ds_$r}s zJ=_uTVUSK#U3SB-ezn5^jXL<#sJC+5TvN_0XlCm#-s{Zro$oAXWE?-8ECJ|YhbG|b zm}_Shmr`eEcrR%5dTr_!!Dl||*Fc}hK?Dl3fjQQ71%5qIKOqec!0&Tf6?4AU+7ooo zkZiYM>t>Sx^_ix)fcv;2nH5)td>g3)$Ttqx4;3Jom`KkOhKVneLvV-q!}Q4aoVF(| zo_OXsh`N`HiV1@qOUuNh?5Y8IrTnbEBcR%7TStW_%i;Sd8|KWg4GbQmaYO#NoGg#h zJOEWYN&LwyzN*(T8s31jDT0ub=BFGIKjrZ0kIVQPZHH=dKfXE>657KfHbmXm&%)SE zLs+q}C?+J$DPy&K@+=MvLbHe6%OXvuE>@x{9NZcjk8+tbUQp?Q@ejh?ut4oQ2MV2+ zF)Zg7rzUHb7`CBlcNeuBQirZZ+lFiglP3$)>`IMI<5kbKV&R5}6JjLTR{JA^H ztuA#){3^o(;9{e?C&_K(v4 z6M(B}ljZbG&-t)!P+;pH9D=fyfiZY~G zMjy`?B#wVg1HmQ-B%>&-$%^|RT%5V6pgjyx#6~`LdE3ZSZ{kx~gr6G0n_;+!hs&Pr z@=IyT&qq|Wo#i}kHxD8ZqXNK!h5?&ClSZMV%(&VHN&(BOx(##P%-XBov@z;=*1Ke% zK5zz1wk2z|XTP$pR7=dfc{S4=cXyY{v7Pz(OIEu!;@e1Ufc=|)%yb2WylF*3P%eaf z^SyiDliC3)J)d+T*uN2`eymu{^3Q4J^!%kx*Ebi~mrWKIhEcXlt*HmXm{z+^u>qVE z;e&G{A5G=&br9dTU(-7nutWUmff&aezD!=bsI!ysZbTxWxigJ82Oa_HyQff>TiDlU zvP@t{YSS6$A_``t8r;&vw1}<##D}l-H!|y{tE#hhdJ9UV*BQWg>M9QuRwnXKGIj;O zQyAxt`dmodmXpw!5dJHa+roiC8K6Le{X>DKH#=$Q>Y{PWhFKPMGBY<`WBJC7jNFVs zfcO?Gr%tZ{hYsw4@dL-z$2m-j($<&2UUxS~rwgm(ZOf>l6Dc1BqnHZ|1{< z+?rBMreuJS=JTlg^9jtkF)8XI__&7hH7PHDg$Nde2Cj1o!sfB-3|0ZzI_a4sU(EAX z6lAc)e>5m7{Dw6JMc_?U_$0i^_Q|3MDK@vTe+V&KBcb_dkLfAK;fQo%Q-I`W#N+|m zwxto6gR%||z?L;equzsmI}ho5rdA!xa$nO#^A%1$e=kozei zH{=CnDy`~8WOx*>f)2E`**?3%iQ+;KqxeY=PpwkH7rH^yS<%^qhc7;Ag+3gL+7v*# z+khTy{f)&VhZ?j&K+!mTH~l_-qmB|kr86i;VR3rZrUl5IKlmq3^AGxACpUi#GziX{ zL@K=Df2hU#q}CX}tsZ-V96}EYF^r!T^SSqx!IU8h81oDXfP_}|OR2$Lt+#q}GT3A;y zRaet6-lBilZcykvwI{$#QhT&H^K5@V(s>-qgxfY7p40u!V4B~x z98xeK*?Ojh-7qEUoVyZk-IUs6u-P)zQ*>HTFGVnM2jqly>^jpMmFfXueSrKF#D``V z4*1Khus6WGLUV(YT+Tua($dmuwtl;I))^xukz?iN?dm&E%W4ca}C@`cxs=*~dch0sQ`=3Qr{z)2(J=19thb?Q8? z)3OP#%LD!8on?Ei*WMt#ByU#ei(NDBjs$|rKqv&{_I4e>yfHHRR5!zCC$o8L`^Mp6 z4odDY|H7~Lgvd{Vw|TZCpZ$Jjs{GP*@Q4EXOxc@*zukqi$n!|h{X-;M z{z7egrQiJw?3&x!jQ&pc9HQeHd-r!5WKL2IItw~qfp2o3;Qxorf>3LYoT;iqD#-&h zR5aq?ZQBfTOY?7%@Hlp+bgF`)#*SE;C7Nt$3>>6zSS&K5XZ+V4j^}Q9`FNm>g?i+5 zq;L|$X8iSwi{zniW5tv$)3m)1E+4Gixr-zcxi{LqkiWM|aOi$}Am^jS!&IAVJ}W)I zBQ!F`-QgxSV2i28-aLq+f!2DlI#f(RH^p$8nv<&<)d9*k*nbD5rW9q>iyT#}J}j;w zzte#aGbu7}M;)qxdi{K5{`^TuY{Y%-@kJ3G6*QaF}`@>|l%$=4)+%VL)4wZ(;U{bL`RqP?@& zg-u@ok0Ym=CT`)y5iT-d0Wzq2m6^n`_f`KP3xZ#W>dMosS0iyUm)FL~lWcp$_D{bl$2feF0RRExh=(;k&>azA~lr}xZBm=p+{3iPwAa;aPVqpFD~QU2*-GFi|0_|^%neI9@TEWa@X_U z4J2mX)RG!T6)Utm=6lD-A$c(`j`qZ5plmHISGDh?xPaA5y=-@p@FjBE{pkj6l@N#{ zYo1il4&x&xIRsJr74F<0!Rf#HAG@?BQ@F$mB%P0!KGGo9<6UcR&{>{Om7$22K~jRR zZ|`lJ^4c)PP9w*+1Za*M@%AQB(@sAWhQ4*t^;v2o^P26ewqN&)xL+rIySj|3E<0L) zm(*PI-5WSwD)P&EIXRo1H*6@)UU+nWyUxH-VXF5dYT)wZx2QLGe@$QBXZF0z5s#}A zJ5q656HY%8=tGQq&mI*pn}+c8waoXX?`U~`gXX8rMp>)JX;Usg^W_@W_rfMJ@^zHI_CXSe=3nab(^~kxX+$_{_ zar9R)e7ZdQwch&2fn4ordk3%D57+elivw_E^ckN<48#IO&OzQ#<@ArSP_9)htlJ5yvCH+$W~Z z?+Jfk^Lav$b!vP=z`=-F%rY8(uTJIP2|r+Vc#mDQwy68`gRkZc=ver#11Ok;^V?+Y zu?xy@u-5HR*tq!4+VjIT$z!%@Ee(xq8jVLcblvGIx^`*Bg-+kTH6h{b)vIPzR+Z=c z@z5%m&t~ELqox3YEzO8`q0+N3vv}guPObp!|b3e3O_c`U_#0QlBv@rpL2cXN%)r z8W5_)z&f{};LnE5cjdKxvrTHRvjd~9uN5fz=FAY&VDe&Hf2Wg@Z4k+Rg8cpDz5r@` zd}anQU;Ms5b;^PKl@t}%a}=zFj~)i;9+W5uDoY#h2jbOby!GjNLMS3$Lib&@cAWu% zkEev;V12-s$qUu@`&mkl5dS)~!|NkOGsuhKwUshF2jerp#Yw_c?n1`F*odGMjiLLr#$q8}uioXYXT%6+d@+xf9uHBsX&5sAe(;tE zfrd=V(d4~18hLdg5N&EpPr_zbdmV@!7X1wv`>7;9=QZD-OurFxhZmQV75pBA+Iz()*49B5%i_@>i{5Jf!)zu|245lacSHc1JC(f5B z;ksh22$Ju_2hR z;ET5FT#L;^-z&>RAH3_)atezliIp(>R@`?NfpW^k?NI{`(dsQ%18$Qn(fUhJo!i+L zRGtiEY^?n9&Mm$6La;S&;>3GFkLNcX>lr`_#Hy&y46(l-_UiGz?M(Cjh2MJ78RDh% zOhcbLBHBqlE_6DHh@w;nW)U283gXNN1HS~(1y2JsB5c!huM%nYIF>!BiPQUi4hjP^ zrEg&YeIem8oux%#2<{}XczPP{YNE}`e%Bny-D{w|MTFUDnYfU|RmkaYl`@-9osyI| zEwJ=9hYX)k6aQidiDdRJ6DH&W+Y6Lcww<7Ta|7ais998Rz9Q!_#~T?pB4Y@ zrHk#(T_HsYBSW5GE0o!8rcT?Lm2u_Km>tLW@z$Wx>zi{Pv#mcegVaLbUzTlj`Yw&8 z+|QS8%vF4dSyDzeTGYWgBaZ{W9-V==^6&8aePK3_ z%2gwg4*l*4^?ZL;#IexzFlD({zk>QgYJ&xq{COlsEkx;|Z=eDF=FsO{lHA(vyJJ+L z?i-Sk@hK=z>Xd@>J+JnhJIFMN@&dmmT zqVd>qfi;O?3Q%Rsdo_y&`R;s^6!JVOx%h1tGu87!^umCQZ=zgXjRMDwcBs(jdwf4n z;cVy9!0T(XgiWN-z~n!>(ddYc6nds4C53n07rv{JuYt;#2Nz|ugF1nOTiFDHRhta0 zhV{#`ACNYvMnO1I!rfXx1vn?iH`Zi(BH|33u4RX2)?)@Dik^3P#V(_plMsgay}sUv zf4|H*uaD?N6JS`{x_paAf&p~`*1&8jiRcG2*;EiTw42l8SKy8Fv$Nl?7(*GK#uy30 zN=gJN371s#4vr>Q>@q<)Ql%C%14XsT63HPl0)R~>voEIbFD3PYF%{5NU$b*ULQF9r zNgQt2{k(vsq^X26yOpc-mp3|N=1u^%9 zUOtT4@$91Q(^zsi884eS?QAY93j;N!&nabtZtvtoa);f+r%aC_{+! z{U`n}NCisYoSA$}o1g&!LBBO$RRXzx#qKp6D1`x5Ds}wfnp6wF6!Ccb6@UxpaDmy5 z>m^zV`@@sfp8rCR#LKh^Hxb2r9vJ>291~#2WRVErlfFgDsoId7LO502wQD@hr5%RYRA95Wn{*jL5C*XsM+@>CXYKyj@2JE_Es7q4=_8FGJ*-q{VGX zR`W$x%O>J!L&M$U<<6aE=eB?A!P%LR_7O(fHhYEBd&@Zt|C=?sJVrvC#x=O-mBHZV zYY17=Ngc9O_}hC}kBYpZe^VsQMzujOO>w0_JSymBXDx`S%v8ATwp9cD566vKnADGi z$=YX%%7&l*on>&tBmOe=JMsawIiutc1{E<4l;6F7%){ce$hDe%e&otZHj%UYd#E{$;#HDo%ZJnBdz{#5`FsNdD`rf( zLNNWhZ+Q5VaJSVuu(jQ+x`){GEL&ppwr04>dF&LO$fn54|9`F2M*T|wu&YdV^}h5i2HDehy`PKF9ZRyu`lN7XFU0?+f zTIwR3)bm%snj%eDoHInM&;(+(^T?F7{HL{WjttDO=6ZqbS&2 z`n;f@36XAf>l$kM#^k=)`#ZSw7|qp2Q?+$HWi?6AZ_0uCGyjk<2Liw?v;K@RXunEH za)E|9oD;fD)8p|?x}sq3N_L~h<$QQi#16@yEqU`2yT0cfW(Ca38wZ^y{TcrrYtaOS z7kH6CpOprMNlgx`e(2%D{YE@9lFlZN720S(;{*HG3GZU4GkTqC_yFM5U36<{(RC5{ z^j(iHW0$@1lUk3IWreakNTt zy|RIXiavG3R__GQC8-A+ac~@+xXeUG2<|B0 zDeVO58OYrsD|N7fJ(V**eflAf;5Xc~FW!#jLawnp&+WXjpf(q6A9&WQiHnofRh-N$ z2(Y%kUg8?{QpXrz^Ta@uhl|mm3{?qzjPGp~e54p0f^$FMU`|e7$aC?8mhD&DGSk|> zmFuoIw=jf`Kcx5zWfBc|RtQuQ{7YVv+_gBuRxT7tswp_hu>SYx6{hK#D8ttC;rOkV ziTw&?CrMiNP|I!CKa|)EQ3f#)8#ip`P7&2kPp_8deWeGSp58Kd92&_j3(*3koE&*T zm9m5VQBbrZvlQ}k_X-|c4Z%t@G>8ig!y~1u$+xm9*133;ecD{DV+0RFGTpk80Ejcf z+1);;)7DzKrIj%>n!ym}`M1&WPEW&MUDJ-u(Qe?&gL)Bp9Lid+C0FzkIpFue?s%0; zUM{RXq87=X2eqB2&Xp|Ta~v^DgK@n9t6`T_p98wPRrrr*#I}b5+MY2~N=&5<~jWQc7%kYK%IUT4bGyXliZBYkKlMYby7cmzi2YEYfZQ z+e~C1DdY7~1#IwF{+R@IvO!lT>f=RT1E)8+j#%u&-Cg&IT}6M2fsImcG=XNy&!YSN zla%~|VD`rCnOCpIx!@c@yH%$JYy1B22z1Y#Xs#d>0)l9{^n}FCJ=gw8FQijEp}Y`IG@D<6hAh-<gY{E*=2OJf)~Pa6$h|+ z)XNW9`SYO1mYc(i|6C^z=h71~is$rsx>NVQ8&`kb>t*J&+k$Z!pB6~?I#`|>AQ0c! z^5e`X(&7tr)>qS93yaZF26d7Q&OmX|Z$n6xrquA2e1KjXGg~azJ+mD{A$}z6z5M2) zy))5Q29%ZE$i$_YgMD(A^K!TEd56XVxb%AXB=Y0sXj@pyf3(^y(o zbfs155;zv|Aq7g;4nK9-IplO*H*!#Ji;dkiA;c$9u~BB((g!Z+KNxG9VU_*)P)ZK& zy6YJ0!-_N;5Id+(0j+WplAMLxfj1Ib4c0Tgy(4HzUF1*+u7eJc>0jri?b=Ma2T1Uv z9@Y&cdhOu{V`8jo8tM32kgMr8GE_sP8@`6Jc^mb-ZgHOcC86ou!e)bP3k(FwX15C` zse|;>DshUuFkQKn!eUb*WKR&}k~6UVD?juct!h0iEy8W#A*TWY+mz+|E=_xKei9`) zJuTecfx5pJf-=2a!R0eDQ$$%-_EQ4)hp%bjG$-rWsN@Tsn6?GA zhUM^d?2YHnEVWO~J%H>nAn$J+Apv|NZcN@GiUZr-NRNk?lH$7W8!0NjENB#0yx_@7 zaXMO7xjIpvdkEnt^xs+^=>i4SKc=IvRJ2G7sAm|K?{T}3>f7pD3NN@`LJ6xBrc^kd zLHTi1P+_gAF0o#*A=qg`jYx#M7C*H2o8haXjP_z$^p2*qfa8Km!Q^sg4>aAkv6T4( zCl-XL*D*kSV?jHSr=tQATfq2W zY=-se1fXxQ!r7(0*_e#saE(agjwn)6TgO`A*YNdOZsAn>UAb>aRuO?NW2<-q->M%I z0g?9~EM{hs#|L=qrS>?wLxib~w_&i`M0s_EuF;!oX;h3|r)5uqizj2m>OvRZb-ZCh z`{=!-B((r!R~W-~b;0*u|at=i_-UsCi~TG=&_oXybB8M3o8xwL$H zxe{(8clMc_bpvMUZ6xt~>G|K++4cQit}pf5+w3Uie-iIv91!`pFxRH8cJK&SGWnS6 z%UEYeRjPb5HT^EO?2yJXu7c^=+`RqAH^^aZQ^|5|Izt_Jp9P5`=D=u7F~!K3ZDs7; zCx267UEaNG^ZgA6Q9Y^gm=~= z34XywjfmQQ`A#h7X31O|KXICxbu39s--9eAQOiP)Nkp_7V>*;@`Pz^3MTS+^rm$+G zU`ic+uk#F6aTkWZMaBv)x|j&)AjJ%f?;aX6E7zSkVC`6`3TYHN!S@$;S1T%xr7vYWk7s>hFQsaRjz$cl8gSw_dh&v2W`aD~hQx^vs)!c=$bp4NQp> zYG^TmMXq^kb+T)0ljr5WuRLopBAeBkB=#5Cz{@M~2`t@-F0@woDv06c-1ADmyn7<# z{PPq$rR?O2(PV*n68nt%o3++wjfOKr-|BUDi(`aavLI|TS?lrV+vbR7mtm&4w;_(o zK~E%vNoio>gu^#$E-W^XX21nrC!9`wnsh#FW`;UhxbRz@Qs!uphiJ5w5u(w`hk|@G zB(H={OLwjh8#|jA0%6fRD8S=}V*s8mdv49y`|PVV>-w@fn`CN!Y+04~-1E;ezN59X z7jqGn@6S^|`4=};Kwh+@6D{CDvXin~Hs3Y>t_!#6;9qRt{yEEkcJnMvOS5XmCwr{7Bi`Ra1!04|AJ%r(vuoHqf zVTnN|UO7uy>)(fHc*rS`DZOVSAKiPQUZBg)dLMhFvwS|^j=NqU?j(>)v|x8wua`Lj zOthg_#RnyYOqP7c1y4NTEZbaPCYYPd=%C`+t@Ta0)QgMj7d24>>GK?7@jN*q9l(G$ zi&&{9vFnPEmBC-OBujj4o70M;e2qOZeh>P}g-&V)KCmYDcu5xiv_?|md?CPKuWudKidQt-u}eIGZ!5F%M}TJ@d%LGT zEi1s0+m~O~*d@WyFx5uUj?0jAlgJCH=2-x~wTv3W`;{U_*PG2j*BkRlt3^=$_$EP) z3Z*Ka0lD;f`VLfnvf&Ivy0ut&Gk~b}=@>2Wbkx92|PbPQcew;C|%k?YiYnSnNnR$j~eV&U~`- zCAKykT}D+cp5Xs4E=~#B8ozN6eC5G0UejTmVYAJqRErV+J_3a`!LDD8U22wV%p>pY z1_>9V8iAh^<%+JB!4@{gGGk#fDv zPlY?*^*`LAb;Se@+MSSD%CL8SI&RzQm@(8`6uAh$*)3h8rcT%T0yPdDtUK4g+rJK> zj~&RIyvDK?y3`X&z_=usPp}#=Fr<~%Cw4cVS~mnZxPeShG`q4g6ebF*5vtH9L!BAU$?&W2&A z)31EXU-LJX@x7MsLfp6MXJYzOekHQ@dhI9dIYIe;E@-E8hKq3(-Xi?h^GLaJIN~B=CKblPJEmwkcBvJMcN_41?t-p)Mg`5hR3VNG>sd z8JUDk_<2nbgt)!yqOycxXJAtgVmj`sq`>i-IcKR|LsGZj@atqww_bTKw z;q&7m(_*o!K=f0M_ZIi_Bq}vc`QTIb$juD4?|@-!R`fQ;yL@FhVt|gvD>5b}O&Xcz zrqdRJo4YeTR%Z7vhkP98o!Ct3d2vX*?;zp_m4$L=${7eFA0F0I>$Shl&$#RW4k+aP}RhqUGDRgz{H5 zHJPE6uZ8?9lg!HFK`3mmw3i z+>zGICpGZ&k67K#qsdSn{KD=d%7G=H;tndohd6@?{u&E}D#cE|5UnLjnn~6^n4^Q2 zU0yt2RE%Bk@IdQ#F8lF&603@$DE(ehMjT8uVy3c6kRR?}3caTH*5+I;K>+fPYG;(- zU;{NX8w}iGP066VW(jTuuD645K_>!1Vn)eQSi8~U3A0GQ-d>L7DxR>FZFR{U<2w}$ zx1N(>^|s6Z&jJ`VU%6t9_}eQ5^$sAylu^oCFqhA3Vf)uIEG@3P%}*{~5vbjy(jfSw zFe3_vNI^4SQ@Dsm#r00Fuy|0Y!d9UUhOuMe+#LV$k*YQy`rhDmUX`Y{xD zi$^JlpH{aPIPCC)K*K}SI?`ygu%?hx)I!;dJ-zvd7aZK}RqCkbHm~{RJ4x6EK_h^y zxjmbTRONyB^7uNpan_&GS{UQf8Qfr#!Y^_)Li5mvjXCX;@A7Ybd$Lg)mJiQ%;@>P2 zuX13Y9)!|bv4!}$Y2;U4_%TV{&cFVdPoJ+*n|wHxp4p0Xb7y-+Jw?F{o#`)p2RHg?F3!C0Y~DN^Jt0*Tv!Ht7)$A<2!$_xfo9_sj>~QxMGLBB%Hm2M z+lSd9v9p=BVoUxIQY0pP_Xw-t&A&;8hcxop-x&i+3D?3xkgF*{Dj4C~^4n0xZZSto zitrVxzmEOh%f*)I{>3%B;f}vk7w}k$UbmijCH`j=0N0{5YJ8&d7T~&3fBEdKC;O9n z76!yzz}eTYvwYM&lGKSEu$jei3)!@Rse~dIW__fZB+_xjsTyYedc5>@(3x9COt`E5 zk1AM-Uw8HQh~R_P+&%tQmatCwug|Tv(*m!>M!r8`2aOs@AB)KS(sMGM59Nf3pd3MF zow3-_VR61`F{3&3cB*wlQN)v2;~1jVgyGP^W?d=;Cs5vPB>y2sEB>HT)bV zfBB641d079va!R4!1e*uE%LT(3QZ;+OP>iff`1?#J+E$bS0J&u=N>ys4Ea|;yb(Tl z7g%mAN`#%F^CiysSXqd$z^$0~lk$LO0hN2T{vOSk52$0?v{PR%Ie`#=c$8`(zIzvP z7km;k{8E4WVtB-Vxt1ESWQmmc6zz;3W57p956k5o zi_m|W9{AI%%*yv{6vy=eciV499ORP9n9PUX-`b#>7h@az2!Myr*D{0u`?R!?K_>ujso#!K9RMvDj@Fhn1}e{1*z*nWATe+ zDapLAG`Aq7tK}t%xHhQZ`DPDeM2X%Bp#N7Cc71@_=@0&c(RtK|)jIiVW1_{P3mg3| zqxw(idlTfLtL~9{a#E;~KMwUE`Hj2nd8^|Uq>7OhCMk%BLC>T5+3bNCDb2n04D|Oq zG?(*5vbU6$V(-oF(f=TvPzqrbtGK+g8oc3*!Xt{Lp8rO%Mhv!Xh~u;ud|oy+rGjTL z=ek3BBJkxulg4Z@zL@z$+o68?I0*E(;$%Q0J>@hsc9-Vz(UY+~9RkCS z^G^ZJWi&-q$wa0yih{~lKPb{# z(gwXlYn%k`*#E?E!>uE>C1M^Km#+pQvk8A#qz9;L=EFe42V)b=1edhXtWAT%qhu0} zUPw_<>TL!Y@zvE`t@*gj#K|y89|3h+4uKZOporJAHYPgr zWegAN+2)4MurhGr()fqfCQ=LKp~Rhy+Lp;dM$t4>lO~-Q+%p zcL(?R*c{)8h>@&fBr4;ju@UIYnUGlRAk;XURSd((uI;V1Ot|~cwge8wp0ejGB-uhS z+Yz2&eUUQH6aNinZfVRzj|wfd0%UHqgZ!_ttDjUgD|U-v2o?4x2*mvTzg@{I6d}jp zjn!AF2E=KCT$@QC?1Ku&&D$MULHV0@61!nOS09QL$drRphYIQyu!CF558WwKQ-?8* zNGAU0R018V6n3PiRD@!mOgrF2IfAlm56s;P@+uc@nu{y7j(DWa z|FZyJX8ji=!7oT?qm%0&B3@bf?GCF@w;u8_Qb*|1mDsgS!d(I6DfqAP05Z?97f`() z%r|12`x8ZbViUrrO50j_$!`D8;hdEQy3J~&o=SZ8u(Op}9zIZ9WcQxVshfxL|Dt#P z4MR4J;kwy~21i@gce!bxgG|m_DS45^-#+uZXO%t#TQ9Cd7&#|xHfRw+#-Kb)IIGb~ zL3`(Biy%5tLAd+7;n}#KZS5{HY91c<&~6>=`%C34oh^pei;O~bh=MU*TCNV-vyTOp z`4?LtFBRE;UMkQzd-y$IN93~nVl#PYFU}Q8YsJG-v4PC?-#aW<(`pRKwub{rhqOZd z7+X00n&cp+N;Xz0&QJm;^767@$uiUTHO-418$%QtFfQfg{-RgNpPJC@E@jVb zak0AHWnWQNY27A1ZX{embk6qa=^23aG`v^KV+$ytFIXTe(D2ut9#KaK925e3B!%&>xUSp z2>emHdCJi)BkdbfDsQfm?C7ZIIx8-2^Pc+tcg~iC5n!5@+;K9qbW?I&rdBfb&vtC& zrqAEo&1=$4CeP!m(-v8^sCYLU*Aev!V67AYx)h9BjQ<&v?Rde1i@!xc9X9#TapI>IgOpK$o4}R7~&!-6AYlH2Nr+>HB@^$Lj3FEowX`RZXi$ z?=Ju+nR$nkOe^f8kCg}{7GUBxqj`jt@_=O+_VZb2{NC2$XURetVlcbozLZb&H4Zm8 za*b{z6??UKSSU6~-)v3KTJ8n4FWzK|Mg9lN3!}jnm_4;3;>NJynoHGb3n`_7Q9a|E zswEXhu?~z#O5md7Pb)8Q>*`~29px=@P>;G*Zq$?dw+1j zjg0D1R^Uqi(Rn{mo+PT0D_MWz-aT~gX=0^-dsRuUxYGR-LxZ@Oy8OdB+emhHIjGp{ ze^(xe3QLK2{lV{Tm-my{x1_Xuc?N(RN;dzZv(b$n8u`7RiU~Qh;nz}kJjkmmS~`Gj zB-z18PRIn-7e4B4a>RF#VV}RpJ1m7kHXvHEf4+(5R8)}- z`Q?e9(|Qzc7SK{;slV3T>^#auEeb-8Do%wJRa7F+&$*Qs0vby@@p<{S_O7nJ+uFJY zLBEr8uEH>)vCImcw|I8-=)|H^jho9zE9fW+8)`@!Y6ezhXucT(q;#$}caM(549{zZ zf6))dP9Nzmx{#Amw2JM1y!5;zN9pr(w;>;l8Qe$Z)UyIK!fnk2_Rb%a+s^+=XhkY5 zXZaY>c(BRp`#79_(^;)oF?R$l#$$EEb+0)W?QOOKUSiK*iFJf5o`ZVOgyj?z6>wJ0 zn)1->T_vO7F99$7FHfiXi>$1j>%|f zQg!a*Qgs8!-uhX6oy<)9A@wA}m^y-CNZ8pCZoA1)w#e1BIeIA)7Vscnh`GrNVZ%op z;=FjV*V>0hXP88@$M|U+&*8q`{5DGy@E8u7cXJUYh_1x`e3^5I2)|!(c&^%R&DZUz z9RGOTysy%6afE7MGb1v$$T}q?HUT zt70`nD=t?5#f0@0mk4qt&m^_?7b9Lh(8EhH*YpjO&&q(3Af|r-4B-Hh7OQ zT=k_U1l38azQ068AoXSiiDsw=hl0s|k;RqNO?{;rS|>n}#_shAYgq6m#vG9`6eYpZ*9fske4tBFAob@1aV^>x>F1{W(GX`6bYBzg{$! zAvIA^rw`(IH=J;ejzZiWfI+LLVgOiop*o}5QM@C^tyaKL5a zl%=_HAvlK^d-KK!|A+s@u|M4R^l~Hj_d$A?^@friFM}@O1aLJP?%+-D?GSkL+*%zP z9RfWbt^#{{HX;Y)xyBhUn27^LL)@G$NyCZO`h4!Pxz(wh#|vdpfdG;z$NF`Zob@;F zBOR-Cho;}srz;%bAmS|uv@xK^@&cGs*D~AWG0p7w?1Wm)<8Zycy6Z1D`9BP8$uA>K z`Hc-TWVR9w-Ko6W2b9oq-6kD&u|Vs8hwGir$}#e9^B%GPsQ2nci`v9e%do-Y>A;@O z;=%CgnW~+zDc0m^}?tz$Ly^l7X^O0!gT)wUb z(en}39JtOuDvo620U*$Em^7tInvlX=1${Ab$>_)*0=iGUzc!{H%RLqkikREN+|XkW zTepnVf!x(7eufv~xs19oM2595g*lvZ^%s8TmWI5gj{uV_iDfT$v$lUPJ(X-!tA=+9 z*5vwGT|VE<#5~^%a3p)RnG%U%Yc?V?I#>%GT{ zQt*7ctl!$|gxQ-5o%wSS{Bb}@*9mLea}Q(wHSp8%T(A>;{b_VI!}{0K6YbNbzqk`? z*GSaw7ry6zf$W9%2&kp!hei~Td}ce^kmi0ieSOPTAxTT$!I-1Wq2xSmZr67>c5H`p zyv@(+xf)?;t^HfsRy`dGPiNrIBE3QMquW8XiiP*t7P6}0^22Y|V)jLvmGABVP)aL3 zIlRnv$2do(?I;r(bvI#Hfwfgb_&fy*fpX5MNQUvIW(^-4q9YH z87VSju1`DIJ90^-?)m);VTd#n(MAn`7K`oQIP$d&XH4t1M&SPbcgXqUcl_Gy80vLP zv)Zw_5@CFE&ra6?@{p&47$QVsZkc92t=p8d*_5#i7D8H~I%6M`Ey+UJt4MyGz=j5? zhbzpG_p5B_%nibw1E_0h&&OuWCa_+Ft-=6%bZ>j^z%#zuFYlW(ydR~9ioV@RPa}BA zg{49cMK|Xc6XsuLDQ~|WKbIC}d1~B|@wB(pJh20!oA`7#=x8m}H|~kJ8bqyUR6+ai z78%tby$P!-hm)H*8LzuFZsmk>ZeK-UGGrdPjBm!q>)$)gyJufUQIli1<{tNZXBJef z^B3@*Vjy-rOs*(#&2N`!xVqa3L*(3OBECyCLyK}^2JMsR58kbAb4N6{?;jD;l(bAj z3`f@$7f;lXmSY-Ca|w+GD>X{%M7Ygv4}gujmKDrN5zv)v5s*?_1~A-PK2FCET6KNh zY97HStjybVyK{Tjr(JIqFZBZsDLt#)pU#5a_H=vq%nXpWHJiX)w|=Fv`&-&h6%;jr z+cIgEmo&Lw{HKanL-uAP1gm89h44LZvf+cUhyO$z)}u}$HC=vDcjN{sC_LIjR_oe2 z1#{1yL`qW7-jrK=V*y38^CAMa4+%liLkx`n?NXlN+etPv&dS^qOkuJbOhn^__zV2~ z*vL#@;A3)2F%zisC1rM$M18}PjsHH<4ySq_5SHAksiw%|-B@gT3|zXr_OYfI+txZC76)k}|C=3$a%Rmg^>OrdOtg>G?`iEkib)b?g&BWwwJz-g!B^Wd)5^Ru`Le zHD>RK8Z46kZ*;=E)X~L#%!Y}DDuh);aJ7#6*IMEXy(%hG&xZ?n4MnA*xcm;VF1f^` zF*$c;L;}KSYDHuIaYarQtMHO9jBW4zid#tu&&Tm#Re8gaN?LBaig8`Xu_@~y1Gdj4 z>fTkr>Nn%iYa{@-fR((u8muLlEUf<jRqx3odD%F8zHNgNrGvOBwH<@MMr+jg6A2B7J`x@R}@Jj|&2y+IByr?Jua zo`2B<4eAi0KQ03>fMEsDH;cR7&y#aWm}Tj($}JKZzl_N9QgwiY(mt|z%|$;SPKoAo z$S%p4MzlYCZrPVoE^5+c`YZ@Xs?*rO@S=^0d@en|uO#_5UmzK*CxIJeeIw0cAT+m9M$(puXx}SEMIy;JLi6 zx9Eh18l5m;5!Z=o0rA6XY6^OFhgqD8^jw6-D4lhnK!+*689WG>fum}ag;K7ohg@83 zHXitQ5k3ijPbF%<>$|0QyXmey6M>B-+?5)EA_RR-xgA*!nX~ibRngB&ljy?8j}|K? z;PZgVruRE9=Fm1H-ii!)#?q6SwR}^ziQZVTDoC=l!bGmKoUu3N?AsQu>Gm+dZ_hqq zmoMCsx!TKdv#8Gy!sqDV=pVTBCFdLY_E+wfkZa5B6T{8ZlXE7od2Zo9Q&6>5Ym*~a??+acns7*%)G0FeKw?y4DYqcl~VpfVa$QvzaSb(*owOoxT1rO09k-mIK{~cU zz~4l-!rW9Tk8csz(Og{5G4s@BBgm*$1D!*-Gb0L;6ORYqcQS{qE;(!3GqO39K`YUI zSAi0Va7^f{=LtXQ+0BCAxQffQG@7?3Y>I}*w?mYXjzy5{ua zB2S(-D1Z$H6wqk2+kgAyWo$hoHdw3Hi`o&mG;2T|dwuC*Nw0ot{(O|!vr?F1;h z)%zFTz$25YqUPV8SOIi2tZ1c;GX&r+a8%{);QwLR$O3QK5efpP!+P`3)+dA#y2{@^ z{k3PWOAko6zAePq zJ_&g|jT=VnD-RIs#B9e=ZzLI?VX?^K1_q31F2p114L~*y8f&JrpR$fustZ|&>)W$)cAYQW zrym)yH8wV{3D-{G)= zR!1ez`^=O|D$KH?qVWR>b=|{KN{I;OvF>0Fd zupT|6>yIC;G?4NOPyOV3zsw+=3IORaoq_H95P?gHAU#1*Lk*ru?Ny3HbdBmKthhWz zzP#RqPW7N~91SzKDHGW{axvZBh$7i~;wtLx9VQHQzle3=2nbzXbdDJtF&~*eXggb$ zuYWlS5_{G3XiO`?ebYyfWlCLI+#M+rvBW4(|HW=i>YKHRt*);oU1Pf^x%gn&Pmwd+U_D_BPYDVNObMCs5;g|4o74`Fx6Mvw z2z8)PQMXpSKPSc4?@Z#t(ff*_O~)JN@336_ncO|97R3n!`Iv`x>3~`&vVoRdi^{mu zgHTK=#zFH|2;cT|EDrLsYE_gdEITeJ;(uW&8PxRElug{Q?l~Govs}h&QMEfBAIGb^ zVTtBMCAbW<97V_uCZ)pa=&~6q&tRR)${Gd_s($43RfyAnOS;EtoIVx%Rf z{_)ehsb>P3*$S|ljNfa$C9join}xXMd-qk)?%|Z9W3V|-kS5o`&iR7?IV#PM`z`Ow z8{b+*if>zzZNrq!^Zx#3b@-9Gre@f^`%Rypu$m%W&_;+Vyu^nSkpQrlzhCH)BOmXCIo9qAWY+p?+k;YO($rA38Ij8J$NT}p{-@r^=?#w8zL?G z$Z>U4UPK{7kWbO9msPOw6q`{ z3_tbjUT0TUe7tQ~tKUu7bbStE?y_%rZIo6Z8G61v4m{VWWR42Fm=UU0u_le>ClYmi zAvDVlvf5gn2#1OoK4uJ9bPi6MYxgpmow>CvtC_Yve*v;#+_Hw6fw3O8DGXzxSHp;E z74~5GGNIqtQKVpLif)kiDBJgrOI9-9<^3VS%^`*0yVVX9qVQMS{5$Qh6O13XuiQ=9 zCM>$?08(1b*Ss@t8=pO|Cdcp5UDrA3T&ACNAU=sl5G$D&I3 zuYl_|ry<2}YEnPl*E_3Mz!xLy{^v?>_enWy?TMZ<8DLGzB4n=11Yr(}F5qAU5kWE9 zyAsdp7q6K@%3|m*Xq|$Nou`u{OSYSpT-6gJ?Dup^iL*9vQ4ago(!#p%R(vJk86 zC{llSK)nBA0FnbcsC!^j)xO>kGrKY0>wv`{?trk5%;nlXD&fV8oFyddpZgH`VX<^g z{Hw>HL3(JbO$t+YvpUgwgCx?554SbiT?kZu|M;+&yIgfoZC9iE)pnhn)WwC7l#f5J zbDzo`)T8htn?2`ZaMEWnkBileD9ROVqe)DPIFYArj*m+;qYti82#I#Z?HjwC@*3-& zG=6z~{ynXdZ9>ZnMQ<)l}5mRtQ0}C9=ntF;wRf+k?CXk4e zmO5ZzRY~S0+dmI4sB+0pkZ`Y_znmlTCUgPy4Hoz2H+kFE8IjhhbprUC6u^Vbla56c zTwDF@p0_t~hcVH_=p|Dvl{{5_Y3a<5y=hBNOuD5zx`nNcf%Hr8eDxj3_EztoWd~ov z8Y5q^+bJXO!oqqPHS68J+r$H!xfKnSA7W)QF(&Y&$-2#iVEq*#DsAucgMh6Bb=f3g39Izc5KqU^Jptc_j7zX zbpWALy(4cygI>C?ufQjSHB37ZDS<2S%0fx!NBHg=A`Ij}j>PlkdrRY3@9Pef1#S*K zTZbP^rHcNLfzAy}syy2j)N~Yo7w#%4_ej4L-1-|Ta5^<8xhw4}%X3=N0*bM=S3lw9UW?BC@lN z#$JxyuogPQo_c&jN-kw4ig&EbA~SQb^ro(g*Fj-hz(c{s0%6`7&l#F2Q%~bjUN%{X zP=`Ueo<>4C@$Y9=W|l$7AC`oK9}LWj^N+~|@fK)oy_IYs<)m%a{~QA2md+|wvCs4v zYYQZGJ?N`zQwyD&9h6V*r5?O3M{Y{2Az}hqN&evm2Oi0EML~U zcO&rL-3+_0K93uzG6?DqRBz3lL4d%gO9sb|8WI83XW&_n>!GPY&);F^Dlb4ymY#0! z^USpq+V2lNnmJFU-ZYRwO zA$1cGdt2vXR!mR z6g`-&63P*>geIiWJ3XP;hX#Ex1E0E58c@q9$(HcVQ&Z0N+VUJ$H&mO^OBM&t?Jb?{ zm*+ChNdT$*vjOMbYCYb8RG_C-Kqb77szK`0-5t004kH(rIc3;yP0a+P=+=q&!ekR_ z7XIz}IJjj>k@ZJ4)^TBt8Tw6TdQ6b$9~tl1Z&ic1qQa9C{DdJ?$QL(tO9hTY1QY%tI8RYKKj z#G;3xqD%V*Y81mm(hW$>CKXF*@oDtwn({f&YJ$`(U3&UR%Yep7I+h9bq!yq8Ax!{b z5h@GD*yBXO0UELo+CK%dpgv}`rGo2$d($WL+&54fm1LlCBs7a)*Ro|T7a)jggk1}n z@2=-|Vo>y>+w1l?eV73{7nS{bH~%}j%*UB2zcTUU?Xc*vTCb0+P1_ZMJ8;O^gddso z(&l}b*Pod3&TtzsS3H_PZ}7U-*H>P(YSaAKh_qmJ{WKwxsxSh5-qxpeROIFLUDqZ- zIF#;?XUDrkiHN7ee-GIC_0ZzgHHSI{6CVb==)`_&@>m1**2(aw{6qFm_=Yu(aj{9F z(?hB5hciD|fT`>C;Kjg^_IgUS`nxrMfUpm^k4X8TPW`^XBs(HiqaeUC_&wfHPn&`Y zgn8k7?~!oL@jYseJV``Q^=R~d`cQ?ILbX8 z-@PAnz91A=JX!8N*WhJ-dEkF(KH9}IYkp;nse@cNKM4YQWFSqrXIkXca) zWyMVu`#?s`Gs7Gd4N4G`w|)wopHJbi(U8L7A56YXg=c`pQnvfBg#A{B`JT#xEGG}0 z6w3@A1@>gFS(T^=&3en{!Y(w2j&DgvEr$6&f2lrX76b;{N3@TB%aP`em2;+wQqk! ze@_$+dvJ0%PK^X7aT#R3hf1iS?dLj|Neyae+)HEXA$}zL7-jQ~&Aab?*1b0lrD%Uv zDPq-?yeEK>iU#y(KH5{=B}o$C>^PeWUH>Ey(tTW}y8dw0ENY#qiIb6$IaN7K-{z+Z zfsXf>FRgn3jVY(n(Y2PzY@THV*?w8DcQN4o9_BIb$t12}ASW^4nM{|wp2+=#H_`DqB5(9Smpk0~7;f+2FzT6_zaVF)5`)Yw zbz+{BX0nZwX38<5=h3<;?=U^!k!~3e?C4&earTe2^iX?l7(}^=Cs%PeA;!v-#=-L0 zuh()Sax6*j_1Z62xqC^hl!?;Jx-SOkg$)K9LPLC=2}7RJ@64sAiN6BnbJ=xCR<)Qm zb$91JI6^31dOvd2j1R-W+aFVIhU7j^3Z;z?jv-8vkE2+`p)qJwE&7q`dONt=-k+f= z$Uf2pcO7`XPBj^;tkv7r)_~$O|2~LB5P5vmbwyViwss8V9vwLZ%v3?&gK1a*#^%nn zQ;O>~m=6*q7*eRq>=3rbmrsm4Iwunhi~b|Yaq_NRG!qVib-!mPC_Vhf_{3xDSQsB* z0OL9B!@SRerAXq(dhDS%u^6V;%jZ4sPRMp8t!54j*j|G=}(#jXw0jkQELC*#amIy2&4}JrcJ2W`x^C=+S1;A}$@Y}%WyB34~ zfHr;C4I5xXm$CDiAhB_pfI=g^d>9qq$0C!%cU=de+2>%nJ%GE;v){ZFX+^(L*-*A1 z2YKa^nFl=YO790OpDHU^G|sXBj>^klllr%FeNOvc;Loxp>-;niF}(@Zk)4&%y*^yR zGmT0&Y&gh}Z=$oo2X>$HVynckvOkX}$9b}{#bZv_QsG=I#XXcFHo%{m>rVjH+fZm3k+-$M@E(DvKUCwQOzwgIbVo2Lx zz~@H2A-pW7yRr=+w(b;kil{9sG-X=7dug-IFbQ(A5M{-io z%if2hTt05<0N<6{>;J?Yv3DGNiB|D)q z7sSLN119&S&~C=`ir@I_D{erwQ;QYX5BOT{A$MHq^MKqD1)1daamk??Dv0CvP5~zpgfF zl?cBxv|W(}i{b=6fSTnsHg-q?41aIRQTn;wM>=GYAQA6VYT^}oJSGVGCX^a_LL5zU z56>I~r}bCBixR0Y#G?doeK=+2m~M(ETE`r=&ieRBTm*@_VzC0CSH`O|b<;%eD=>Gp zRI2I81;UYh02@8W=Z~-x^^Q&ECLZten;dM6Af8fL`-hVV5{>8IW)314=3hX4sD0by zaL6|@&>ZSO`Z{CfEK@ zTsfZEW&;_jkl%NlfcuB8tNSRkq7#anU%4kZTgToNTC{M4)A~dF*3LhIA1K9;)B!}? zj7&_zl(~PcS|;3=7y^1jFT1&&hfGVxzdrV*&~J;?pxoQtpQ@N0W{7K8HttA}jO)
- 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 literal 0 HcmV?d00001 diff --git a/docs/source/assets/client-diagrams/3-minimize.png b/docs/source/assets/client-diagrams/3-minimize.png new file mode 100644 index 0000000000000000000000000000000000000000..2d9d3ba3dbc0081858e6a90c9811d1805747ff4c GIT binary patch literal 59007 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.F`MlUKA-=$4J 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%0A%1dx=!!JJ^g@{hGj>?%$m4XWUAQB>R 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 literal 0 HcmV?d00001 From 4fb770ff7cf5fdcd4bb402da5a69dbb637fe20fa Mon Sep 17 00:00:00 2001 From: elosoman Date: Thu, 12 May 2016 19:37:35 -0400 Subject: [PATCH 122/409] CORS Support doc and config (#68) * apollo-server CORS support. * Update tools.md * remove defunct cors config from apollo-client. * Update tools.md * a little more clarity on the client side * added specific cors links --- docs/source/apollo-client/index.md | 28 ++-------------------------- docs/source/apollo-server/tools.md | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 4e1e0b59af5..709fff1714d 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -64,33 +64,9 @@ const client = new ApolloClient({ }); ``` -To automatically send cookies for the current domain (same server-client environment), the credentials option must be provided, +

CORS support

-```js -import ApolloClient, { createNetworkInterface } from 'apollo-client'; - -const networkInterface = createNetworkInterface('/graphql', { - credentials: 'same-origin', - headers: { - 'X-CSRF-Token': "xyz", // Rails or Phoenix framework - token: 'supersecret' // Custom auth token - } -}); - -const client = new ApolloClient({ networkInterface }); -``` - -Use the include value to send cookies in a cross-origin resource sharing (CORS) request. - -```js -const networkInterface = createNetworkInterface('/graphql', { - credentials: 'include', - headers: { - 'X-CSRF-Token': "xyz", - token: 'supersecret' - } -}); -``` +When attempting to setup an apollo-server and client application running on different instances, you will find http-405 errors thrown by the client. This happens when recieving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. Howto can be found in the [apollo-server/tools.md](/source/apollo-server/tools.md). This was encountered using the meteor-stater-kit and was confirmed from others running the apollo-server with express in node.

Loading Intial Data from Server

diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 914ef38a5e0..64a0aa11a3f 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -18,6 +18,22 @@ var app = express(); app.use('/graphql', apolloServer({ schema: typeDefinitionArray, graphiql: true })); ``` +

CORS support

+ +An issue was discovered re: CORS when using the apolloClient to connect to an apolloServer running on a different instance. +To account for this CORS support must be configured in the express app. [CORS](https://github.com/expressjs/cors) is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options. + +``` +import { apolloServer } from 'graphql-tools'; +import cors from 'cors'; + +var app = express().use('*', cors());; +``` + +Ensure you have npm installed cors. The * value allows access from any third-party site. It should probably be updated to reflect your specific environment. Simple usage details to [Enable All CORS Requests](https://github.com/expressjs/cors#simple-usage-enable-all-cors-requests) More complex configuration options are available including the ability to [Enable CORS for a Single Route](https://github.com/expressjs/cors#enable-cors-for-a-single-route). + +The information contained in the apolloClient re: CORS configuration did not effect on the server. + **Function signature** ``` From 901b430c8962baff66d7201c95a6928af5db0a60 Mon Sep 17 00:00:00 2001 From: Loren Sands-Ramshaw Date: Thu, 12 May 2016 19:46:58 -0400 Subject: [PATCH 123/409] Import WebApp before using (#73) --- docs/source/apollo-client/meteor.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md index a47a36bd8a4..67e38b76c34 100644 --- a/docs/source/apollo-client/meteor.md +++ b/docs/source/apollo-client/meteor.md @@ -54,6 +54,7 @@ The Apollo server, and the Express GraphQL package that it is based on, rely on import { apolloServer } from 'graphql-tools'; import express from 'express'; import proxyMiddleware from 'http-proxy-middleware'; +import { WebApp } from 'meteor/webapp'; import { schema, resolvers } from '/imports/api/schema'; From 986e932d7f952dcf6bf42a40c71ce1739972a03c Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Thu, 12 May 2016 22:09:22 -0700 Subject: [PATCH 124/409] Explain normalization better --- docs/source/apollo-client/how-it-works.md | 68 +++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/docs/source/apollo-client/how-it-works.md b/docs/source/apollo-client/how-it-works.md index a263b562042..f32104b0369 100644 --- a/docs/source/apollo-client/how-it-works.md +++ b/docs/source/apollo-client/how-it-works.md @@ -29,3 +29,71 @@ In this flow, queries arrive from UI components and are processed before being s In this flow, query results arrive from the server, and are saved to the store in normalized form. The query shape is then reconstructed before passing the results to any UI components affected by the new state. ![Normalize](../assets/client-diagrams/4-normalize.png) + +It's easiest to see what happens with an example. Let's say we send the following query to the server: + +``` +{ + allPeople { + id + name + } +} +``` + +The result for that query might look like this: + +```js +{ + allPeople: [ + { + id: '1', + name: 'Luke Skywalker', + }, + { + id: '4', + name: 'Darth Vader' + } + ] +} +``` + +One option might be to just throw that blob of JSON directly into the store, and be done with it. But it turns out that the best option is to _normalize_ the data. This means splitting the tree into individual objects and references between them, and storing those objects in a flattened data structure. + +This process requires generating a unique identifier for each object, because we need to be able to refer to the objects somehow to put them back together again. The function for generating the unique ID is pluggable via the `dataIdFromObject` option to the `ApolloClient` constructor, so you can pick which field is used: + +``` +// Default ID - the path to the object in the query +'ROOT_QUERY.allPeople.0' + +// ID if an ID getter is plugged in +'1' +``` + +So if you have the right ID getter function, you can end up with a really nice structure in the store: + +```js +// The normalized form of the result above +{ + 'ROOT_QUERY.allPeople': [ + '1', + '4' + ], + '1': { + id: '1', + name: 'Luke Skywalker', + }, + '4': { + id: '4', + name: 'Darth Vader' + } +} +``` + +

Intersecting queries

+ +One of the main things that normalization does for us is decouple the identity of an object from the query that was used to fetch it. This means that any time the object with ID `'1'` is changed in the store, any query that involved that object can be updated. This has important implications for UI consistency - you don't want to end up in a situation where two parts of your UI that are displaying the same object, but have different content. + +Another great thing about normalization is that it enables smarter data refetching and even basic reactivity. For example, you can do a really large query for all of your app's data, then run a smaller query to refetch just some of the objects. Since the large query is watching the objects in the store, its result will be updated automatically when the smaller query returns. In a similar way, you could listen to a reactive data source like a subscription or a websocket, and push the results into the store, which would also update any interested queries. + +Lastly, normalization will be very important when Apollo Client starts to support Optimistic UI features. Optimistic UI will function either by returning fake client results for mutations, or by reaching in and modifying store objects directly, but either way it's important that those updates affect all queries on the page and not just the single UI component that initiated the mutation. From 6ab58a8a1bc75cd1b23973807e0e5d74441cb4a2 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Thu, 12 May 2016 22:26:13 -0700 Subject: [PATCH 125/409] Fix header tag --- docs/source/apollo-client/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 709fff1714d..551ad93a8fa 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -64,7 +64,7 @@ const client = new ApolloClient({ }); ``` -

CORS support

+

CORS support

When attempting to setup an apollo-server and client application running on different instances, you will find http-405 errors thrown by the client. This happens when recieving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. Howto can be found in the [apollo-server/tools.md](/source/apollo-server/tools.md). This was encountered using the meteor-stater-kit and was confirmed from others running the apollo-server with express in node. From c27a5b754bb1ceac5cf38a3bccb432ca0fd1949e Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 13 May 2016 14:42:29 -0700 Subject: [PATCH 126/409] Improvements to docs, add dataIdFromObject --- docs/source/apollo-client/index.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 551ad93a8fa..e60fb40a84b 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -20,12 +20,13 @@ To use this client in a web browser or mobile app, you'll need a build system ca The Apollo Client class is the thing you import from this package, and should be instantiated to communicate with your server. You can instantiate as many clients as you want, but most apps will have exactly one of these. If you want to talk to multiple backends, the right place to do that is in your GraphQL server. -

new ApolloClient(options)

+

new ApolloClient(options)

Instantiate a new Apollo Client. -- `networkInterface: NetworkInterface` (Optional, defaults to an interface that points to `/graphql`) The network interface to use when sending GraphQL queries to the server. -- `reduxRootKey: string` (Optional, `apollo` by default) The key under which Apollo data will be stored in the Redux store. [Read more about integrating with Redux](redux.html). If you aren't integrating with an existing Redux store, don't worry about this. +- `networkInterface` (Optional, defaults to an HTTP interface that points to `/graphql`) The network interface to use when sending GraphQL queries to the server. Create this using [createNetworkInterface](#createNetworkInterface), or make a [totally custom one](network.html). +- `dataIdFromObject` (Optional) A function to use during result normalization to determine the IDs of result objects. Function signature should be `(result: Object) => string`. [Learn more about normalization.](how-it-works.html#normalize) +- `reduxRootKey` (Optional, `'apollo'` by default) The key under which Apollo data will be stored in the Redux store. [Read more about integrating with Redux](redux.html). If you aren't integrating with an existing Redux store, don't worry about this. Here's how you would instantiate a default client that points to `/graphql`: @@ -66,7 +67,7 @@ const client = new ApolloClient({

CORS support

-When attempting to setup an apollo-server and client application running on different instances, you will find http-405 errors thrown by the client. This happens when recieving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. Howto can be found in the [apollo-server/tools.md](/source/apollo-server/tools.md). This was encountered using the meteor-stater-kit and was confirmed from others running the apollo-server with express in node. +If your GraphQL server and client application are running on different origins, you will get HTTP 405 errors thrown by the client. This happens when recieving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. Howto can be found in the [apollo-server/tools.md](/source/apollo-server/tools.md). This was encountered using the meteor-stater-kit and was confirmed from others running the apollo-server with express in node.

Loading Intial Data from Server

From b7564dd38121a4fa54731504ba93219353f8eebe Mon Sep 17 00:00:00 2001 From: hippien Date: Tue, 17 May 2016 17:51:48 +0200 Subject: [PATCH 127/409] Update errors.md (#78) errors.md had same order value '204' as generate-schema.md, which made navigation (menu-order, previous- and next-links) weird. Change order to next available value '208' --- docs/source/apollo-server/errors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/errors.md b/docs/source/apollo-server/errors.md index 3a452e83c61..98214d9b104 100644 --- a/docs/source/apollo-server/errors.md +++ b/docs/source/apollo-server/errors.md @@ -1,6 +1,6 @@ --- title: Error handling and logging -order: 204 +order: 208 description: Add better error logging to your GraphQL schema. --- From b5b82dff7f2ab0e4cb0ceaf36908554a558600ab Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 17 May 2016 10:27:29 -0700 Subject: [PATCH 128/409] Drop reference to specific node version in tutorial --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 1db5e3ffea2..41875f0c70c 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -10,7 +10,7 @@ We'll be using a package called [graphql-tools](https://www.npmjs.com/package/gr ## Setup -For the remainder of this guide, we'll assume that you are familiar with using the command line of your operating system and already have Node 5 and npm set up for your environment. +For the remainder of this guide, we'll assume that you are familiar with using the command line of your operating system and already have Node.js and npm set up for your environment. If that's not the case, you should [do that first](https://nodejs.org/en/download/package-manager/) before you read the rest of this guide. To get started, you need to install a few packages and set up some boilerplate. To make this easier, we've created a barebones started kit which you can use: From f1aa8200ec18812bcb52a639241c772066ac2efe Mon Sep 17 00:00:00 2001 From: Sajin Shrestha Date: Tue, 17 May 2016 19:56:42 -0500 Subject: [PATCH 129/409] Fix #watchQuery and #mutate links. (#81) --- docs/source/apollo-client/react.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 2d325b1d546..d05fe2ec754 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -141,7 +141,7 @@ const CategoryWithData = connect({ export default CategoryWithData; ``` -Each key on the object returned by mapQueriesToProps should be made up of the same possible arguments as [`ApolloClient#watchQuery`](index.html#watchQuery). In this case, the `Category` component will get a prop called `category`, which has the following keys: +Each key on the object returned by mapQueriesToProps should be made up of the same possible arguments as [`ApolloClient#watchQuery`](core.html#watchQuery). In this case, the `Category` component will get a prop called `category`, which has the following keys: ```js { @@ -152,7 +152,7 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa } ``` -`mapMutationsToProps` returns an object made up of keys and values that are custom functions to call the mutation. These can be used in children components (for instance, on a event handler) to trigger the mutation. The resulting function must return the same possible arguents as [`ApolloClient#mutate`](index.html#mutate). In this case, the `Category` component will get a prop called `postReply`, which has the following keys: +`mapMutationsToProps` returns an object made up of keys and values that are custom functions to call the mutation. These can be used in children components (for instance, on a event handler) to trigger the mutation. The resulting function must return the same possible arguents as [`ApolloClient#mutate`](core.html#mutate). In this case, the `Category` component will get a prop called `postReply`, which has the following keys: ```js { From ed484cff6803c2f3626d42d71e8c5f24986e5401 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Wed, 18 May 2016 11:16:25 -0700 Subject: [PATCH 130/409] Mention react apollo and angular --- docs/source/apollo-client/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index e60fb40a84b..31c7b3b9f55 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -16,6 +16,8 @@ npm install apollo-client To use this client in a web browser or mobile app, you'll need a build system capable of loading NPM packages on the client. Some common choices include Browserify, Webpack, and Meteor 1.3. Move on to the next article to see how to import and initialize the client. +The most convenient way to use Apollo Client in your app is through [react-apollo](react.html) or [angular2-apollo](angular2.html), so once you've initialized the client following the directions below head over there to see how to connect the data to your UI. + ## Initializing The Apollo Client class is the thing you import from this package, and should be instantiated to communicate with your server. You can instantiate as many clients as you want, but most apps will have exactly one of these. If you want to talk to multiple backends, the right place to do that is in your GraphQL server. From dcf1c8049b67cc10b194003f4883ea45ba376caa Mon Sep 17 00:00:00 2001 From: Loren Sands-Ramshaw Date: Wed, 18 May 2016 14:17:44 -0400 Subject: [PATCH 131/409] tools.md: Formatting and clarity (#82) * Fix Apollo Server formatting * Move cors to bottom * Fix menu subsections (h3 -> h2) * Formatting and clarity * Use consistent code formatting --- docs/source/apollo-server/tools.md | 90 ++++++++++++++++++------------ 1 file changed, 55 insertions(+), 35 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 64a0aa11a3f..22f702b4c02 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -6,11 +6,11 @@ description: Put together all of the Apollo GraphQL tools to create an HTTP serv While `apolloServer` can be used as an express middleware, graphql-tools exports all the functions that `apolloServer` uses internally, so they can be used separately with any GraphQL-JS schema. This section documents all the functions that graphql-tools exports, and explains how they can be used. -

apolloServer(schema, [...])

+

apolloServer(options)

-`apolloServer` is a convenient function that generates an express middleware (it uses express-graphql under the hood). It combines all of the tools in graphql-tools and has a simple to use interface: +`apolloServer` is a convenient function that generates an express middleware (it uses [`express-graphql`](https://github.com/graphql/express-graphql) under the hood). It combines all of the tools in `graphql-tools` and has a simple-to-use interface: -``` +```js import { apolloServer } from 'graphql-tools'; var app = express(); @@ -18,51 +18,50 @@ var app = express(); app.use('/graphql', apolloServer({ schema: typeDefinitionArray, graphiql: true })); ``` -

CORS support

- -An issue was discovered re: CORS when using the apolloClient to connect to an apolloServer running on a different instance. -To account for this CORS support must be configured in the express app. [CORS](https://github.com/expressjs/cors) is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options. - -``` -import { apolloServer } from 'graphql-tools'; -import cors from 'cors'; - -var app = express().use('*', cors());; -``` +The `options` may be either: +- an object of the below format +- a function that, given an Express [`request`](http://expressjs.com/en/4x/api.html#req), returns an options object -Ensure you have npm installed cors. The * value allows access from any third-party site. It should probably be updated to reflect your specific environment. Simple usage details to [Enable All CORS Requests](https://github.com/expressjs/cors#simple-usage-enable-all-cors-requests) More complex configuration options are available including the ability to [Enable CORS for a Single Route](https://github.com/expressjs/cors#enable-cors-for-a-single-route). - -The information contained in the apolloClient re: CORS configuration did not effect on the server. - -**Function signature** - -``` +```js +// options object apolloServer({ - // options in common with graphqlHTTP from express-graphql + // graphqlHTTP options schema: GraphQLSchema | [typeDefinition], - formatError: function, // optional + formatError: Function, // optional graphiql: Boolean, // optional pretty: Boolean, // optional validationRules: Array, // optional context: any, // optional rootValue: any // optional - // options specific to apolloServer + // Apollo options resolvers: Object, // required if schema is an array of type definitions connectors: Object, // optional mocks: Object, // optional - allowUndefinedInResolve: Boolean, // optional printErrors: Boolean, // optional - }) + allowUndefinedInResolve: Boolean, // optional +}) + +// example options function +apolloServer(request => ({ + schema: typeDefinitionArray, + graphiql: true, + context: request.session +})) ``` -The function `apolloServer` wraps the `graphqlHTTP` middleware from `express-graphql`. If you replace an existing call to `graphqlHTTP` with a call to `apolloServer`, the resulting express middleware will behave in exactly the same way. For the documentation of the graphqlHTTP arguments, refer to the express-graphql [documentation](https://github.com/graphql/express-graphql#options). +`apolloServer` wraps the `graphqlHTTP` middleware from [`express-graphql`](https://github.com/graphql/express-graphql). If you replace an existing call to `graphqlHTTP` with a call to `apolloServer`, the resulting express middleware will behave in exactly the same way. + +- `graphqlHTTP` options: [express-graphql#options](https://github.com/graphql/express-graphql#options) +- Apollo options: -**schema** -In place of a GraphQLSchema, `apolloServer` also accepts an array of GraphQL schema language type definitions as described in [Schema creation](#Schema-creation). +

schema

-**resolvers** -Resolvers is a required option if the schema provided to `apolloServer` is in GraphQL schema language. If defined, the option `resolvers` expects an Object that defines a resolve function for each non-scalar field of every type defined in the schema. Fields that take arguments also require a resolve function. A simple example defining a single resolve function for the `author` field of the `RootQuery` type is given below. A more detailed description is given in [Resolve functions](#Resolve-functions). Resolve functions should be stateless. +In place of a [`GraphQLSchema`](http://graphql.org/docs/api-reference-type-system/#graphqlschema), `apolloServer` also accepts an array of GraphQL schema language type definitions as described in [GraphQL type language](generate-schema.html). + +

resolvers

+ +Resolvers is a required option if the schema provided to `apolloServer` is in GraphQL schema language. If defined, the option `resolvers` expects an Object that defines a resolve function for each non-scalar field of every type defined in the schema. Fields that take arguments also require a resolve function. A simple example defining a single resolve function for the `author` field of the `RootQuery` type is given below. A more detailed description is given in [Adding resolvers](resolvers.html). Resolve functions should be stateless. ```js const resolvers = { @@ -74,7 +73,8 @@ const resolvers = { } ``` -**connectors** +

connectors

+ Connectors is not a required option. If provided, the option `connectors` expects an Object that has connector classes as its named property. An instance of each connector will be constructed and attached to the context at the beginning of query execution, effectively making it a singleton that can keep state. This requires that if given, the `context` argument is an object. ```js @@ -112,7 +112,8 @@ const resolvers = { } ``` -**mocks** +

mocks

+ If provided, `mocks` will mock the results of the GraphQL query, overriding any resolve functions defined on the schema. `mocks` expects an object with one function per type that should be mocked. If no function is provided for a type, the default mock will be used, which means that you can call `apolloServer` with `mocks: {}` to get started quickly. Mocks for scalar types, such as Int and Boolean will be used everywhere, unless they are overridden by a more specific mock defined in a non-scalar type. Mocks for non-scalar types must be a function that returns an object with the desired properties. @@ -141,10 +142,29 @@ Mock functions are a special kind of resolve function, which means they have acc You can read more about mocking with graphql-tools in this [Medium Post on mocking with GraphQL](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd), which also includes more code snippets and a demo. -**printErrors** +

printErrors

+ If `printErrors` is set to `true`, the GraphQL server will print all errors that occurred inside resolve functions to the console. By default this option is false, and GraphQL errors will not be printed to the server console, but only returned in the errors field of the query response. -**allowUndefinedInResolve** +

allowUndefinedInResolve

+ If `allowUndefinedInResolve` is set to `false`, `apolloServer` will throw an Error every time a resolve function returns `undefined`. Usually returning `undefined` from a user-defined resolve function is due to a programming mistake, so this option can be helpful for debugging. If execution should not continue, resolve functions should return `null` and not `undefined`. + +

CORS support

+ +An issue was discovered re: CORS when using the apolloClient to connect to an apolloServer running on a different instance. +To account for this CORS support must be configured in the express app. [CORS](https://github.com/expressjs/cors) is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options. + +``` +import { apolloServer } from 'graphql-tools'; +import cors from 'cors'; + +var app = express().use('*', cors());; +``` + +Ensure you have npm installed cors. The * value allows access from any third-party site. It should probably be updated to reflect your specific environment. Simple usage details to [Enable All CORS Requests](https://github.com/expressjs/cors#simple-usage-enable-all-cors-requests) More complex configuration options are available including the ability to [Enable CORS for a Single Route](https://github.com/expressjs/cors#enable-cors-for-a-single-route). + +The information contained in the apolloClient re: CORS configuration did not effect on the server. + From de81f4c67248244cff9379d6e1b1883aef88bf50 Mon Sep 17 00:00:00 2001 From: Carl Wolsey Date: Thu, 19 May 2016 02:11:40 +0100 Subject: [PATCH 132/409] Update tools.md (#84) Add "Auth tokens" section. and correct syntax highlighting to "CORS" section as it appears to be missing. --- docs/source/apollo-server/tools.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 22f702b4c02..e3416721b9e 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -157,7 +157,7 @@ If execution should not continue, resolve functions should return `null` and not An issue was discovered re: CORS when using the apolloClient to connect to an apolloServer running on a different instance. To account for this CORS support must be configured in the express app. [CORS](https://github.com/expressjs/cors) is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options. -``` +```javascript import { apolloServer } from 'graphql-tools'; import cors from 'cors'; @@ -168,3 +168,19 @@ Ensure you have npm installed cors. The * value allows access from any third-par The information contained in the apolloClient re: CORS configuration did not effect on the server. +

Authentication Tokens

+ +Authentication tokens sent from the client can be retrieved, processed and then passed into context to be accessed by resolvers like so: +```javascript +app.use('/graphql', apolloServer(async (req) => { + // Retrieve token from authorization header and lookup user in DB + const user = await models.mongoose.users.fromToken(req.headers.authorization); + + return { + context: { + // Attach users data to context + user, + models, + ... +``` + From 9411ce0fb93c30502100a72d3f902905ea529429 Mon Sep 17 00:00:00 2001 From: Loren Sands-Ramshaw Date: Thu, 19 May 2016 00:40:08 -0400 Subject: [PATCH 133/409] Fix auth tokens header id (#85) --- docs/source/apollo-server/tools.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index e3416721b9e..5b599a7080c 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -168,9 +168,9 @@ Ensure you have npm installed cors. The * value allows access from any third-par The information contained in the apolloClient re: CORS configuration did not effect on the server. -

Authentication Tokens

+

Authentication Tokens

-Authentication tokens sent from the client can be retrieved, processed and then passed into context to be accessed by resolvers like so: +Authentication tokens sent from the client can be retrieved, processed, and then passed into context to be accessed by resolvers like so: ```javascript app.use('/graphql', apolloServer(async (req) => { // Retrieve token from authorization header and lookup user in DB @@ -178,7 +178,7 @@ app.use('/graphql', apolloServer(async (req) => { return { context: { - // Attach users data to context + // Attach user data to context user, models, ... From 2da1b82cbcb7a89c9a21f028d1c06dda2d058246 Mon Sep 17 00:00:00 2001 From: Kyle McLaren Date: Fri, 20 May 2016 17:15:12 +0200 Subject: [PATCH 134/409] quick typo fix (#87) MonogDB => MongoDB --- docs/source/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index c7d2f5c3b18..b7618e2d282 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -28,7 +28,7 @@ We have put together some basic example apps using various parts of Apollo; chec - [A simple counter example](https://github.com/abhiaiyer91/meteor-apollo-counter) - [Instagram Recent Search](https://github.com/abhiaiyer91/meteor-instagram-apollo) - [Shopping Cart](https://github.com/abhiaiyer91/meteor-pg-apollo-shopping-cart) -- [A Meteor Integration example that uses SQL, MonogDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) +- [A Meteor Integration example that uses SQL, MongoDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) ### General JS Examples - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) From ce2721270b4da1e302765a42d9786afc721d9c0a Mon Sep 17 00:00:00 2001 From: timbotnik Date: Wed, 25 May 2016 09:31:16 +1000 Subject: [PATCH 135/409] Update guide.md (#89) --- docs/source/apollo-server/guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 41875f0c70c..0dbb6232e9a 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -4,7 +4,7 @@ order: 202 description: A step-by-step guide for setting up a basic GraphQL server with Apollo. --- -This guide will explain all the parts required for a simple GraphQL Blog server. If you're looking for a tutorial, check out this Medium post or our [GraphQL server tutorial video on Youtube](https://www.youtube.com/watch?v=PHabPhgRUuU). +This guide will explain all the parts required for a simple GraphQL Blog server. If you're looking for a tutorial, check out [this Medium post](https://medium.com/apollo-stack/tutorial-building-a-graphql-server-cddaa023c035) or our [GraphQL server tutorial video on Youtube](https://www.youtube.com/watch?v=PHabPhgRUuU). We'll be using a package called [graphql-tools](https://www.npmjs.com/package/graphql-tools), which is actively being developed for [Apollo](http://www.apollostack.com). There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. @@ -164,7 +164,7 @@ You can tell `apolloServer` to mock a scalar type, such as Int or String in a sp You can also tell `apolloSever` to use special mocks for a specific type. In the `mocks.js` file above, we're telling the server to use `casual.first_name` to mock the `firstName` field of `Author`. If we didn't tell it to do that, it would use the default mock for the `String` type instead. To mock lists of different length, you can use `new MockList([min, max])`, which will return a list of length between min and max (both inclusive). -In the mock functions, you can also access the arguments passed to the field. In the file above, we're using that feature for the `author` field on `RootQuery`, to make sure that when the query asks for a user with a specific fist and/or last name, we either return a user with that first and/or last name, or we return null (to simulate an unsuccessful search in 20% of the cases). +In the mock functions, you can also access the arguments passed to the field. In the file above, we're using that feature for the `author` field on `RootQuery`, to make sure that when the query asks for a user with a specific first and/or last name, we either return a user with that first and/or last name, or we return null (to simulate an unsuccessful search in 20% of the cases). You can read more about mocking with graphql-tools in our [Medium Post on mocking with GraphQL](https://medium.com/apollo-stack/mocking-your-server-with-just-one-line-of-code-692feda6e9cd), which also includes more code snippets and a demo. From 5d225a84993549514a0995109b243ac77f7dc8a1 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Wed, 25 May 2016 00:17:04 -0700 Subject: [PATCH 136/409] Change path to /graphql --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 0dbb6232e9a..62f8787766a 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -26,7 +26,7 @@ Once the installation is finished, you can launch the server with this command: ```bash npm start ``` -If all goes well, the server should now print out a message that it is listening on port 8080. If you open [localhost:8080](http://localhost:8080/?query=%7B%0A%20%20testString%0A%7D) in your browser, you should now see the GraphiQL GUI for GraphQL, ready to query the server: +If all goes well, the server should now print out a message that it is listening on port 8080. If you open [localhost:8080/graphql](http://localhost:8080/graphql?query=%7B%0A%20%20testString%0A%7D) in your browser, you should now see the GraphiQL GUI for GraphQL, ready to query the server: ![Testing the server with GraphiQL](graphiql-test.png) From a8b74aaf44606b0191826ad2f3cf9770ffe5f07a Mon Sep 17 00:00:00 2001 From: Tim Mikeladze Date: Wed, 25 May 2016 12:33:48 -0700 Subject: [PATCH 137/409] Fixed broken link to generate schema page. (#90) --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 62f8787766a..c9a1f8a9508 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -106,7 +106,7 @@ schema { export default [typeDefinitions]; ``` -For more information about GraphQL's type system and schema language, you can take a look at @sogko's [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](schema-generation.html) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). +For more information about GraphQL's type system and schema language, you can take a look at @sogko's [cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png), read the [Schema definition subsection in the graphql-tools documentation chapter](generate-schema.html) or refer to the [official GraphQL website](http://graphql.org/docs/typesystem/). ## Mocking From 5d7cb75e9cee9dbabfa07f9736c07b193b6944bd Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 25 May 2016 15:14:15 -0700 Subject: [PATCH 138/409] Add some links for total beginners --- docs/source/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/index.md b/docs/source/index.md index b7618e2d282..356ffe90e66 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -19,6 +19,10 @@ To read more about Apollo in general, visit: - [Our website](http://www.apollostack.com/) - [Our Medium blog](https://medium.com/apollo-stack) +## New to GraphQL? + +Just getting started with GraphQL? Check out the [official documentation](http://graphql.org/), as well as [our blog post](https://medium.com/apollo-stack/the-basics-of-graphql-in-5-links-9e1dc4cac055) that can help you to get started quickly. + ## Example apps We have put together some basic example apps using various parts of Apollo; check them out to see how everything fits together. We're always looking for improvements and feedback on these apps, and they'll get better as Apollo becomes more production-ready! From be72ecdef54600b36b899002ed63d6856e0dc912 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Thu, 26 May 2016 16:25:39 +0200 Subject: [PATCH 139/409] Update Angular2 to RC1 and gql (#92) --- docs/source/apollo-client/angular2.md | 30 +++++++++++++++++---------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index 2dcd264e062..b2a9fffe646 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -19,7 +19,7 @@ If you want to define the default *ApolloClient* to be used by `Angular2Apollo` ```ts import { bootstrap -} from 'angular2/platform/browser'; +} from '@angular/platform-browser-dynamic'; import { defaultApolloClient, @@ -56,7 +56,7 @@ Since you previously used `APOLLO_PROVIDERS` to bootstrap you app, it is possibl import { Component, Injectable -} from 'angular2/core'; +} from '@angular/core'; import { Angular2Apollo @@ -83,7 +83,7 @@ Here's how you could run a query: import { Component, Injectable -} from 'angular2/core'; +} from '@angular/core'; import { Angular2Apollo @@ -93,6 +93,8 @@ import { Observable } from 'rxjs/Observable'; +import gql from 'apollo-client/gql'; + @Component({ selector: 'postsList', templateUrl: 'client/postsList.html' @@ -103,7 +105,7 @@ class postsList { constructor(private angularApollo : Angular2Apollo) { this.posts = angularApollo.watchQuery({ - query: ` + query: gql` query getPosts($tag: String) { posts(tag: $tag) { title @@ -128,12 +130,14 @@ Here's how you would call a mutation and pass in arguments via variables: import { Component, Injectable -} from 'angular2/core'; +} from '@angular/core'; import { Angular2Apollo } from 'angular2-apollo'; +import gql from 'apollo-client/gql'; + import { graphQLResult } from 'graphql'; @@ -155,7 +159,7 @@ class postsList { raw }) { angularApollo.mutate({ - mutation: ` + mutation: gql` mutation postReply( $token: String! $topic_id: ID! @@ -216,7 +220,7 @@ Here's how you could run a query: ```ts import { Component, Injectable -} from 'angular2/core'; +} from '@angular/core'; import { Apollo @@ -226,6 +230,8 @@ import ApolloClient, { createNetworkInterface } from 'apollo-client'; +import gql from 'apollo-client/gql'; + import { Observable } from 'rxjs/Observable'; @@ -244,7 +250,7 @@ const client = new ApolloClient({ queries(context) { return { posts: { - query: ` + query: gql` query getPosts($tag: String) { posts(tag: $tag) { title @@ -277,7 +283,7 @@ Here's how you could run a mutation: import { Component, Injectable -} from 'angular2/core'; +} from '@angular/core'; import { Apollo @@ -291,6 +297,8 @@ import ApolloClient, { createNetworkInterface } from 'apollo-client'; +import gql from 'apollo-client/gql'; + const client = new ApolloClient({ networkInterface: createNetworkInterface('http://localhost:8080') }); @@ -310,7 +318,7 @@ const client = new ApolloClient({ categoryId, raw }) => ({ - mutation: ` + mutation: gql` mutation postReply( $token: String! $topic_id: ID! @@ -375,7 +383,7 @@ To handle that more easily we've created the `ApolloQueryPipe`. Here is how it w template: ```html
    -
  • +
  • {{ post.title }}
From 34250f99b8b8d757970d76c8f5d7bcc1b77484d4 Mon Sep 17 00:00:00 2001 From: Rainer Dreyer Date: Thu, 26 May 2016 14:31:11 -0500 Subject: [PATCH 140/409] apolloServer mocks no longer overwrite resolvers (#93) Documentation update for [Allows resolvers to be used with mocks](https://github.com/apollostack/apollo-server/pull/9) --- docs/source/apollo-server/tools.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 5b599a7080c..099908cb131 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -114,7 +114,7 @@ const resolvers = {

mocks

-If provided, `mocks` will mock the results of the GraphQL query, overriding any resolve functions defined on the schema. `mocks` expects an object with one function per type that should be mocked. If no function is provided for a type, the default mock will be used, which means that you can call `apolloServer` with `mocks: {}` to get started quickly. +If provided, `mocks` will mock the results of the GraphQL query for any resolve functions not defined on the schema. `mocks` expects an object with one function per type that should be mocked. If no function is provided for a type, the default mock will be used, which means that you can call `apolloServer` with `mocks: {}` to get started quickly. Mocks for scalar types, such as Int and Boolean will be used everywhere, unless they are overridden by a more specific mock defined in a non-scalar type. Mocks for non-scalar types must be a function that returns an object with the desired properties. From f16b77cceb367ed5c20b0a740d37b60415d3738a Mon Sep 17 00:00:00 2001 From: Dan Ahmadi Date: Fri, 27 May 2016 16:07:41 -0700 Subject: [PATCH 141/409] Added GitHunt to example apps (#94) --- docs/source/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/index.md b/docs/source/index.md index 356ffe90e66..b783adea6f7 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -35,6 +35,7 @@ We have put together some basic example apps using various parts of Apollo; chec - [A Meteor Integration example that uses SQL, MongoDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) ### General JS Examples +- [A full-stack Apollo Client and Server example app that uses React, Webpack, Babel, and Redux](https://github.com/apollostack/GitHunt) - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - [A simple GraphQL blog that uses Feathersjs for managing database services](https://github.com/swarthout/feathers-apollo) From 35e514865fe741ef355b15e5f0d728ada17d1b98 Mon Sep 17 00:00:00 2001 From: David Burles Date: Wed, 1 Jun 2016 02:23:28 +1000 Subject: [PATCH 142/409] correct mapStateToProps arguments (#96) --- docs/source/apollo-client/react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index d05fe2ec754..89c70ca1546 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -215,7 +215,7 @@ Redux's connect will pass `dispatch` as a prop unless action creators are passed ```js // ... same as above -function mapStateToProps({ state, ownProps }) { +function mapStateToProps(state, ownProps) { return { selectedCategory: state.selectedCategory, } From 54e215fe2c6bb92f4badfe3ead2543edd9e66cbc Mon Sep 17 00:00:00 2001 From: Dan Ahmadi Date: Tue, 31 May 2016 12:16:41 -0700 Subject: [PATCH 143/409] Reordered General Examples and Meteor Examples (#99) --- docs/source/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/source/index.md b/docs/source/index.md index b783adea6f7..313a2afff53 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -27,15 +27,15 @@ Just getting started with GraphQL? Check out the [official documentation](http:/ We have put together some basic example apps using various parts of Apollo; check them out to see how everything fits together. We're always looking for improvements and feedback on these apps, and they'll get better as Apollo becomes more production-ready! +### General JS Examples +- [A full-stack Apollo Client and Server example app that uses React, Webpack, Babel, and Redux](https://github.com/apollostack/GitHunt) +- [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) +- [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) +- [A simple GraphQL blog that uses Feathersjs for managing database services](https://github.com/swarthout/feathers-apollo) + ### Meteor Examples - [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) - [A simple counter example](https://github.com/abhiaiyer91/meteor-apollo-counter) - [Instagram Recent Search](https://github.com/abhiaiyer91/meteor-instagram-apollo) - [Shopping Cart](https://github.com/abhiaiyer91/meteor-pg-apollo-shopping-cart) - [A Meteor Integration example that uses SQL, MongoDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) - -### General JS Examples -- [A full-stack Apollo Client and Server example app that uses React, Webpack, Babel, and Redux](https://github.com/apollostack/GitHunt) -- [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) -- [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) -- [A simple GraphQL blog that uses Feathersjs for managing database services](https://github.com/swarthout/feathers-apollo) From 5e356860262e16fbf768e3dea940fa24fa1402be Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 31 May 2016 13:44:58 -0700 Subject: [PATCH 144/409] Clarify that polling is already available --- docs/source/apollo-client/core.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index 25ea608fce6..dd4a8f3d09f 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -60,7 +60,7 @@ If you want to fetch some data to perform a one-time operation, then `query` is This means that using `watchQuery` will keep your UI consistent, so that every query being displayed on the screen shows the exact same data for the same objects. -In the future, `watchQuery` will also have some extra options for reactivity, allowing you to set a polling interval, connect to a source of invalidations for reactive re-fetching, or accept pushed data from the server for low-latency updates. Using it now will allow you to easily switch those options on when they become available. +Currently `watchQuery` allows reactivity via the optional `pollingInterval` argument. In the future, `watchQuery` will also have more options for reactivity, like connecting to a source of invalidations for reactive re-fetching, or accepting pushed data from the server for low-latency updates. Using it now will allow you to easily switch those options on when they become available.

query diffing and forceFetch

From 1f139e1bf9f4b74e26196ecf86af5c01da4b569b Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 31 May 2016 15:19:07 -0700 Subject: [PATCH 145/409] Fix tiny typo --- docs/source/apollo-client/devtools.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md index 1a135cf1542..acc7f0fbd83 100644 --- a/docs/source/apollo-client/devtools.md +++ b/docs/source/apollo-client/devtools.md @@ -28,7 +28,7 @@ Redux Store's can be created with initial states. At the top of your DevTools yo * `mutations` * `data` -Along with these keys, any non-apollo reducer will have the same behavior as they don in vanilla Redux today. +Along with these keys, any non-apollo reducer will have the same behavior as they do in vanilla Redux today. As you interact with your application, the GraphQL server will resolve queries and mutations from the client. We utilize Redux to manage the state change our application goes through as we issue queries and mutations from the client. From 2fbb98fcfcf168c855caaea8c67551550359fdaf Mon Sep 17 00:00:00 2001 From: Kevin Lacker Date: Wed, 1 Jun 2016 15:23:58 -0700 Subject: [PATCH 146/409] Fix typo (#103) sever -> server --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index c9a1f8a9508..75de372a31d 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -162,7 +162,7 @@ Go ahead and give the server a try with the new mocks. If all went well, you sho You can tell `apolloServer` to mock a scalar type, such as Int or String in a specific way. In this case, we told it to return an integer between 1 and 1000 every time an Int field is requested by the client. -You can also tell `apolloSever` to use special mocks for a specific type. In the `mocks.js` file above, we're telling the server to use `casual.first_name` to mock the `firstName` field of `Author`. If we didn't tell it to do that, it would use the default mock for the `String` type instead. To mock lists of different length, you can use `new MockList([min, max])`, which will return a list of length between min and max (both inclusive). +You can also tell `apolloServer` to use special mocks for a specific type. In the `mocks.js` file above, we're telling the server to use `casual.first_name` to mock the `firstName` field of `Author`. If we didn't tell it to do that, it would use the default mock for the `String` type instead. To mock lists of different length, you can use `new MockList([min, max])`, which will return a list of length between min and max (both inclusive). In the mock functions, you can also access the arguments passed to the field. In the file above, we're using that feature for the `author` field on `RootQuery`, to make sure that when the query asks for a user with a specific first and/or last name, we either return a user with that first and/or last name, or we return null (to simulate an unsuccessful search in 20% of the cases). From 006d8656addfb82d3fb78dd7c4269c4c6178872c Mon Sep 17 00:00:00 2001 From: Tim Brandin Date: Thu, 2 Jun 2016 09:09:22 +0200 Subject: [PATCH 147/409] Run /graphql on Meteor's default port. (#104) --- docs/source/apollo-client/meteor.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/docs/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md index 67e38b76c34..a8cdf270a28 100644 --- a/docs/source/apollo-client/meteor.md +++ b/docs/source/apollo-client/meteor.md @@ -53,13 +53,11 @@ The Apollo server, and the Express GraphQL package that it is based on, rely on ```js import { apolloServer } from 'graphql-tools'; import express from 'express'; -import proxyMiddleware from 'http-proxy-middleware'; +import { Meteor } from 'meteor/meteor'; import { WebApp } from 'meteor/webapp'; import { schema, resolvers } from '/imports/api/schema'; -const GRAPHQL_PORT = 4000; - const graphQLServer = express(); graphQLServer.use('/graphql', apolloServer({ @@ -69,12 +67,8 @@ graphQLServer.use('/graphql', apolloServer({ resolvers, })); -graphQLServer.listen(GRAPHQL_PORT, () => console.log( - `GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}` -)); - // This redirects all requests to /graphql to our Express GraphQL server -WebApp.rawConnectHandlers.use(proxyMiddleware(`http://localhost:${GRAPHQL_PORT}/graphql`)); +WebApp.rawConnectHandlers.use(Meteor.bindEnvironment(graphQLServer)); ``` ### Getting the current user From 11d4d4e8c8dd4173f960db8cccc9ab7d79d7dd7a Mon Sep 17 00:00:00 2001 From: Tim Brandin Date: Thu, 2 Jun 2016 10:35:18 +0200 Subject: [PATCH 148/409] Tiny adjustment, we don't need to use rawConnectHandlers (#105) --- docs/source/apollo-client/meteor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md index a8cdf270a28..d5c160304dc 100644 --- a/docs/source/apollo-client/meteor.md +++ b/docs/source/apollo-client/meteor.md @@ -68,7 +68,7 @@ graphQLServer.use('/graphql', apolloServer({ })); // This redirects all requests to /graphql to our Express GraphQL server -WebApp.rawConnectHandlers.use(Meteor.bindEnvironment(graphQLServer)); +WebApp.connectHandlers.use(Meteor.bindEnvironment(graphQLServer)); ``` ### Getting the current user From e5493a5cb424a5fb4ee4ccb51dd305b6e8ea004d Mon Sep 17 00:00:00 2001 From: Charles Baker Date: Thu, 2 Jun 2016 17:20:03 -0400 Subject: [PATCH 149/409] Include middleware in apollo-client docs (#95) * Include middleware in apollo-client docs I wrote examples of writing basic middleware for use with createNetworkInterface. I don't go into detail regarding how it would be used to manipulate headers and such, but that could also be added if needed. * Add HTTP headers to example code Changed the example code to show how you'd modify a request using middleware, instead of just showing a `console.log()`. An example is shown that takes a token from localStorage and passes it in a header. --- docs/source/apollo-client/index.md | 74 ++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 31c7b3b9f55..e8b9fe59db5 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -67,6 +67,80 @@ const client = new ApolloClient({ }); ``` +

Middleware

+ +It is possible to use middleware with the network interface created via `createNetworkInterface`. In order to do so, you must pass an object into the interface created with `createNetworkInterface()`. This object must contain an `applyMiddleware` method with the following parameters: + +- `req: object` The HTTP request being processed by the middleware. +- `next: function` This function pushes the HTTP request onward through the middleware. + +This example shows how you'd create a middleware. It can be done either by providing the requried object directly to `.use()` or by creating a function/object and passing it (or an array) to `.use()`. + +In both examples, we'll show how you would add an authentication token to the HTTP header of the requests being sent by the client. + +```js +import ApolloClient, { createNetworkInterface } from 'apollo-client'; + +const networkInterface = createNetworkInterface('/graphql'); + +networkInterface.use({ + applyMiddleWare(req, next) => { + if (!req.options.header) { + req.options.header = {}; // Create the header object if needed. + } + req.options.header.authorization = localStorage.getItem('token') ? localStorage.getItem('token') : null; + next(); + } +}); + +const client = new ApolloClient({ + networkInterface, +}); +``` + +The above example shows use of a single middleware passed directly to .use(). It checks to see if we have a token (JWT, for example) and pass that token in the HTTP header of the request, so we can authenticate interactions with GraphQL performed through our network interface. + +The following example shows use of multiple middlewares passed as an array: + +```js +import ApolloClient, { createNetworkInterface } from 'apollo-client'; + +const networkInterface = createNetworkInterface('/graphql'); +const token = 'first-token-value'; +const token2 = 'second-token-value'; + +function exampleWare1 () { + applyMiddleware(req, next) => { + if (!req.options.header) { + req.options.header = {}; // Create the header object if needed. + } + req.options.header.authorization = token; + next(); + } +} + +function exampleWare2 () { + applyMiddleware(req, next) => { + if (!req.options.header) { + req.options.header = {}; // Create the header object if needed. + } + req.options.header.authorization = token2; + next(); + } +} + +const exWare1 = new exampleWare1(); +const exWare2 = new exampleWare2(); + +networkInterface.use([exWare1, exWare2]); + +const client = new ApolloClient({ + networkInterface, +}); +``` + +Given the above code, the header's `Authorization` value will be that of `token2`. This example shows how you can use more than one middleware to make multiple/separate modifications to the request being processed in the form of a chain. This example doesn't show the use of `localStorage`, but is instead just meant to demonstrate the use of more than one middleware, passed to `.use()` as an array. +

CORS support

If your GraphQL server and client application are running on different origins, you will get HTTP 405 errors thrown by the client. This happens when recieving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. Howto can be found in the [apollo-server/tools.md](/source/apollo-server/tools.md). This was encountered using the meteor-stater-kit and was confirmed from others running the apollo-server with express in node. From cfc5a0211657c7f42e74a058b63cb56b5e583511 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 3 Jun 2016 00:55:37 -0700 Subject: [PATCH 150/409] Change graphql-tools to apollo-server --- docs/source/apollo-server/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md index 3cf3843ba30..67e0b53ffc9 100644 --- a/docs/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -4,11 +4,11 @@ order: 201 description: How to install the Apollo GraphQL server tools. --- -Apollo GraphQL Tools is a collection of functions and an opinionated guide for how to build a GraphQL server in JavaScript. +Apollo Server is an npm package and an opinionated guide for how to build a GraphQL server in JavaScript. ```txt -npm install graphql-tools +npm install apollo-server ``` -The Apollo GraphQL tools are not just useful for building servers, they can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. +Apollo Server bundles a set of functions from the `graphql-tools` package, which are not just useful for building servers, but can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. From 814c538c3e1f5e7cf977760d92c9c994fe184d0a Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 3 Jun 2016 00:58:56 -0700 Subject: [PATCH 151/409] Change graphql-tools to apollo-server in tutorial --- docs/source/apollo-server/guide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 75de372a31d..5e4cfdcd931 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -6,7 +6,7 @@ description: A step-by-step guide for setting up a basic GraphQL server with Apo This guide will explain all the parts required for a simple GraphQL Blog server. If you're looking for a tutorial, check out [this Medium post](https://medium.com/apollo-stack/tutorial-building-a-graphql-server-cddaa023c035) or our [GraphQL server tutorial video on Youtube](https://www.youtube.com/watch?v=PHabPhgRUuU). -We'll be using a package called [graphql-tools](https://www.npmjs.com/package/graphql-tools), which is actively being developed for [Apollo](http://www.apollostack.com). There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. +We'll be using a package called [apollo-server](https://www.npmjs.com/package/apollo-server), which is actively being developed for [Apollo](http://www.apollostack.com). There are of course many ways to build a GraphQL server for Node.js, but this is the way we recommend. It describes each step in detail, from defining a schema to writing your own resolve functions and loaders. ## Setup @@ -32,7 +32,7 @@ If all goes well, the server should now print out a message that it is listening **For advanced users:** -If you already have an express server or a GraphQL server set up, then you can also simply install graphql-tools with the command `npm install graphql-tools` and read the articles listed in the sidebar to learn about using the individual parts of the graphql-tools package. +If you already have an express server or a GraphQL server set up, then you can also simply install graphql-tools with the command `npm install graphql-tools` and read the articles listed in the sidebar to learn about using the individual parts of the graphql-tools package in your project. Alternatively, you can switch out express-graphql for Apollo Server, with only minimal changes to your code. ## Schema @@ -234,7 +234,7 @@ In order for the server to use the resolve functions instead of the mocked schem ```js import express from 'express'; -import { apolloServer } from 'graphql-tools'; +import { apolloServer } from 'apollo-server'; import Schema from './data/schema'; import Mocks from './data/mocks'; import Resolvers from './data/resolvers'; From bb3103fd184d0f43180ba7ea578b945544ab1690 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 3 Jun 2016 01:01:35 -0700 Subject: [PATCH 152/409] Change graphql-tools to apollo-server in tools.md --- docs/source/apollo-server/tools.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index 099908cb131..bfc16f6159d 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -4,14 +4,14 @@ order: 203 description: Put together all of the Apollo GraphQL tools to create an HTTP server. --- -While `apolloServer` can be used as an express middleware, graphql-tools exports all the functions that `apolloServer` uses internally, so they can be used separately with any GraphQL-JS schema. This section documents all the functions that graphql-tools exports, and explains how they can be used. +The function `apolloServer` can be used as an express middleware, and is probably the most convenient way to get started. For more advanced users, the graphql-tools package exports all the functions that `apolloServer` uses internally, so they can be used separately with any GraphQL-JS schema. This section documents apollo-server, as well as all the functions that graphql-tools exports, and explains how they can be used.

apolloServer(options)

`apolloServer` is a convenient function that generates an express middleware (it uses [`express-graphql`](https://github.com/graphql/express-graphql) under the hood). It combines all of the tools in `graphql-tools` and has a simple-to-use interface: ```js -import { apolloServer } from 'graphql-tools'; +import { apolloServer } from 'apollo-server'; var app = express(); @@ -158,7 +158,7 @@ An issue was discovered re: CORS when using the apolloClient to connect to an ap To account for this CORS support must be configured in the express app. [CORS](https://github.com/expressjs/cors) is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options. ```javascript -import { apolloServer } from 'graphql-tools'; +import { apolloServer } from 'apollo-server'; import cors from 'cors'; var app = express().use('*', cors());; From 9ae556ac1140cb91a96c892970cf5f3e314e6856 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 7 Jun 2016 21:03:43 -0700 Subject: [PATCH 153/409] Fix link to CORS and improve wording --- docs/source/apollo-client/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index e8b9fe59db5..77aec10ea9d 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -143,7 +143,7 @@ Given the above code, the header's `Authorization` value will be that of `token2

CORS support

-If your GraphQL server and client application are running on different origins, you will get HTTP 405 errors thrown by the client. This happens when recieving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. Howto can be found in the [apollo-server/tools.md](/source/apollo-server/tools.md). This was encountered using the meteor-stater-kit and was confirmed from others running the apollo-server with express in node. +If your GraphQL server and client application are running on different origins, you will get HTTP 405 errors thrown by the client. This happens when recieving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. How to do this is documented in the [apollo-server section](/apollo-server/tools.html#corsSupport).

Loading Intial Data from Server

From add1d09df3df917461ab3ac56cacf88ec2564540 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 7 Jun 2016 21:09:04 -0700 Subject: [PATCH 154/409] Clarify that CORS is not a bug, it's a feature. --- docs/source/apollo-server/tools.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md index bfc16f6159d..1d47b6c448f 100644 --- a/docs/source/apollo-server/tools.md +++ b/docs/source/apollo-server/tools.md @@ -154,8 +154,7 @@ If execution should not continue, resolve functions should return `null` and not

CORS support

-An issue was discovered re: CORS when using the apolloClient to connect to an apolloServer running on a different instance. -To account for this CORS support must be configured in the express app. [CORS](https://github.com/expressjs/cors) is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options. +If apollo server runs under a different origin than the frontend app, then CORS support must be configured on the server. For example, if apollo server is running under `graphql.example.com` and the website is served from `www.example.com`, CORS needs to be configured in the express app. [CORS](https://github.com/expressjs/cors) is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options. ```javascript import { apolloServer } from 'apollo-server'; From c5810e0c8cd3e92fd93f9ee2066134a487c2d716 Mon Sep 17 00:00:00 2001 From: Eric Date: Fri, 10 Jun 2016 14:22:45 +0200 Subject: [PATCH 155/409] fixed middleware examples and description (#107) --- docs/source/apollo-client/index.md | 45 ++++++++++++++---------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 77aec10ea9d..501b1a98d66 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -69,12 +69,12 @@ const client = new ApolloClient({

Middleware

-It is possible to use middleware with the network interface created via `createNetworkInterface`. In order to do so, you must pass an object into the interface created with `createNetworkInterface()`. This object must contain an `applyMiddleware` method with the following parameters: +It is possible to use middleware with the network interface created via `createNetworkInterface`. In order to do so, you must pass an array of objects into the interface created with `createNetworkInterface()`. Each object must contain an `applyMiddleware` method with the following parameters: - `req: object` The HTTP request being processed by the middleware. - `next: function` This function pushes the HTTP request onward through the middleware. -This example shows how you'd create a middleware. It can be done either by providing the requried object directly to `.use()` or by creating a function/object and passing it (or an array) to `.use()`. +This example shows how you'd create a middleware. It can be done either by providing the required object directly to `.use()` or by creating an object and passing it to `.use()`. In both cases all middleware objects have to be wrapped inside an array. In both examples, we'll show how you would add an authentication token to the HTTP header of the requests being sent by the client. @@ -83,24 +83,24 @@ import ApolloClient, { createNetworkInterface } from 'apollo-client'; const networkInterface = createNetworkInterface('/graphql'); -networkInterface.use({ - applyMiddleWare(req, next) => { - if (!req.options.header) { - req.options.header = {}; // Create the header object if needed. +networkInterface.use([{ + applyMiddleWare(req, next) { + if (!req.options.headers) { + req.options.headers = {}; // Create the header object if needed. } - req.options.header.authorization = localStorage.getItem('token') ? localStorage.getItem('token') : null; + req.options.headers.authorization = localStorage.getItem('token') ? localStorage.getItem('token') : null; next(); } -}); +}]); const client = new ApolloClient({ networkInterface, }); ``` -The above example shows use of a single middleware passed directly to .use(). It checks to see if we have a token (JWT, for example) and pass that token in the HTTP header of the request, so we can authenticate interactions with GraphQL performed through our network interface. +The above example shows the use of a single middleware passed directly to .use(). It checks to see if we have a token (JWT, for example) and passes that token into the HTTP header of the request, so we can authenticate interactions with GraphQL performed through our network interface. -The following example shows use of multiple middlewares passed as an array: +The following example shows the use of multiple middlewares passed as an array: ```js import ApolloClient, { createNetworkInterface } from 'apollo-client'; @@ -109,30 +109,27 @@ const networkInterface = createNetworkInterface('/graphql'); const token = 'first-token-value'; const token2 = 'second-token-value'; -function exampleWare1 () { - applyMiddleware(req, next) => { - if (!req.options.header) { - req.options.header = {}; // Create the header object if needed. +const exampleWare1 = { + applyMiddleware(req, next) { + if (!req.options.headers) { + req.options.headers = {}; // Create the headers object if needed. } - req.options.header.authorization = token; + req.options.headers.authorization = token; next(); } } -function exampleWare2 () { - applyMiddleware(req, next) => { - if (!req.options.header) { - req.options.header = {}; // Create the header object if needed. +const exampleWare2 = { + applyMiddleware(req, next) { + if (!req.options.headers) { + req.options.headers = {}; // Create the headers object if needed. } - req.options.header.authorization = token2; + req.options.headers.authorization = token2; next(); } } -const exWare1 = new exampleWare1(); -const exWare2 = new exampleWare2(); - -networkInterface.use([exWare1, exWare2]); +networkInterface.use([exampleWare1, exampleWare2]); const client = new ApolloClient({ networkInterface, From cdfea94a9cd580bbd7dec835725c5d9eaa38f40e Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Wed, 15 Jun 2016 23:12:39 +0200 Subject: [PATCH 156/409] Update Angular2 to use new API apollostack/angular2-apollo#19 and apollostack/angular2-apollo#27 --- docs/source/apollo-client/angular2.md | 72 +++++++++++++++++++-------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index b2a9fffe646..cf296e52352 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -120,7 +120,7 @@ class postsList { } ``` -

Mutations

+

Mutations

To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](core.html#mutate). In this case as the result you will receive a promise that resolves to a GraphQLResult. @@ -212,6 +212,22 @@ It allows you to define queries and mutations and to make them reactive. You can Each key on the object returned by `queries` function should be made up of the same possible arguments as [`ApolloClient#watchQuery`](core.html#watchQuery). +The result of each query contains the same API as [`QuerySubscription`](core.html#QuerySubscription) and has the following form: + +```js +{ + queryName: any + ... + loading: boolean + errors: Error[] + ... + refetch(variables: Object) + unsubscribe() + stopPolling() + startPolling(pollInterval: number) +} +``` + Since `queries` function receives one argument which is a component's context you can use it to define variables. It is also reactive so your variables will be always up to date. @@ -232,10 +248,6 @@ import ApolloClient, { import gql from 'apollo-client/gql'; -import { - Observable -} from 'rxjs/Observable'; - const client = new ApolloClient({ networkInterface: createNetworkInterface('http://localhost:8080') }); @@ -249,7 +261,7 @@ const client = new ApolloClient({ client, queries(context) { return { - posts: { + data: { query: gql` query getPosts($tag: String) { posts(tag: $tag) { @@ -259,14 +271,17 @@ const client = new ApolloClient({ `, variables: { tag: context.tag - } + }, + forceFetch: false, + returnPartialData: true, + pollInterval: 10000 } }; } }) class postsList { public tag: string = '1234'; - public posts: Observable; + public data: any; } ``` @@ -290,7 +305,7 @@ import { } from 'angular2-apollo'; import { - graphQLResult + GraphQLResult } from 'graphql'; import ApolloClient, { @@ -349,14 +364,10 @@ const client = new ApolloClient({ class postsList { public token: string = 'random'; - constructor() { - - } - reply(reply) { this.postReply(reply) - .then((graphQLResult) => { - const { errors, data } = graphQLResult; + .then((result: GraphQLResult) => { + const { errors, data } = result; if (data) { console.log('got data', data); @@ -374,16 +385,37 @@ class postsList {

ApolloQueryPipe

-Apollo client exposes queries as observables, but each Apollo query can include few queries. +Each Apollo query can include few queries. + +[`Angular2Apollo#watchQuery`](angular2.html#angular2apollo-mutations) returns an Apollo observable. +In combination with AsyncPipe the data comes in the following form: + +```ts +{ + data: { + firstQuery: any + secondQuery: any + } +} +``` + +Using `@Apollo` decorator, queries come directly as properties of result object. It looks like this: + +```ts +{ + firstQuery: any + secondQuery: any +} +``` -So inside an Apollo observable the data comes in the following form: `obs.data.queryName` +To handle that more easily we've created the `ApolloQueryPipe`. +It automatically knows where to look for the query. You don't have to worry about it. -To handle that more easily we've created the `ApolloQueryPipe`. Here is how it works: +Here is how it works: -template: ```html
    -
  • +
  • {{ post.title }}
From df45fb28dbab7c270a3fa463d7ba390e365d4b4d Mon Sep 17 00:00:00 2001 From: jlevycpa Date: Fri, 17 Jun 2016 10:44:06 -0400 Subject: [PATCH 157/409] Fixed type on ApplyMiddleware method name (#109) --- docs/source/apollo-client/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 501b1a98d66..88a81b46dd9 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -84,7 +84,7 @@ import ApolloClient, { createNetworkInterface } from 'apollo-client'; const networkInterface = createNetworkInterface('/graphql'); networkInterface.use([{ - applyMiddleWare(req, next) { + applyMiddleware(req, next) { if (!req.options.headers) { req.options.headers = {}; // Create the header object if needed. } From d440d71cf2690495273491b0b2d7515730e90c9d Mon Sep 17 00:00:00 2001 From: Hugh Willson Date: Sat, 18 Jun 2016 18:34:32 -0400 Subject: [PATCH 158/409] Fixed a super small typo. (#111) --- docs/source/apollo-server/guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 5e4cfdcd931..5d12cfe569c 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -13,7 +13,7 @@ We'll be using a package called [apollo-server](https://www.npmjs.com/package/ap For the remainder of this guide, we'll assume that you are familiar with using the command line of your operating system and already have Node.js and npm set up for your environment. If that's not the case, you should [do that first](https://nodejs.org/en/download/package-manager/) before you read the rest of this guide. -To get started, you need to install a few packages and set up some boilerplate. To make this easier, we've created a barebones started kit which you can use: +To get started, you need to install a few packages and set up some boilerplate. To make this easier, we've created a barebones starter kit which you can use: ```bash git clone --branch server-only https://github.com/apollostack/apollo-starter-kit cd apollo-starter-kit From 3e6d0141e0c0cd02b0cfc58f4e55c46a4d6a7942 Mon Sep 17 00:00:00 2001 From: Ryan James Date: Mon, 20 Jun 2016 00:55:26 -0700 Subject: [PATCH 159/409] tiny typo fix (#100) --- docs/source/apollo-client/react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 89c70ca1546..fc3906ef3e6 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -207,7 +207,7 @@ Example use cases: `Infinite scroll`, `Data filtering`

Additional Props

-Redux's connect will pass `dispatch` as a prop unless action creators are passed using `mapDisptachToProps`. Likewise, the Apollo connect exposes part of the apollo-client api to props under the keys `query` and `mutate`. These correspond to the Apollo methods and can be used for custom needs outside of the ability of the wrapper component. +Redux's connect will pass `dispatch` as a prop unless action creators are passed using `mapDispatchToProps`. Likewise, the Apollo connect exposes part of the apollo-client api to props under the keys `query` and `mutate`. These correspond to the Apollo methods and can be used for custom needs outside of the ability of the wrapper component.

Using in concert with Redux

From 422f813a410cd96929f09ba0b2751c631686e22a Mon Sep 17 00:00:00 2001 From: Zoltan Olah Date: Tue, 21 Jun 2016 14:19:58 +1000 Subject: [PATCH 160/409] Adds f8 app to examples --- docs/source/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/index.md b/docs/source/index.md index 313a2afff53..b70afe7752a 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -32,6 +32,7 @@ We have put together some basic example apps using various parts of Apollo; chec - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - [A simple GraphQL blog that uses Feathersjs for managing database services](https://github.com/swarthout/feathers-apollo) +- [A fork of Facebook's F8 React Native app that uses Apollo](https://github.com/nnance/f8app-apollo) ### Meteor Examples - [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) From f3aa50814b3c570898f667a91d1701f2024f3c4d Mon Sep 17 00:00:00 2001 From: Tomas Trescak Date: Wed, 22 Jun 2016 22:17:28 +0200 Subject: [PATCH 161/409] How to use scalars (#113) * Added scalars * Added the JSON example, removed typescript, added references. --- docs/source/apollo-server/scalars.md | 149 +++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 docs/source/apollo-server/scalars.md diff --git a/docs/source/apollo-server/scalars.md b/docs/source/apollo-server/scalars.md new file mode 100644 index 00000000000..0e3050879ec --- /dev/null +++ b/docs/source/apollo-server/scalars.md @@ -0,0 +1,149 @@ +--- +title: Custom Scalars +order: 209 +description: Add custom scalars to a GraphQL schema. +--- + +## Custom scalars + +The GraphQL language comes with following pre-defined scalar types `String`, +`Int`, `Float` and `Boolean`. While this covers most of the user cases, often +you need to support custom atomic data types (e.g. Date) or you need to add validations +to existing types. As a result, GraphQL allows you to define custom `scalars` +that undertake this role. + +To define a custom scalar you simply add it to the schema with the following notation: + +```js +scalar MyCustomScalar +``` + +Consequently, you need to define the behaviour of the scalar, the way it will be serialised +when the value is sent to the client, or how the value is resolved when coming from the client. +For this purpose, each scalar needs to define three methods: `serialize`, `parseValue` and `parseLiteral`. +In Apollo, these functions are defined with the `__` prefix: `__serialize`, `__parseValue` and `__parseLiteral`. +Let's look at couple examples to demonstrate the potential of custom scalars. + +### Date scalar + +The goal is to define a Date data type for storing the Date values in the database. +We will consider using the MongoDB that uses the native javascript `Date` data type. The `Date` data type +can be easily serialised as a number using the `getTime()` function. Therefore, we will assume that +user sends and receives a number to and from the grapqhl server. This number will be resolved to Date on the server +storing the date value. On client, user can simply create a new date from the received numeric value. Following is the +implementation of the Date data type. First, the schema: + +```js +scalar Date + +type MyType { + created: Date +} +``` + +And here is the resolver: + +```js +Date: { + __parseValue (value) { + return new Date(value); // value from the client + }, + __serialize(value) { + return value.getTime(); // value sent to the client + }, + __parseLiteral (ast) { + if (ast.kind === Kind.INT) { + return (parseInt(ast.value, 10)); // ast value is always in string format + } + return null; + }, +} +``` + +### Validations + +In this example, we follow the [official GraphQL documentation](http://graphql.org/docs/api-reference-type-system/) for the scalar datatype. +Consider that you wan to store only odd values in your database field. First, the schema: + +```js +scalar Odd + +type MyType { + oddValue: Odd +} +``` + +And now the resolver: + +```js +import { Kind } from 'graphql/type' + +Odd: { + __serialize: oddValue, + __parseValue: oddValue, + __parseLiteral (ast) { + if (ast.kind === Kind.INT) { + return oddValue(parseInt(ast.value, 10)); + } + return null; + } +} + +function oddValue(value) { + return value % 2 === 1 ? value : null; +} +``` + +### JSON data type + +Often we desire to use objects and store them in JSON format. In most databases, +such fields are stored in a string format. +We can use a scalar type to correctly recreate the object format of JSON and parse +all its field into a correct data type. Following is an example of JSON scalar: + + +```js +scalar JSON + +type MyType { + jsonField: JSON +} +``` + +And the implementation of the resolver: + +```js +function parseJSONLiteral(ast) { + switch (ast.kind) { + case Kind.STRING: + case Kind.BOOLEAN: + return ast.value; + case Kind.INT: + case Kind.FLOAT: + return parseFloat(ast.value); + case Kind.OBJECT: { + const value = Object.create(null); + ast.fields.forEach(field => { + value[field.name.value] = parseJSONLiteral(field.value); + }); + + return value; + } + case Kind.LIST: + return ast.values.map(parseJSONLiteral); + default: + return null; + } +} + +const resolvers = + JSON: { + __parseLiteral: parseJSONLiteral, + __serialize: value => value, + __parseValue: value => value, + }, +}; +``` + +For more information please refer to [official documentation](http://graphql.org/docs/api-reference-type-system/) or +to the [learn GraphQL](https://github.com/mugli/learning-graphql/blob/master/7.%20Deep%20Dive%20into%20GraphQL%20Type%20System.md) website. From e806a5e713964be1bc2316e268d9f95729e9d7f2 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Wed, 22 Jun 2016 13:21:26 -0700 Subject: [PATCH 162/409] Clarified use of JSON scalar data type --- docs/source/apollo-server/scalars.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-server/scalars.md b/docs/source/apollo-server/scalars.md index 0e3050879ec..3ad6ae6774a 100644 --- a/docs/source/apollo-server/scalars.md +++ b/docs/source/apollo-server/scalars.md @@ -96,10 +96,8 @@ function oddValue(value) { ### JSON data type -Often we desire to use objects and store them in JSON format. In most databases, -such fields are stored in a string format. -We can use a scalar type to correctly recreate the object format of JSON and parse -all its field into a correct data type. Following is an example of JSON scalar: +While we usually want to define a schema for our data, in some cases it makes sense to store unstructured objects in the database, and not define a GraphQL schema for it. JSON is a commonly used format for storing such objects. +In GraphQL, we can define a custom scalar type to serialize and parse JSON: ```js From 15577eea9484f328137b075aec5673675a41e1d8 Mon Sep 17 00:00:00 2001 From: David Alan Hjelle Date: Wed, 22 Jun 2016 21:44:47 -0500 Subject: [PATCH 163/409] Add `watchQuery` to docs for `react-apollo`. (#117) As added in https://github.com/apollostack/react-apollo/commit/27be0a38640009cf95a9644cc71b486ab32464e7 --- docs/source/apollo-client/react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index fc3906ef3e6..9b7e0efd1c4 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -207,7 +207,7 @@ Example use cases: `Infinite scroll`, `Data filtering`

Additional Props

-Redux's connect will pass `dispatch` as a prop unless action creators are passed using `mapDispatchToProps`. Likewise, the Apollo connect exposes part of the apollo-client api to props under the keys `query` and `mutate`. These correspond to the Apollo methods and can be used for custom needs outside of the ability of the wrapper component. +Redux's connect will pass `dispatch` as a prop unless action creators are passed using `mapDispatchToProps`. Likewise, the Apollo connect exposes part of the apollo-client api to props under the keys `query`, `watchQuery`, and `mutate`. These correspond to the Apollo methods and can be used for custom needs outside of the ability of the wrapper component.

Using in concert with Redux

From 21f37402b979a1b507176db21dc83640ed299513 Mon Sep 17 00:00:00 2001 From: Dhaivat Pandya Date: Wed, 22 Jun 2016 21:23:40 -0700 Subject: [PATCH 164/409] Batching docs (#115) * first pass at batching docs * docs for batching * added an example and fixed issues according to @stubailo's comments * Added information about options that the ApolloClient constructor now has * Update --- docs/source/apollo-client/index.md | 2 + docs/source/apollo-client/network.md | 120 +++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 88a81b46dd9..6529685b7c8 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -29,6 +29,8 @@ Instantiate a new Apollo Client. - `networkInterface` (Optional, defaults to an HTTP interface that points to `/graphql`) The network interface to use when sending GraphQL queries to the server. Create this using [createNetworkInterface](#createNetworkInterface), or make a [totally custom one](network.html). - `dataIdFromObject` (Optional) A function to use during result normalization to determine the IDs of result objects. Function signature should be `(result: Object) => string`. [Learn more about normalization.](how-it-works.html#normalize) - `reduxRootKey` (Optional, `'apollo'` by default) The key under which Apollo data will be stored in the Redux store. [Read more about integrating with Redux](redux.html). If you aren't integrating with an existing Redux store, don't worry about this. +- `shouldBatch` (Optional, `false` by default) A boolean value that specifies whether Apollo Client should batch queries together into one request. If you pass this option, the network interface must support batching. [Read more about query batching](network.html). +- `queryTransformer` (Optional) A function that transforms GraphQL `SelectionSet`s before they are sent to the server. One common option which adds `__typename` to all queries can be imported with `import { addTypename } from 'apollo-client'`. Here's how you would instantiate a default client that points to `/graphql`: diff --git a/docs/source/apollo-client/network.md b/docs/source/apollo-client/network.md index cd07b6d467c..d72efdb09c8 100644 --- a/docs/source/apollo-client/network.md +++ b/docs/source/apollo-client/network.md @@ -34,3 +34,123 @@ This represents a result that comes back from the GraphQL server. - `data: any` This is the actual data returned by the server. - `errors: Array` This is an array of errors returned by the server. + +

Query batching

+ +Apollo Client can automatically batch multiple queries into one request when they are done within a 10 millisecond interval. This means that if you render several components, for example a navbar, sidebar, and content, and each of those do their own GraphQL query, they will all be sent in one roundtrip. This batching supports all GraphQL endpoints, including those that do not implement transport-level batching, by merging together queries into one top-level query with multiple fields. + +To turn on query batching, pass the `shouldBatch: true` option to the `ApolloClient` constructor. In addition, you need to use a network interface that supports batching. The default network interface generated by `createNetworkInterface` supports batching out of the box, but you can convert any network interface to a batching one by calling `addQueryMerging` on it, as described [below](#addQueryMerging). + +

Batching example

+ +Batching is supported in the default network interface, so to turn it on normally you just have to pass `shouldBatch: true` to the constructor: + +```javascript +import ApolloClient from 'apollo-client'; + +const apolloClient = new ApolloClient({ + shouldBatch: true, +}); + +// These two queries happen in quick suggestion, possibly in totally different +// places within your UI. +apolloClient.query({ query: firstQuery }); +apolloClient.query({ query: secondQuery }); + +// You don't have to do anything special - Apollo will send the two queries as one request. +``` + +If you have developed a custom network interface, you can easily add batching via query merging to it with `addQueryMerging`: + +```js +import { myCustomNetworkInterface } from './network'; +import { addQueryMerging } from 'apollo-client'; + +const networkInterface = addQueryMerging(myCustomNetworkInterface); + +const apolloClient = new ApolloClient({ + networkInterface, + shouldBatch: true, +}); + +// Now queries will be batched +``` + +

addQueryMerging(networkInterface)

+ +```js +import { addQueryMerging } from 'apollo-client'; + +const batchingNetworkInterface = addQueryMerging(myCustomNetworkInterface); +``` + +This function takes an arbitrary `NetworkInterface` implementation and returns a `BatchedNetworkInterface` that batches queries together using query merging. You don't need to use this on the standard HTTP network interface generated by `createNetworkInterface`. + +

How query merging works

+ +Apollo can provide batching functionality over a standard `NetworkInterface` implementation that does not typically support batching. It does this by merging queries together under one root query and then unpacking the merged result returned by the server. + +It's easier to understand with an example. Consider the following GraphQL queries: + +```graphql +query someAuthor { + author { + firstName + lastName + } +} +``` + +```graphql +query somePerson { + person { + name + } +} +``` + +If these two queries are fired within one batching interval, Apollo client will internally merge these two queries into the following: + +```graphql +query __composed { + ___someAuthor___requestIndex_0__fieldIndex_0: author { + firstName + lastName + } + + ___somePerson___requestIndex_1__fieldIndex_0: person { + name + } +} +``` + +Once the results are returned for this query, Apollo will take care of unpacking the merged result and present your code with data that looks like the following: + +```json +{ + "data": { + "author": { + "firstName": "John", + "lastName": "Smith" + } + } +} +``` + +```json +{ + "data": { + "person": { + "name": "John Smith" + } + } +} +``` + +This means that your client code and server implementation can remain completely oblivious to the batching that Apollo performs. + +

interface BatchedNetworkInterface

+ +If you want to implement a network interface that natively supports batching, for example by sending queries to a special endpoint that can handle multiple operations, you can do that by implementing a special method in your network interface, in addition to the normal `query` method: + +- `batchQuery(request: GraphQLRequest[]): Promise` This function on a batched network interface that takes an array of GraphQL request objects, submits a batched request that represents each of the requests and returns a promise. This promise is resolved with the results of each of the GraphQL requests. The promise should be rejected in case of a network error. From 817868ce78b52ca2379c678f983db899b1dd8e57 Mon Sep 17 00:00:00 2001 From: jlevycpa Date: Sun, 26 Jun 2016 02:22:47 -0400 Subject: [PATCH 165/409] Recommend importing gql literal into each file (#118) * Recommended that gql literals be imported in all files. * Fixed error and switched to new graphql-tag package --- docs/source/apollo-client/core.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index dd4a8f3d09f..834b1e464a9 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -20,25 +20,31 @@ const query = gql` ` ``` -There are two ways to import and use the `gql` tag. You can either register it globally: +The `gql` tag is a function under the hood, therefore it must be imported wherever it is used: ```js -// Register it globally -import { registerGqlTag } from 'apollo-client/gql'; -registerGqlTag(); +import gql from 'graphql-tag'; -// Now, in any part of your app you can use the gql tag const query = gql`...`; ``` -Alternatively, you can import it in every file if you want to be more explicit: +Alternatively, if you prefer *not* to import the `gql` tag each time you use it, you can register it as a global: ```js -import gql from 'apollo-client/gql'; +// In a browser +import gql from 'graphql-tag'; +window['gql'] = gql; + +// In node.js +import gql from 'graphql-tag'; +global['gql'] = gql; +// Now, in any part of your app you can use the gql tag const query = gql`...`; ``` +**Note:** ES6 imports are hoisted, which may mean that client code using the `gql` tag gets evaluated before the registration of the global. To avoid race conditions, it's best to just import the tag into each file that uses it. + This template literal tag serves two functions: 1. It parses the query string. From de3124b57f985b650b75bf0dd702f5fe28b3bb25 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Sat, 25 Jun 2016 23:33:21 -0700 Subject: [PATCH 166/409] Make graphql-tag package clearer --- docs/source/apollo-client/core.md | 18 ++++++++---------- docs/source/apollo-client/index.md | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index 834b1e464a9..ec1ab291994 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -11,6 +11,8 @@ Most of the time, when you use the Apollo Client, you'll do it through one of th When using Apollo Client, you usually write your queries using multiline template literals. These literals need to be tagged with the `gql` tag, like this: ```js +import gql from 'graphql-tag'; + const query = gql` { user(id: 5) { @@ -20,18 +22,12 @@ const query = gql` ` ``` -The `gql` tag is a function under the hood, therefore it must be imported wherever it is used: +The `gql` tag is a function that parses the query string passed to it. It can be found in the `graphql-tag` companion package on npm. -```js -import gql from 'graphql-tag'; - -const query = gql`...`; -``` - -Alternatively, if you prefer *not* to import the `gql` tag each time you use it, you can register it as a global: +As a shortcut, if you prefer *not* to import `gql` tag in every place you use it, you can register it as a global: ```js -// In a browser +// In the browser import gql from 'graphql-tag'; window['gql'] = gql; @@ -45,12 +41,14 @@ const query = gql`...`; **Note:** ES6 imports are hoisted, which may mean that client code using the `gql` tag gets evaluated before the registration of the global. To avoid race conditions, it's best to just import the tag into each file that uses it. +

Why use a template literal?

+ This template literal tag serves two functions: 1. It parses the query string. 2. It tells developer tools like `eslint-plugin-graphql` which strings in your app are GraphQL queries, so that they can be treated specially. -We hope to soon release a build tool you can run on your queries when deploying to production so that you can avoid the overhead of loading the GraphQL parser at runtime, much like Relay does with `Relay.QL`. +Being able to statically analyze GraphQL queries in your app is a huge benefit of GraphQL, so it's correct to write them as special strings that can be found by these tools.

Queries

diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 6529685b7c8..86768fdb62d 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -11,7 +11,7 @@ The Apollo Client can easily be dropped into any JavaScript frontend where you w ## Installing ```txt -npm install apollo-client +npm install apollo-client graphql-tag ``` To use this client in a web browser or mobile app, you'll need a build system capable of loading NPM packages on the client. Some common choices include Browserify, Webpack, and Meteor 1.3. Move on to the next article to see how to import and initialize the client. From 6196b7cfd305839ff484f0d168fd6da2fe3a92b3 Mon Sep 17 00:00:00 2001 From: Zoltan Olah Date: Mon, 27 Jun 2016 18:58:54 +1000 Subject: [PATCH 167/409] Update index.md --- docs/source/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index b70afe7752a..810b076b53f 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -28,7 +28,8 @@ Just getting started with GraphQL? Check out the [official documentation](http:/ We have put together some basic example apps using various parts of Apollo; check them out to see how everything fits together. We're always looking for improvements and feedback on these apps, and they'll get better as Apollo becomes more production-ready! ### General JS Examples -- [A full-stack Apollo Client and Server example app that uses React, Webpack, Babel, and Redux](https://github.com/apollostack/GitHunt) +- [Githunt - A full-stack Apollo Client and Server example app that uses React, Webpack, Babel, and Redux](https://github.com/apollostack/GitHunt) +- [Githunt written in Angular 2](https://github.com/kamilkisiela/GitHunt-angular2) - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - [A simple GraphQL blog that uses Feathersjs for managing database services](https://github.com/swarthout/feathers-apollo) From 128a22fe2f5e5dc1d53db5fb11201c4cb321a78a Mon Sep 17 00:00:00 2001 From: Martin Bee Date: Mon, 27 Jun 2016 10:43:51 -0500 Subject: [PATCH 168/409] Fix a few typos in apollo-client docs. (#120) * replace intial with initial. * replace recieving with receiving. * devtools.md typo fixes. * fix react.md typos. * Readd trailing whitespaces * Readd trailing space --- docs/source/apollo-client/devtools.md | 2 +- docs/source/apollo-client/index.md | 6 +++--- docs/source/apollo-client/react.md | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md index acc7f0fbd83..cfb8504d3e4 100644 --- a/docs/source/apollo-client/devtools.md +++ b/docs/source/apollo-client/devtools.md @@ -50,7 +50,7 @@ When a query is executed and data has been resolved, the Store dispatches `QUERY ![QUERY_RESULT](../assets/devtools/query-result.png) -When the Store gets a `QUERY_RESULT`, a couple pieces of state change. First our query is no longer `loading`, so we can see that state has updated in oure Store. Next we see that the `data` property is hyrdated with the data resolved by our query. From here you can use one of the Frontend integrations to bind the data from `QUERY_RESULT` to your UI Components. +When the Store gets a `QUERY_RESULT`, a couple pieces of state change. First our query is no longer `loading`, so we can see that state has updated in our Store. Next we see that the `data` property is hydrated with the data resolved by our query. From here you can use one of the Frontend integrations to bind the data from `QUERY_RESULT` to your UI Components. ### Mutations diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 86768fdb62d..f1f3b91f90f 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -142,11 +142,11 @@ Given the above code, the header's `Authorization` value will be that of `token2

CORS support

-If your GraphQL server and client application are running on different origins, you will get HTTP 405 errors thrown by the client. This happens when recieving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. How to do this is documented in the [apollo-server section](/apollo-server/tools.html#corsSupport). +If your GraphQL server and client application are running on different origins, you will get HTTP 405 errors thrown by the client. This happens when receiving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. How to do this is documented in the [apollo-server section](/apollo-server/tools.html#corsSupport). -

Loading Intial Data from Server

+

Loading Initial Data from Server

-For applications that support server side rendering, or that can perform some queries on the server prior to rendering the client, ApolloClient allows for setting the intial state of data. This is sometimes called store rehydration for redux applications. +For applications that support server side rendering, or that can perform some queries on the server prior to rendering the client, ApolloClient allows for setting the initial state of data. This is sometimes called store rehydration for redux applications. > Note: if you are using redux externally to apollo, and already have store rehydration, this key isn't needed. diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 9b7e0efd1c4..5576f5e71c1 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -152,13 +152,13 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa } ``` -`mapMutationsToProps` returns an object made up of keys and values that are custom functions to call the mutation. These can be used in children components (for instance, on a event handler) to trigger the mutation. The resulting function must return the same possible arguents as [`ApolloClient#mutate`](core.html#mutate). In this case, the `Category` component will get a prop called `postReply`, which has the following keys: +`mapMutationsToProps` returns an object made up of keys and values that are custom functions to call the mutation. These can be used in children components (for instance, on a event handler) to trigger the mutation. The resulting function must return the same possible arguments as [`ApolloClient#mutate`](core.html#mutate). In this case, the `Category` component will get a prop called `postReply`, which has the following keys: ```js { loading: boolean, errors: Error[], - postReply: Data, // only when the muation has returned + postReply: Data, // only when the mutation has returned } ``` @@ -173,7 +173,7 @@ One typical pattern is wanting to refetch a query after a mutation has happened. @connect({ mapMutationsToProps, mapQueriesToProps }) class Container extends React.Component{ componentDidMount() { - // call the muation + // call the mutation this.props.mutations.makeListPrivate() .then((err, data) => { // if we have the data we want From f2e05954338b6a36f9a3cd05c826b5102f5a2fc5 Mon Sep 17 00:00:00 2001 From: Leonidez Acosta Date: Mon, 27 Jun 2016 10:44:55 -0500 Subject: [PATCH 169/409] fix reference to pollInterval argument (#119) --- docs/source/apollo-client/core.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/core.md index ec1ab291994..0c8ebb70bd8 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/core.md @@ -64,7 +64,7 @@ If you want to fetch some data to perform a one-time operation, then `query` is This means that using `watchQuery` will keep your UI consistent, so that every query being displayed on the screen shows the exact same data for the same objects. -Currently `watchQuery` allows reactivity via the optional `pollingInterval` argument. In the future, `watchQuery` will also have more options for reactivity, like connecting to a source of invalidations for reactive re-fetching, or accepting pushed data from the server for low-latency updates. Using it now will allow you to easily switch those options on when they become available. +Currently `watchQuery` allows reactivity via the optional `pollInterval` argument. In the future, `watchQuery` will also have more options for reactivity, like connecting to a source of invalidations for reactive re-fetching, or accepting pushed data from the server for low-latency updates. Using it now will allow you to easily switch those options on when they become available.

query diffing and forceFetch

From ffb894572430feaae8eaa625500a08ec2b488195 Mon Sep 17 00:00:00 2001 From: Abhi Aiyer Date: Mon, 27 Jun 2016 21:45:02 -0700 Subject: [PATCH 170/409] Thunk it up (#121) * Add docs for redux devtools * thunk it up * gitignore update * remove idea * undo submodule --- .gitignore | 3 +- docs/source/apollo-client/redux.md | 64 ++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 063b0e4ce79..9aaf9bf8e7a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ db.json *.log node_modules/ public/ -.deploy*/ \ No newline at end of file +.deploy*/ +.idea/ diff --git a/docs/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md index 828afd7a14f..2e1e99467af 100644 --- a/docs/source/apollo-client/redux.md +++ b/docs/source/apollo-client/redux.md @@ -76,3 +76,67 @@ store.getState();

react-redux

The `react-apollo` integration package is a drop-in replacement for `react-redux`, so if you are using Redux and Apollo together you don't need to have nested data containers. [Read the docs for `react-apollo` to see how to do this.](react.html) + +

Async Actions with thunk

+ +In Redux, we handle asynchronity via the `thunk` middleware. This allows you to dispatch a function, instead of an Action Object. To integrate `thunk` into your workflow, follow the steps below: + +1. Install `redux-thunk` from npm. +2. Include the middleware into your store initiation. + +```js +import ReduxThunk from 'redux-thunk' + +const client = new ApolloClient({ + reduxRootKey: 'myDifferentKey', +}); + +const store = createStore( + combineReducers({ + todos: todoReducer, + users: userReducer, + myDifferentKey: client.reducer(), + }), + applyMiddleware(client.middleware(), ReduxThunk) +); + +``` + +Great! Now your store can dispatch functions. This will allow you to write more complex Action Creators. + +Since 2.1.0, `Redux Thunk` supports injecting a custom argument using the withExtraArgument function. It is recommended we attach the `ApolloClient` into our middleware. This will allow you to have reference to `dispatch`, `getState`, and the `ApolloClient`: + +```js +import ReduxThunk from 'redux-thunk' + +const client = new ApolloClient({ + reduxRootKey: 'myDifferentKey', +}); + +const store = createStore( + combineReducers({ + todos: todoReducer, + users: userReducer, + myDifferentKey: client.reducer(), + }), + applyMiddleware(client.middleware(), ReduxThunk.withExtraArgument(client)) +); + +``` + +Now if we dispatch a function our Action Creator is enhanced: + +```js +function fetchUser(id) { + return (dispatch, getState, client) => { + // you can use the apollo client here + client.mutate(...).then((result) => { + dispatch({ + type: 'SOME_UI_ACTION', + data: result + }); + }); + } +} + +``` From 83e0998f78fbaec1b4a4dc79e939f2cf4ef504a6 Mon Sep 17 00:00:00 2001 From: Abhi Aiyer Date: Mon, 27 Jun 2016 21:46:31 -0700 Subject: [PATCH 171/409] update devtools docs (#122) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add docs for redux devtools * update devtools docå * submodule undo --- docs/source/apollo-client/devtools.md | 93 ++++++++++++++++++++++----- 1 file changed, 77 insertions(+), 16 deletions(-) diff --git a/docs/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md index cfb8504d3e4..e9f7e277236 100644 --- a/docs/source/apollo-client/devtools.md +++ b/docs/source/apollo-client/devtools.md @@ -34,37 +34,98 @@ As you interact with your application, the GraphQL server will resolve queries a ### Queries -When a query is sent to your GraphQL server, Apollo dispatches an action to the Redux Store of type `QUERY_INIT`. - -![QUERY_INIT](../assets/devtools/query-init.png) - -Taking a closer look at the metadata that comes with a `QUERY_INIT` action, we see that `QUERY_INIT` sends over `queryId`, `queryString`, and `query`. The action takes these pieces of metadata and adds it to the Redux store. These properties can now be found saved in Redux. -The beauty of these state changes is the management for data "readyness". When the Store dispatches `QUERY_INIT`, the particular query we are trying to resolve will have this structure: +When a query is sent to your GraphQL server, Apollo dispatches an action to the Redux Store of type `APOLLO_QUERY_INIT`. + +```js +// APOLLO_QUERY_INIT +{ + queryString: "{ counts { _id count } }", + query: {}, + forceFetch: false, + returnPartialData: false, + queryId: "0" + requestId: 1 +} +``` + +Taking a closer look at the metadata that comes with a `APOLLO_QUERY_INIT` action, we see that `APOLLO_QUERY_INIT` sends over `queryId`, `queryString`, and `query`. The action takes these pieces of metadata and adds it to the Redux store. These properties can now be found saved in Redux. +The beauty of these state changes is the management for data "readyness". When the Store dispatches `APOLLO_QUERY_INIT`, the particular query we are trying to resolve will have this structure: ![QUERY_INIT_DATA](../assets/devtools/query-init-data.png) * The keys `loading` to manage our data "readyness", * `networkError` and `graphQLErrors` to have complete visibility of errors to the end user. -When a query is executed and data has been resolved, the Store dispatches `QUERY_RESULT`. - -![QUERY_RESULT](../assets/devtools/query-result.png) - -When the Store gets a `QUERY_RESULT`, a couple pieces of state change. First our query is no longer `loading`, so we can see that state has updated in our Store. Next we see that the `data` property is hydrated with the data resolved by our query. From here you can use one of the Frontend integrations to bind the data from `QUERY_RESULT` to your UI Components. +When a query is executed and data has been resolved, the Store dispatches `APOLLO_QUERY_RESULT`. + +```js +// APOLLO_QUERY_RESULT +{ + state: { + apollo: { + queries: { + "0": { + queryString: "{ counts { _id count } }", + query: {}, + loading: false, + networkError: null, + graphQLErrors: null, + forceFetch: false, + returnPartialData: false, + queryId: "0" + lastRequestId: 1 + + } + } + } + } +} +``` + +When the Store gets a `APOLLO_QUERY_RESULT`, a couple pieces of state change. First our query is no longer `loading`, so we can see that state has updated in oure Store. Next we see that the `data` property is hyrdated with the data resolved by our query. From here you can use one of the Frontend integrations to bind the data from `APOLLO_QUERY_RESULT` to your UI Components. ### Mutations -When a mutation is sent to your GraphQL server, Apollo dispatches an action to the Redux Store of type `MUTATION_INIT`. - -![MUTATION_INIT](../assets/devtools/mutation-init.png) +When a mutation is sent to your GraphQL server, Apollo dispatches an action to the Redux Store of type `APOLLO_MUTATION_INIT`. + +```js +{ + mutationString: "mutation createCount($id: String) { incrementCount(id: $id) } ", + mutation: { + id: "ROOT_MUTATION", + typeName: "Mutation", + selectionSet: {}, + variables: {}, + id: "Y9WTEFbtsATdYzZnD" + } + mutationId: "2" +} +``` Here we can see the `selection set` of our mutation and the variables used in the mutation. -When a mutation has been resolved, the Store dispatches `MUTATION_RESULT`. +When a mutation has been resolved, the Store dispatches `APOLLO_MUTATION_RESULT`. ![MUTATION_RESULT](../assets/devtools/mutation-result.png) * The keys `loading` to manage our mutation "readyness" * `error` to have complete visibility of errors to the end user. -![MUTATION_RESULT](../assets/devtools/mutation-result-data.png) +```js +{ + state: { + apollo: { + mutations: { + "2": { + mutationString: "mutation createCount($id: String) { incrementCount(id: $id) } ", + mutation: {}, + variables: {}, + loading: false, + error: null, + } + } + } + } +} + +``` From a8d28be6d47199bc58bc055efebc14a5bf844950 Mon Sep 17 00:00:00 2001 From: Abhi Aiyer Date: Mon, 27 Jun 2016 23:47:49 -0700 Subject: [PATCH 172/409] Thunk example (#125) * Add docs for redux devtools * thunk it up * gitignore update * remove idea * undo submodule * thunk example --- docs/source/apollo-client/redux.md | 57 ++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/docs/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md index 2e1e99467af..92a8a1605ce 100644 --- a/docs/source/apollo-client/redux.md +++ b/docs/source/apollo-client/redux.md @@ -140,3 +140,60 @@ function fetchUser(id) { } ``` + +

Using thunk

+ +Okay now that you understand the basics of `thunk`, let's go over dispatching an `Apollo` mutation. + +```js +// let's write a function to generate our mutation params +// in our example we'll be updating the count of a counter +function generateMutationObject(id) { + return { + mutation: gql` + mutation createCount($id: String) { + incrementCount(id: $id) + }`, + variables: { + id + } + }; +} + +``` + +Now we will write our `thunk`: + +```js +function incrementCount(id) { + return (dispatch, getState, client) => { + // we have access to the client inside this function + client.mutate(generateMutationObject(id)).then((result) => { + if (result.data) { + // if the mutation yields data, dispatch an action with that data + return dispatch({ + type: "UPDATE_COUNT", + data: result.data.incrementCount + }); + } + }); + }; +} +``` + +Plug it into your UI + +```js +import { connect } from 'react-redux'; + +function CounterButton({ dispatch }) { + return ( + + ); +} + +export default connect()(CounterButton); +``` + + + From 5ef5f20c9132b9f22c4f17488c4a9b630b4f2764 Mon Sep 17 00:00:00 2001 From: Loren Sands-Ramshaw Date: Wed, 29 Jun 2016 22:28:59 -0400 Subject: [PATCH 173/409] Use meteor/apollo package, closes #106 --- docs/source/apollo-client/meteor.md | 150 ++++++++++++---------------- 1 file changed, 62 insertions(+), 88 deletions(-) diff --git a/docs/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md index d5c160304dc..d7dac225fad 100644 --- a/docs/source/apollo-client/meteor.md +++ b/docs/source/apollo-client/meteor.md @@ -4,121 +4,95 @@ order: 112 description: Specifics about using Apollo in your Meteor application. --- -The Apollo client and server tools are published on NPM, which makes them available to all JavaScript applications, including those written with Meteor 1.3 and above. When using Meteor with Apollo, there are a few things to keep in mind to have a smooth integration between the client and server. +The Apollo client and server tools are published on NPM, which makes them available to all JavaScript applications, including those written with Meteor 1.3 and above. When using Meteor with Apollo, you can use those npm packages directly, or you can use the [`apollo` Atmosphere package](https://github.com/apollostack/meteor-integration/), which simplifies things for you. -You can see all of these in action in the [Apollo Meteor starter kit](https://github.com/apollostack/meteor-starter-kit). +To install `apollo`, run both of these commands: -## Client - -### Using with Meteor Accounts - -The only thing you need to do on the client to pass through your Meteor login token into the Apollo server is to create a network interface with a header that passes the login token you can get from the Meteor Accounts client. Then just log in as normal and requests sent after that point will be authenticated. - -```js -import ApolloClient, { createNetworkInterface } from 'apollo-client'; -import { Accounts } from 'meteor/accounts-base'; - -const networkInterface = createNetworkInterface('/graphql'); +```text +meteor add apollo +meteor npm install --save apollo-client apollo-server express +``` -networkInterface.use([{ - applyMiddleware(request, next) { - const currentUserToken = Accounts._storedLoginToken(); +## Usage - if (!currentUserToken) { - next(); - return; - } +You can see this package in action in the [Apollo Meteor starter kit](https://github.com/apollostack/meteor-starter-kit). - if (!request.options.headers) { - request.options.headers = new Headers(); - } +### Client - request.options.headers.Authorization = currentUserToken; +Connect to the Apollo server with [`meteorClientConfig`](#meteorClientConfig): - next(); - } -}]); +```js +import ApolloClient from 'apollo-client'; +import { meteorClientConfig } from 'meteor/apollo'; -const client = new ApolloClient({ - networkInterface, -}); +const client = new ApolloClient(meteorClientConfig()); ``` -## Server - -### Using Express with WebApp +### Server -The Apollo server, and the Express GraphQL package that it is based on, rely on the Express server-side API framework. To use it, you will need to initialize a new Express server and proxy it to your Meteor `WebApp` server. +Define your schema and resolvers, and then set up the Apollo server with [`createApolloServer`](#createApolloServer): ```js -import { apolloServer } from 'graphql-tools'; -import express from 'express'; -import { Meteor } from 'meteor/meteor'; -import { WebApp } from 'meteor/webapp'; +import { createApolloServer } from 'meteor/apollo'; -import { schema, resolvers } from '/imports/api/schema'; +import schema from '/imports/api/schema'; +import resolvers from '/imports/api/resolvers'; -const graphQLServer = express(); - -graphQLServer.use('/graphql', apolloServer({ +createApolloServer({ graphiql: true, pretty: true, schema, resolvers, -})); - -// This redirects all requests to /graphql to our Express GraphQL server -WebApp.connectHandlers.use(Meteor.bindEnvironment(graphQLServer)); +}); ``` -### Getting the current user +The [GraphiQL](https://github.com/graphql/graphiql) url is [http://localhost:3000/graphql](http://localhost:3000/graphql) -If you are passing in the login token from the client as detailed above, you probably want to get the current user on the server, and use that in your resolvers. To do so, you should make your `apolloServer` options a function of the current request, and use some Meteor packages to get the user from the login token. +Inside your resolvers, if the user is logged in, their id will be `context.userId`: ```js -// Some more imports -import { Meteor } from 'meteor/meteor'; -import { Accounts } from 'meteor/accounts-base'; -import { check } from 'meteor/check'; - -// ... same setup code as above - -graphQLServer.use('/graphql', apolloServer(async (req) => { - let user = null; - - // Get the token from the header - if (req.headers.authorization) { - const token = req.headers.authorization; - check(token, String); - const hashedToken = Accounts._hashLoginToken(token); - - // Get the user from the database - user = await Meteor.users.findOne( - {"services.resume.loginTokens.hashedToken": hashedToken}); - } - - return { - graphiql: true, - pretty: true, - schema, - resolvers, - - // Attach the user to the context object - context: { - // The current user will now be available on context.user in all resolvers - user, +export const resolvers = { + Query: { + async user(root, args, context) { + // Only return the current user, for security + if (context.userId === args.id) { + return await Meteor.users.findOne(context.userId); + } }, - }; -})); + }, + User: ... +} ``` -Now, you can use `context.user` from your resolvers: +## API -```js -user(root, args, context) { - // Only return data if the fetched id matches the current user, for security - if (context.user._id === args.id) { - return context.user; - } +### meteorClientConfig + +`meteorClientConfig(networkInterfaceConfig)` + +`networkInterfaceConfig` may contain any of the following fields: +- `path`: path of the GraphQL server. Default: `'/graphql'`. +- `options`: `FetchOptions` passed to [`createNetworkInterface`](http://docs.apollostack.com/apollo-client/index.html#createNetworkInterface). Default: `{}`. +- `useMeteorAccounts`: Whether to send the current user's login token to the GraphQL server with each request. Default: `true`. + +Returns an [`options` object](http://0.0.0.0:4000/apollo-client/index.html#ApolloClient) for `ApolloClient`: + +``` +{ + networkInterface + queryTransformer: addTypenameToSelectionSet + dataIdFromObject: object.__typename + object._id } ``` + +### createApolloServer + +`createApolloServer(options, config)` + +- [`options`](http://docs.apollostack.com/apollo-server/tools.html#apolloServer) +- `config` may contain any of the following fields: + - `path`: [Path](http://expressjs.com/en/api.html#app.use) of the GraphQL server. Default: `'/graphql'`. + - `maxAccountsCacheSizeInMB`: User account ids are cached in memory to reduce the response latency on multiple requests from the same user. Default: `1`. + +It will use the same port as your Meteor server. Don't put a route or static asset at the same path as the Apollo server (default is `/graphql`). + From ac8e3f3de9397303521260af90dcb1b1869177a2 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Thu, 30 Jun 2016 10:10:04 -0700 Subject: [PATCH 174/409] Correct angular docs to now recommend graphql-tag --- docs/source/apollo-client/angular2.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index cf296e52352..6f752db862d 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -93,7 +93,7 @@ import { Observable } from 'rxjs/Observable'; -import gql from 'apollo-client/gql'; +import gql from 'graphql-tag'; @Component({ selector: 'postsList', @@ -136,7 +136,7 @@ import { Angular2Apollo } from 'angular2-apollo'; -import gql from 'apollo-client/gql'; +import gql from 'graphql-tag'; import { graphQLResult @@ -246,7 +246,7 @@ import ApolloClient, { createNetworkInterface } from 'apollo-client'; -import gql from 'apollo-client/gql'; +import gql from 'graphql-tag'; const client = new ApolloClient({ networkInterface: createNetworkInterface('http://localhost:8080') @@ -312,7 +312,7 @@ import ApolloClient, { createNetworkInterface } from 'apollo-client'; -import gql from 'apollo-client/gql'; +import gql from 'graphql-tag'; const client = new ApolloClient({ networkInterface: createNetworkInterface('http://localhost:8080') From 697dbd6ab80f9149ed9547f4366facf4f5e122d5 Mon Sep 17 00:00:00 2001 From: Loren Sands-Ramshaw Date: Fri, 1 Jul 2016 18:13:14 -0400 Subject: [PATCH 175/409] Link to meteor homepage in meteor.md --- docs/source/apollo-client/meteor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md index d7dac225fad..acd101ee84e 100644 --- a/docs/source/apollo-client/meteor.md +++ b/docs/source/apollo-client/meteor.md @@ -4,7 +4,7 @@ order: 112 description: Specifics about using Apollo in your Meteor application. --- -The Apollo client and server tools are published on NPM, which makes them available to all JavaScript applications, including those written with Meteor 1.3 and above. When using Meteor with Apollo, you can use those npm packages directly, or you can use the [`apollo` Atmosphere package](https://github.com/apollostack/meteor-integration/), which simplifies things for you. +The Apollo client and server tools are published on NPM, which makes them available to all JavaScript applications, including those written with [Meteor](https://www.meteor.com/) 1.3 and above. When using Meteor with Apollo, you can use those npm packages directly, or you can use the [`apollo` Atmosphere package](https://github.com/apollostack/meteor-integration/), which simplifies things for you. To install `apollo`, run both of these commands: From 00b7a52cc6b10037361a21ef91227399b9737797 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sun, 3 Jul 2016 15:04:14 -0700 Subject: [PATCH 176/409] Adding scalars to the table of contents (#132) --- docs/_config.yml | 1 + {docs/source => source}/apollo-client/angular2.md | 0 {docs/source => source}/apollo-client/core.md | 0 {docs/source => source}/apollo-client/devtools.md | 0 .../source => source}/apollo-client/how-it-works.md | 0 {docs/source => source}/apollo-client/index.md | 0 {docs/source => source}/apollo-client/meteor.md | 0 {docs/source => source}/apollo-client/network.md | 0 {docs/source => source}/apollo-client/react.md | 0 {docs/source => source}/apollo-client/redux.md | 0 {docs/source => source}/apollo-server/connectors.md | 0 {docs/source => source}/apollo-server/errors.md | 0 .../apollo-server/generate-schema.md | 0 .../apollo-server/graphiql-test.png | Bin {docs/source => source}/apollo-server/guide.md | 0 {docs/source => source}/apollo-server/index.md | 0 {docs/source => source}/apollo-server/mocking.md | 0 {docs/source => source}/apollo-server/resolvers.md | 0 {docs/source => source}/apollo-server/scalars.md | 0 {docs/source => source}/apollo-server/tools.md | 0 .../assets/client-diagrams/1-overview.png | Bin .../assets/client-diagrams/2-map.png | Bin .../assets/client-diagrams/3-minimize.png | Bin .../assets/client-diagrams/4-normalize.png | Bin .../source => source}/assets/devtools/devtools.png | Bin .../assets/devtools/mutation-init.png | Bin .../assets/devtools/mutation-result-data.png | Bin .../assets/devtools/mutation-result.png | Bin .../assets/devtools/query-init-data.png | Bin .../assets/devtools/query-init.png | Bin .../assets/devtools/query-result.png | Bin {docs/source => source}/index.md | 0 {docs/source => source}/logo/large.png | Bin {docs/source => source}/logo/square.png | Bin 34 files changed, 1 insertion(+) rename {docs/source => source}/apollo-client/angular2.md (100%) rename {docs/source => source}/apollo-client/core.md (100%) rename {docs/source => source}/apollo-client/devtools.md (100%) rename {docs/source => source}/apollo-client/how-it-works.md (100%) rename {docs/source => source}/apollo-client/index.md (100%) rename {docs/source => source}/apollo-client/meteor.md (100%) rename {docs/source => source}/apollo-client/network.md (100%) rename {docs/source => source}/apollo-client/react.md (100%) rename {docs/source => source}/apollo-client/redux.md (100%) rename {docs/source => source}/apollo-server/connectors.md (100%) rename {docs/source => source}/apollo-server/errors.md (100%) rename {docs/source => source}/apollo-server/generate-schema.md (100%) rename {docs/source => source}/apollo-server/graphiql-test.png (100%) rename {docs/source => source}/apollo-server/guide.md (100%) rename {docs/source => source}/apollo-server/index.md (100%) rename {docs/source => source}/apollo-server/mocking.md (100%) rename {docs/source => source}/apollo-server/resolvers.md (100%) rename {docs/source => source}/apollo-server/scalars.md (100%) rename {docs/source => source}/apollo-server/tools.md (100%) rename {docs/source => source}/assets/client-diagrams/1-overview.png (100%) rename {docs/source => source}/assets/client-diagrams/2-map.png (100%) rename {docs/source => source}/assets/client-diagrams/3-minimize.png (100%) rename {docs/source => source}/assets/client-diagrams/4-normalize.png (100%) rename {docs/source => source}/assets/devtools/devtools.png (100%) rename {docs/source => source}/assets/devtools/mutation-init.png (100%) rename {docs/source => source}/assets/devtools/mutation-result-data.png (100%) rename {docs/source => source}/assets/devtools/mutation-result.png (100%) rename {docs/source => source}/assets/devtools/query-init-data.png (100%) rename {docs/source => source}/assets/devtools/query-init.png (100%) rename {docs/source => source}/assets/devtools/query-result.png (100%) rename {docs/source => source}/index.md (100%) rename {docs/source => source}/logo/large.png (100%) rename {docs/source => source}/logo/square.png (100%) diff --git a/docs/_config.yml b/docs/_config.yml index ff28ce3f9dd..774d69dbadd 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -30,6 +30,7 @@ sidebar_categories: - apollo-server/tools - apollo-server/generate-schema - apollo-server/resolvers + - apollo-server/scalars - apollo-server/mocking - apollo-server/connectors - apollo-server/errors diff --git a/docs/source/apollo-client/angular2.md b/source/apollo-client/angular2.md similarity index 100% rename from docs/source/apollo-client/angular2.md rename to source/apollo-client/angular2.md diff --git a/docs/source/apollo-client/core.md b/source/apollo-client/core.md similarity index 100% rename from docs/source/apollo-client/core.md rename to source/apollo-client/core.md diff --git a/docs/source/apollo-client/devtools.md b/source/apollo-client/devtools.md similarity index 100% rename from docs/source/apollo-client/devtools.md rename to source/apollo-client/devtools.md diff --git a/docs/source/apollo-client/how-it-works.md b/source/apollo-client/how-it-works.md similarity index 100% rename from docs/source/apollo-client/how-it-works.md rename to source/apollo-client/how-it-works.md diff --git a/docs/source/apollo-client/index.md b/source/apollo-client/index.md similarity index 100% rename from docs/source/apollo-client/index.md rename to source/apollo-client/index.md diff --git a/docs/source/apollo-client/meteor.md b/source/apollo-client/meteor.md similarity index 100% rename from docs/source/apollo-client/meteor.md rename to source/apollo-client/meteor.md diff --git a/docs/source/apollo-client/network.md b/source/apollo-client/network.md similarity index 100% rename from docs/source/apollo-client/network.md rename to source/apollo-client/network.md diff --git a/docs/source/apollo-client/react.md b/source/apollo-client/react.md similarity index 100% rename from docs/source/apollo-client/react.md rename to source/apollo-client/react.md diff --git a/docs/source/apollo-client/redux.md b/source/apollo-client/redux.md similarity index 100% rename from docs/source/apollo-client/redux.md rename to source/apollo-client/redux.md diff --git a/docs/source/apollo-server/connectors.md b/source/apollo-server/connectors.md similarity index 100% rename from docs/source/apollo-server/connectors.md rename to source/apollo-server/connectors.md diff --git a/docs/source/apollo-server/errors.md b/source/apollo-server/errors.md similarity index 100% rename from docs/source/apollo-server/errors.md rename to source/apollo-server/errors.md diff --git a/docs/source/apollo-server/generate-schema.md b/source/apollo-server/generate-schema.md similarity index 100% rename from docs/source/apollo-server/generate-schema.md rename to source/apollo-server/generate-schema.md diff --git a/docs/source/apollo-server/graphiql-test.png b/source/apollo-server/graphiql-test.png similarity index 100% rename from docs/source/apollo-server/graphiql-test.png rename to source/apollo-server/graphiql-test.png diff --git a/docs/source/apollo-server/guide.md b/source/apollo-server/guide.md similarity index 100% rename from docs/source/apollo-server/guide.md rename to source/apollo-server/guide.md diff --git a/docs/source/apollo-server/index.md b/source/apollo-server/index.md similarity index 100% rename from docs/source/apollo-server/index.md rename to source/apollo-server/index.md diff --git a/docs/source/apollo-server/mocking.md b/source/apollo-server/mocking.md similarity index 100% rename from docs/source/apollo-server/mocking.md rename to source/apollo-server/mocking.md diff --git a/docs/source/apollo-server/resolvers.md b/source/apollo-server/resolvers.md similarity index 100% rename from docs/source/apollo-server/resolvers.md rename to source/apollo-server/resolvers.md diff --git a/docs/source/apollo-server/scalars.md b/source/apollo-server/scalars.md similarity index 100% rename from docs/source/apollo-server/scalars.md rename to source/apollo-server/scalars.md diff --git a/docs/source/apollo-server/tools.md b/source/apollo-server/tools.md similarity index 100% rename from docs/source/apollo-server/tools.md rename to source/apollo-server/tools.md diff --git a/docs/source/assets/client-diagrams/1-overview.png b/source/assets/client-diagrams/1-overview.png similarity index 100% rename from docs/source/assets/client-diagrams/1-overview.png rename to source/assets/client-diagrams/1-overview.png diff --git a/docs/source/assets/client-diagrams/2-map.png b/source/assets/client-diagrams/2-map.png similarity index 100% rename from docs/source/assets/client-diagrams/2-map.png rename to source/assets/client-diagrams/2-map.png diff --git a/docs/source/assets/client-diagrams/3-minimize.png b/source/assets/client-diagrams/3-minimize.png similarity index 100% rename from docs/source/assets/client-diagrams/3-minimize.png rename to source/assets/client-diagrams/3-minimize.png diff --git a/docs/source/assets/client-diagrams/4-normalize.png b/source/assets/client-diagrams/4-normalize.png similarity index 100% rename from docs/source/assets/client-diagrams/4-normalize.png rename to source/assets/client-diagrams/4-normalize.png diff --git a/docs/source/assets/devtools/devtools.png b/source/assets/devtools/devtools.png similarity index 100% rename from docs/source/assets/devtools/devtools.png rename to source/assets/devtools/devtools.png diff --git a/docs/source/assets/devtools/mutation-init.png b/source/assets/devtools/mutation-init.png similarity index 100% rename from docs/source/assets/devtools/mutation-init.png rename to source/assets/devtools/mutation-init.png diff --git a/docs/source/assets/devtools/mutation-result-data.png b/source/assets/devtools/mutation-result-data.png similarity index 100% rename from docs/source/assets/devtools/mutation-result-data.png rename to source/assets/devtools/mutation-result-data.png diff --git a/docs/source/assets/devtools/mutation-result.png b/source/assets/devtools/mutation-result.png similarity index 100% rename from docs/source/assets/devtools/mutation-result.png rename to source/assets/devtools/mutation-result.png diff --git a/docs/source/assets/devtools/query-init-data.png b/source/assets/devtools/query-init-data.png similarity index 100% rename from docs/source/assets/devtools/query-init-data.png rename to source/assets/devtools/query-init-data.png diff --git a/docs/source/assets/devtools/query-init.png b/source/assets/devtools/query-init.png similarity index 100% rename from docs/source/assets/devtools/query-init.png rename to source/assets/devtools/query-init.png diff --git a/docs/source/assets/devtools/query-result.png b/source/assets/devtools/query-result.png similarity index 100% rename from docs/source/assets/devtools/query-result.png rename to source/assets/devtools/query-result.png diff --git a/docs/source/index.md b/source/index.md similarity index 100% rename from docs/source/index.md rename to source/index.md diff --git a/docs/source/logo/large.png b/source/logo/large.png similarity index 100% rename from docs/source/logo/large.png rename to source/logo/large.png diff --git a/docs/source/logo/square.png b/source/logo/square.png similarity index 100% rename from docs/source/logo/square.png rename to source/logo/square.png From c7b664c8ddce4b789aa3e2e8f483c6e7b076627a Mon Sep 17 00:00:00 2001 From: Lucas Constantino Silva Date: Tue, 5 Jul 2016 20:43:20 -0300 Subject: [PATCH 177/409] Added gql import to docs. (#133) * Added gql import to React docs. * Added gql import to Redux docs. --- {source => docs/source}/apollo-client/angular2.md | 0 {source => docs/source}/apollo-client/core.md | 0 {source => docs/source}/apollo-client/devtools.md | 0 .../source}/apollo-client/how-it-works.md | 0 {source => docs/source}/apollo-client/index.md | 0 {source => docs/source}/apollo-client/meteor.md | 0 {source => docs/source}/apollo-client/network.md | 0 {source => docs/source}/apollo-client/react.md | 1 + {source => docs/source}/apollo-client/redux.md | 2 ++ {source => docs/source}/apollo-server/connectors.md | 0 {source => docs/source}/apollo-server/errors.md | 0 .../source}/apollo-server/generate-schema.md | 0 .../source}/apollo-server/graphiql-test.png | Bin {source => docs/source}/apollo-server/guide.md | 0 {source => docs/source}/apollo-server/index.md | 0 {source => docs/source}/apollo-server/mocking.md | 0 {source => docs/source}/apollo-server/resolvers.md | 0 {source => docs/source}/apollo-server/scalars.md | 0 {source => docs/source}/apollo-server/tools.md | 0 .../source}/assets/client-diagrams/1-overview.png | Bin .../source}/assets/client-diagrams/2-map.png | Bin .../source}/assets/client-diagrams/3-minimize.png | Bin .../source}/assets/client-diagrams/4-normalize.png | Bin .../source}/assets/devtools/devtools.png | Bin .../source}/assets/devtools/mutation-init.png | Bin .../assets/devtools/mutation-result-data.png | Bin .../source}/assets/devtools/mutation-result.png | Bin .../source}/assets/devtools/query-init-data.png | Bin .../source}/assets/devtools/query-init.png | Bin .../source}/assets/devtools/query-result.png | Bin {source => docs/source}/index.md | 0 {source => docs/source}/logo/large.png | Bin {source => docs/source}/logo/square.png | Bin 33 files changed, 3 insertions(+) rename {source => docs/source}/apollo-client/angular2.md (100%) rename {source => docs/source}/apollo-client/core.md (100%) rename {source => docs/source}/apollo-client/devtools.md (100%) rename {source => docs/source}/apollo-client/how-it-works.md (100%) rename {source => docs/source}/apollo-client/index.md (100%) rename {source => docs/source}/apollo-client/meteor.md (100%) rename {source => docs/source}/apollo-client/network.md (100%) rename {source => docs/source}/apollo-client/react.md (99%) rename {source => docs/source}/apollo-client/redux.md (99%) rename {source => docs/source}/apollo-server/connectors.md (100%) rename {source => docs/source}/apollo-server/errors.md (100%) rename {source => docs/source}/apollo-server/generate-schema.md (100%) rename {source => docs/source}/apollo-server/graphiql-test.png (100%) rename {source => docs/source}/apollo-server/guide.md (100%) rename {source => docs/source}/apollo-server/index.md (100%) rename {source => docs/source}/apollo-server/mocking.md (100%) rename {source => docs/source}/apollo-server/resolvers.md (100%) rename {source => docs/source}/apollo-server/scalars.md (100%) rename {source => docs/source}/apollo-server/tools.md (100%) rename {source => docs/source}/assets/client-diagrams/1-overview.png (100%) rename {source => docs/source}/assets/client-diagrams/2-map.png (100%) rename {source => docs/source}/assets/client-diagrams/3-minimize.png (100%) rename {source => docs/source}/assets/client-diagrams/4-normalize.png (100%) rename {source => docs/source}/assets/devtools/devtools.png (100%) rename {source => docs/source}/assets/devtools/mutation-init.png (100%) rename {source => docs/source}/assets/devtools/mutation-result-data.png (100%) rename {source => docs/source}/assets/devtools/mutation-result.png (100%) rename {source => docs/source}/assets/devtools/query-init-data.png (100%) rename {source => docs/source}/assets/devtools/query-init.png (100%) rename {source => docs/source}/assets/devtools/query-result.png (100%) rename {source => docs/source}/index.md (100%) rename {source => docs/source}/logo/large.png (100%) rename {source => docs/source}/logo/square.png (100%) diff --git a/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md similarity index 100% rename from source/apollo-client/angular2.md rename to docs/source/apollo-client/angular2.md diff --git a/source/apollo-client/core.md b/docs/source/apollo-client/core.md similarity index 100% rename from source/apollo-client/core.md rename to docs/source/apollo-client/core.md diff --git a/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md similarity index 100% rename from source/apollo-client/devtools.md rename to docs/source/apollo-client/devtools.md diff --git a/source/apollo-client/how-it-works.md b/docs/source/apollo-client/how-it-works.md similarity index 100% rename from source/apollo-client/how-it-works.md rename to docs/source/apollo-client/how-it-works.md diff --git a/source/apollo-client/index.md b/docs/source/apollo-client/index.md similarity index 100% rename from source/apollo-client/index.md rename to docs/source/apollo-client/index.md diff --git a/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md similarity index 100% rename from source/apollo-client/meteor.md rename to docs/source/apollo-client/meteor.md diff --git a/source/apollo-client/network.md b/docs/source/apollo-client/network.md similarity index 100% rename from source/apollo-client/network.md rename to docs/source/apollo-client/network.md diff --git a/source/apollo-client/react.md b/docs/source/apollo-client/react.md similarity index 99% rename from source/apollo-client/react.md rename to docs/source/apollo-client/react.md index 5576f5e71c1..29ba3c76a40 100644 --- a/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -77,6 +77,7 @@ Basic Apollo version: ```js import { connect } from 'react-apollo'; +import gql from 'graphql-tag'; import Category from '../components/Category'; diff --git a/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md similarity index 99% rename from source/apollo-client/redux.md rename to docs/source/apollo-client/redux.md index 92a8a1605ce..5fff6c8d6fa 100644 --- a/source/apollo-client/redux.md +++ b/docs/source/apollo-client/redux.md @@ -146,6 +146,8 @@ function fetchUser(id) { Okay now that you understand the basics of `thunk`, let's go over dispatching an `Apollo` mutation. ```js +import gql from 'graphql-tag'; + // let's write a function to generate our mutation params // in our example we'll be updating the count of a counter function generateMutationObject(id) { diff --git a/source/apollo-server/connectors.md b/docs/source/apollo-server/connectors.md similarity index 100% rename from source/apollo-server/connectors.md rename to docs/source/apollo-server/connectors.md diff --git a/source/apollo-server/errors.md b/docs/source/apollo-server/errors.md similarity index 100% rename from source/apollo-server/errors.md rename to docs/source/apollo-server/errors.md diff --git a/source/apollo-server/generate-schema.md b/docs/source/apollo-server/generate-schema.md similarity index 100% rename from source/apollo-server/generate-schema.md rename to docs/source/apollo-server/generate-schema.md diff --git a/source/apollo-server/graphiql-test.png b/docs/source/apollo-server/graphiql-test.png similarity index 100% rename from source/apollo-server/graphiql-test.png rename to docs/source/apollo-server/graphiql-test.png diff --git a/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md similarity index 100% rename from source/apollo-server/guide.md rename to docs/source/apollo-server/guide.md diff --git a/source/apollo-server/index.md b/docs/source/apollo-server/index.md similarity index 100% rename from source/apollo-server/index.md rename to docs/source/apollo-server/index.md diff --git a/source/apollo-server/mocking.md b/docs/source/apollo-server/mocking.md similarity index 100% rename from source/apollo-server/mocking.md rename to docs/source/apollo-server/mocking.md diff --git a/source/apollo-server/resolvers.md b/docs/source/apollo-server/resolvers.md similarity index 100% rename from source/apollo-server/resolvers.md rename to docs/source/apollo-server/resolvers.md diff --git a/source/apollo-server/scalars.md b/docs/source/apollo-server/scalars.md similarity index 100% rename from source/apollo-server/scalars.md rename to docs/source/apollo-server/scalars.md diff --git a/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md similarity index 100% rename from source/apollo-server/tools.md rename to docs/source/apollo-server/tools.md diff --git a/source/assets/client-diagrams/1-overview.png b/docs/source/assets/client-diagrams/1-overview.png similarity index 100% rename from source/assets/client-diagrams/1-overview.png rename to docs/source/assets/client-diagrams/1-overview.png diff --git a/source/assets/client-diagrams/2-map.png b/docs/source/assets/client-diagrams/2-map.png similarity index 100% rename from source/assets/client-diagrams/2-map.png rename to docs/source/assets/client-diagrams/2-map.png diff --git a/source/assets/client-diagrams/3-minimize.png b/docs/source/assets/client-diagrams/3-minimize.png similarity index 100% rename from source/assets/client-diagrams/3-minimize.png rename to docs/source/assets/client-diagrams/3-minimize.png diff --git a/source/assets/client-diagrams/4-normalize.png b/docs/source/assets/client-diagrams/4-normalize.png similarity index 100% rename from source/assets/client-diagrams/4-normalize.png rename to docs/source/assets/client-diagrams/4-normalize.png diff --git a/source/assets/devtools/devtools.png b/docs/source/assets/devtools/devtools.png similarity index 100% rename from source/assets/devtools/devtools.png rename to docs/source/assets/devtools/devtools.png diff --git a/source/assets/devtools/mutation-init.png b/docs/source/assets/devtools/mutation-init.png similarity index 100% rename from source/assets/devtools/mutation-init.png rename to docs/source/assets/devtools/mutation-init.png diff --git a/source/assets/devtools/mutation-result-data.png b/docs/source/assets/devtools/mutation-result-data.png similarity index 100% rename from source/assets/devtools/mutation-result-data.png rename to docs/source/assets/devtools/mutation-result-data.png diff --git a/source/assets/devtools/mutation-result.png b/docs/source/assets/devtools/mutation-result.png similarity index 100% rename from source/assets/devtools/mutation-result.png rename to docs/source/assets/devtools/mutation-result.png diff --git a/source/assets/devtools/query-init-data.png b/docs/source/assets/devtools/query-init-data.png similarity index 100% rename from source/assets/devtools/query-init-data.png rename to docs/source/assets/devtools/query-init-data.png diff --git a/source/assets/devtools/query-init.png b/docs/source/assets/devtools/query-init.png similarity index 100% rename from source/assets/devtools/query-init.png rename to docs/source/assets/devtools/query-init.png diff --git a/source/assets/devtools/query-result.png b/docs/source/assets/devtools/query-result.png similarity index 100% rename from source/assets/devtools/query-result.png rename to docs/source/assets/devtools/query-result.png diff --git a/source/index.md b/docs/source/index.md similarity index 100% rename from source/index.md rename to docs/source/index.md diff --git a/source/logo/large.png b/docs/source/logo/large.png similarity index 100% rename from source/logo/large.png rename to docs/source/logo/large.png diff --git a/source/logo/square.png b/docs/source/logo/square.png similarity index 100% rename from source/logo/square.png rename to docs/source/logo/square.png From d9925f6f2f51db8918fda98dba8656c237856074 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 5 Jul 2016 22:33:39 -0700 Subject: [PATCH 178/409] Add React Native to sidebar --- docs/source/apollo-client/react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 29ba3c76a40..d6273262db1 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -1,5 +1,5 @@ --- -title: React integration +title: React and React Native order: 110 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- From 213ce15d58f61861a54f0bfc06ac2cb20fbd9a80 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 5 Jul 2016 22:34:29 -0700 Subject: [PATCH 179/409] Add callout --- docs/source/apollo-client/react.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index d6273262db1..6423459a9de 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -12,6 +12,8 @@ npm install react-apollo --save [Follow apollostack/react-apollo on GitHub.](https://github.com/apollostack/react-apollo) +Note: You don't have to do anything special to get Apollo Client to work in React Native, just install and import it as usual. +

ApolloProvider

Injects an ApolloClient instance into a React view tree. From 25681adfbafff1241b92354fc4c4988578779b34 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Thu, 7 Jul 2016 00:41:38 +0200 Subject: [PATCH 180/409] Update link of GitHunt-Angular2 (#136) --- docs/source/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index 810b076b53f..94b15b33072 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -29,7 +29,7 @@ We have put together some basic example apps using various parts of Apollo; chec ### General JS Examples - [Githunt - A full-stack Apollo Client and Server example app that uses React, Webpack, Babel, and Redux](https://github.com/apollostack/GitHunt) -- [Githunt written in Angular 2](https://github.com/kamilkisiela/GitHunt-angular2) +- [Githunt written in Angular 2](https://github.com/apollostack/GitHunt-angular2) - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - [A simple GraphQL blog that uses Feathersjs for managing database services](https://github.com/swarthout/feathers-apollo) From e82c916753239a5c8b21895d90dc59037bf71772 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Thu, 7 Jul 2016 14:09:28 -0700 Subject: [PATCH 181/409] rename apollo-server to graphql-tools --- docs/_config.yml | 20 +++++++++--------- docs/source/apollo-server/index.md | 14 ------------ .../connectors.md | 0 .../errors.md | 0 .../generate-schema.md | 0 .../graphiql-test.png | Bin .../{apollo-server => graphql-tools}/guide.md | 0 docs/source/graphql-tools/index.md | 14 ++++++++++++ .../mocking.md | 0 .../resolvers.md | 0 .../scalars.md | 0 .../{apollo-server => graphql-tools}/tools.md | 0 12 files changed, 24 insertions(+), 24 deletions(-) delete mode 100644 docs/source/apollo-server/index.md rename docs/source/{apollo-server => graphql-tools}/connectors.md (100%) rename docs/source/{apollo-server => graphql-tools}/errors.md (100%) rename docs/source/{apollo-server => graphql-tools}/generate-schema.md (100%) rename docs/source/{apollo-server => graphql-tools}/graphiql-test.png (100%) rename docs/source/{apollo-server => graphql-tools}/guide.md (100%) create mode 100644 docs/source/graphql-tools/index.md rename docs/source/{apollo-server => graphql-tools}/mocking.md (100%) rename docs/source/{apollo-server => graphql-tools}/resolvers.md (100%) rename docs/source/{apollo-server => graphql-tools}/scalars.md (100%) rename docs/source/{apollo-server => graphql-tools}/tools.md (100%) diff --git a/docs/_config.yml b/docs/_config.yml index 774d69dbadd..12e2a8d06a2 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -24,16 +24,16 @@ sidebar_categories: - apollo-client/network - apollo-client/devtools - apollo-client/how-it-works - Apollo Server: - - apollo-server/index - - apollo-server/guide - - apollo-server/tools - - apollo-server/generate-schema - - apollo-server/resolvers - - apollo-server/scalars - - apollo-server/mocking - - apollo-server/connectors - - apollo-server/errors + GraphQL Tools: + - graphql-tools/index + - graphql-tools/guide + - graphql-tools/tools + - graphql-tools/generate-schema + - graphql-tools/resolvers + - graphql-tools/scalars + - graphql-tools/mocking + - graphql-tools/connectors + - graphql-tools/errors github_repo: apollostack/docs content_root: source logo: diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md deleted file mode 100644 index 67e0b53ffc9..00000000000 --- a/docs/source/apollo-server/index.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Overview -order: 201 -description: How to install the Apollo GraphQL server tools. ---- - -Apollo Server is an npm package and an opinionated guide for how to build a GraphQL server in JavaScript. - - -```txt -npm install apollo-server -``` - -Apollo Server bundles a set of functions from the `graphql-tools` package, which are not just useful for building servers, but can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. diff --git a/docs/source/apollo-server/connectors.md b/docs/source/graphql-tools/connectors.md similarity index 100% rename from docs/source/apollo-server/connectors.md rename to docs/source/graphql-tools/connectors.md diff --git a/docs/source/apollo-server/errors.md b/docs/source/graphql-tools/errors.md similarity index 100% rename from docs/source/apollo-server/errors.md rename to docs/source/graphql-tools/errors.md diff --git a/docs/source/apollo-server/generate-schema.md b/docs/source/graphql-tools/generate-schema.md similarity index 100% rename from docs/source/apollo-server/generate-schema.md rename to docs/source/graphql-tools/generate-schema.md diff --git a/docs/source/apollo-server/graphiql-test.png b/docs/source/graphql-tools/graphiql-test.png similarity index 100% rename from docs/source/apollo-server/graphiql-test.png rename to docs/source/graphql-tools/graphiql-test.png diff --git a/docs/source/apollo-server/guide.md b/docs/source/graphql-tools/guide.md similarity index 100% rename from docs/source/apollo-server/guide.md rename to docs/source/graphql-tools/guide.md diff --git a/docs/source/graphql-tools/index.md b/docs/source/graphql-tools/index.md new file mode 100644 index 00000000000..707523977d4 --- /dev/null +++ b/docs/source/graphql-tools/index.md @@ -0,0 +1,14 @@ +--- +title: Overview +order: 201 +description: How to install GraphQL Tools. +--- + +GraphQL Tools is an npm package and an opinionated guide for how to build a GraphQL server in JavaScript. + + +```txt +npm install graphql-tools +``` + +Functions in the `graphql-tools` package are not just useful for building servers, but can also be used in the browser, for example to mock a backend during development or testing. Even though our guide recommends a specific way of building GraphQL servers, you can use these tools even if you don't follow our guide; they work with any GraphQL-JS schema, and each tool can be useful on its own. diff --git a/docs/source/apollo-server/mocking.md b/docs/source/graphql-tools/mocking.md similarity index 100% rename from docs/source/apollo-server/mocking.md rename to docs/source/graphql-tools/mocking.md diff --git a/docs/source/apollo-server/resolvers.md b/docs/source/graphql-tools/resolvers.md similarity index 100% rename from docs/source/apollo-server/resolvers.md rename to docs/source/graphql-tools/resolvers.md diff --git a/docs/source/apollo-server/scalars.md b/docs/source/graphql-tools/scalars.md similarity index 100% rename from docs/source/apollo-server/scalars.md rename to docs/source/graphql-tools/scalars.md diff --git a/docs/source/apollo-server/tools.md b/docs/source/graphql-tools/tools.md similarity index 100% rename from docs/source/apollo-server/tools.md rename to docs/source/graphql-tools/tools.md From f1e906f6a549b6ef6ad5d4e9c6dfe596d4c0f5f6 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Thu, 7 Jul 2016 14:20:38 -0700 Subject: [PATCH 182/409] turn off highlighting to make error go away --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 12e2a8d06a2..a4eef53ce72 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -77,7 +77,7 @@ post_asset_folder: false relative_link: false future: true highlight: - enable: true + enable: false line_number: true auto_detect: true tab_replace: From fd6489c41fdeefe7b76c52435d2ba36239e50d46 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Thu, 7 Jul 2016 14:24:56 -0700 Subject: [PATCH 183/409] Revert "turn off highlighting to make error go away" This reverts commit c1d326842850e25064f7df82d2e23260887664e2. --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index a4eef53ce72..12e2a8d06a2 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -77,7 +77,7 @@ post_asset_folder: false relative_link: false future: true highlight: - enable: false + enable: true line_number: true auto_detect: true tab_replace: From 261e47404f87f6a9485e2f157bdd3edb218e933f Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Thu, 7 Jul 2016 14:40:26 -0700 Subject: [PATCH 184/409] add section for apollo server --- docs/_config.yml | 6 ++++-- docs/source/apollo-server/index.md | 18 ++++++++++++++++++ docs/source/graphql-tools/generate-schema.md | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 docs/source/apollo-server/index.md diff --git a/docs/_config.yml b/docs/_config.yml index 12e2a8d06a2..66cc74ff5a5 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -24,10 +24,12 @@ sidebar_categories: - apollo-client/network - apollo-client/devtools - apollo-client/how-it-works + Apollo Server: + -apollo-server/index GraphQL Tools: - graphql-tools/index - - graphql-tools/guide - - graphql-tools/tools +# - graphql-tools/guide +# - graphql-tools/tools - graphql-tools/generate-schema - graphql-tools/resolvers - graphql-tools/scalars diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md new file mode 100644 index 00000000000..bc56f6f5233 --- /dev/null +++ b/docs/source/apollo-server/index.md @@ -0,0 +1,18 @@ +--- +title: Installing +order: 301 +description: How to install Apollo Server +--- + +Apollo Server is a GraphQL server for Node.js built to be run in production. It has integrations for Express, HAPI and Koa. + + +```txt +npm install apollo-server +``` + +Apollo Server comes with a set of features that make it ideal for running in production: +- Simple external interface: reduces potential attack surface by only allowing one request format +- Separation of concerns: reduces complexity (eg. by serving GraphiQL on a separate path) +- Query batching: makes the server more performant by reducing roundtrips +- Query whitelisting: increases security, reduces bandwidth, saves parsing and validation time diff --git a/docs/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md index dedc548c28f..2a816e5db72 100644 --- a/docs/source/graphql-tools/generate-schema.md +++ b/docs/source/graphql-tools/generate-schema.md @@ -1,5 +1,5 @@ --- -title: GraphQL type language +title: Generating a schema order: 204 description: Generate a GraphQL schema from the concise type definition language. --- From b7039c419717e13d29d3fb1728ab682e0878c8ca Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Thu, 7 Jul 2016 14:45:37 -0700 Subject: [PATCH 185/409] fix typo that broke hexo --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 66cc74ff5a5..09bb090e344 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -25,7 +25,7 @@ sidebar_categories: - apollo-client/devtools - apollo-client/how-it-works Apollo Server: - -apollo-server/index + - apollo-server/index GraphQL Tools: - graphql-tools/index # - graphql-tools/guide From f029d4781a09c1c49f5c94035dc082f25407bc08 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Thu, 7 Jul 2016 17:34:57 -0700 Subject: [PATCH 186/409] add new apollo-server content --- docs/_config.yml | 3 + docs/source/apollo-server/graphiql.md | 31 +++++++ docs/source/apollo-server/migration.md | 99 +++++++++++++++++++++++ docs/source/apollo-server/setup.md | 108 +++++++++++++++++++++++++ 4 files changed, 241 insertions(+) create mode 100644 docs/source/apollo-server/graphiql.md create mode 100644 docs/source/apollo-server/migration.md create mode 100644 docs/source/apollo-server/setup.md diff --git a/docs/_config.yml b/docs/_config.yml index 09bb090e344..5b2ab51d7b7 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -26,6 +26,9 @@ sidebar_categories: - apollo-client/how-it-works Apollo Server: - apollo-server/index + - apollo-server/setup + - apollo-server/graphiql + - apollo-server/migration GraphQL Tools: - graphql-tools/index # - graphql-tools/guide diff --git a/docs/source/apollo-server/graphiql.md b/docs/source/apollo-server/graphiql.md new file mode 100644 index 00000000000..4238fbf05b4 --- /dev/null +++ b/docs/source/apollo-server/graphiql.md @@ -0,0 +1,31 @@ +--- +title: GraphiQL +order: 303 +description: How to set up GraphiQL with Apollo Server +--- + +Apollo Server allows you to easily use [GraphiQL](https://github.com/graphql/graphiql). If you are using Express, it can be configured as follows: + +```js +import { graphiqlExpress } from 'apollo-server'; + +app.use('/graphiql', graphiqlExpress({ + endpointURL: '/graphql', +})); +``` + +`graphiqlExpress` accepts the following arguments: + +```js +graphiqlExpress({ + endpointUrl: String, // URL for the GraphQL endpoint this instance of GraphiQL serves + query?: String, // optional query to pre-populate the GraphiQL UI with + operationName?: String, // optional operationName to pre-populate the GraphiQL UI with + variables?: Object, // optional variables to pre-populate the GraphiQL UI with + result?: Object, // optional result to pre-populate the GraphiQL UI with +}) +``` + +`graphiqlExpress` does not run any query passed to it, it simply renders it in the UI. +To actually execute the query, the user must submit it via the GraphiQL UI, which will +send the request to the GraphQL endpoint specified with `endpointURL`. diff --git a/docs/source/apollo-server/migration.md b/docs/source/apollo-server/migration.md new file mode 100644 index 00000000000..156f7e9aaba --- /dev/null +++ b/docs/source/apollo-server/migration.md @@ -0,0 +1,99 @@ +--- +title: Migrating from v0.1 +order: 304 +description: How to migrate from an older version of Apollo Server +--- + +Version 0.2.0 of Apollo Server contains several breaking changes in the API. +The most notable changes are: + +- the `apolloServer` function no longer exists and was replaced with `apolloExpress`. +- `apolloExpress` no longer accepts shorthand type definitions +- `apolloExpress` doesn't have the `resolvers`, `mocks` and `connectors` options. +- `apolloExpress` doesn't include GraphiQL any more +- Apollo Server no longer accepts GET requests or parameters in the URL +- `apolloExpress` no longer parses the HTTP body automatically + + +In order to make updating from an older version of Apollo Server easier, this guide +shows how to use `graphql-tools` together with `apolloExpress` and `graphiqlExpress` to +replace `apolloServer`. + +The three main differences between the old and the new approach are: +1. generating the schema is now done with `graphql-tools`, Apollo Server only uses the finished schema. +2. `bodyParser` has to be used to parse requests before passing them to `expressApollo` +3. GraphiQL now has to be served on a separate path + +The following code snippet in Apollo Server 0.1.x + +```js +import express from 'express'; +import { apolloServer } from 'apollo-server'; +import Schema from './data/schema'; +import Mocks from './data/mocks'; +import Resolvers from './data/resolvers'; +import Connectors from './data/connectors'; + +const GRAPHQL_PORT = 8080; + +const graphQLServer = express(); + +graphQLServer.use('/graphql', apolloServer({ + graphiql: true, + schema: Schema, + resolvers: Resolvers, + connectors: Connectors, + mocks: Mocks, +})); + +graphQLServer.listen(GRAPHQL_PORT, () => console.log( + `GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}/graphql` +)); +``` + +... should be written as follows in Apollo Server 0.2.x and above: + + +```js +import express from 'express'; + +import Schema from './data/schema'; +import Mocks from './data/mocks'; +import Resolvers from './data/resolvers'; +import Connectors from './data/connectors'; + +// NEW or changed imports: +import { apolloExpress, graphiqlExpress } from 'apollo-server'; +import { makeExecutableSchema, addMockFunctionsToSchema } from 'graphql-tools'; +import bodyParser from 'body-parser'; + + + +const GRAPHQL_PORT = 8080; + +const graphQLServer = express(); + +const executableSchema = makeExecutableSchema({ + typeDefs: Schema, + resolvers: Resolvers, + connectors: Connectors, +}); + +addMockFunctionsToSchema({ + schema: executableSchema, + mocks: Mocks, + preserveResolvers: true, +}); + +graphQLServer.use('/graphql', bodyParser.json(), apolloExpress({ + schema: executableSchema, +})); + +graphqlServer.use('/graphiql', graphiqlExpress({ + endpointURL: '/graphql', +})); + +graphQLServer.listen(GRAPHQL_PORT, () => console.log( + `GraphQL Server is now running on http://localhost:${GRAPHQL_PORT}/graphql` +)); +``` diff --git a/docs/source/apollo-server/setup.md b/docs/source/apollo-server/setup.md new file mode 100644 index 00000000000..503393e5933 --- /dev/null +++ b/docs/source/apollo-server/setup.md @@ -0,0 +1,108 @@ +--- +title: Setup +order: 302 +description: How to set up Apollo Server +--- + +Apollo Server exports `apolloExpress`, which can be used as a drop-in Express middleware to turn your server into a GraphQL server. + +

ApolloExpress(options)

+ +```js +import { apolloExpress } from 'apollo-server'; + +var app = express(); + +app.use('/graphql', bodyParser.json(), apolloExpress({ schema: myGraphQLSchema})); +``` + +The `options` may be either: +- an ApolloOptions object object with the parameters specified below +- a function that, given an Express [`request`](http://expressjs.com/en/4x/api.html#req), returns an ApolloOptions object +- a function that, given an Express [`request`](http://expressjs.com/en/4x/api.html#req), returns a promise for an ApolloOptions object + +```js +// options object +apolloExpress({ + schema: GraphQLSchema, + context?: any, // value to be used as context in resolvers + rootValue?: any, + formatError?: Function, // function used to format errors before returning them to clients + validationRules?: Array, // additional validation rules to be applied to client-specified queries + logFunction?: Function, // function called for logging errors and info + formatParams?: Function, // function applied for each query in a batch to format parameters before passing them to `runQuery` + formatResponse?: Function, // function applied to each response before returning data to clients +}) + +// example options function +apolloExpress(request => ({ + schema: typeDefinitionArray, + context: { user: request.session.user } +})) +``` + +

Sending Requests

+ +ApolloExpress accepts only JSON-encoded POST requests. A valid request must contain eiter a `query` or an `operationName`, and may include `variables.` For example: + +```js +{ + "query": "query aTest{ test(who: $arg1) }", + "operationName": "aTest", + "variables": { "arg1": "me" } +} +``` + +Variables can be an object or a JSON-encoded string. I.e. the following is equivalent to the previous query: + +```js +{ + "query": "query aTest{ test(who: $arg1) }", + "operationName": "aTest", + "variables": "{ \"arg1\": \"me\" }" +} +``` + +A batch of queries can be sent by simply sending a JSON-encoded array of queries, e.g. + +```js +[ + { "query": "{ testString }" }, + { "query": "query q2{ test(who: \"you\" ) }" } +] +``` + +If a batch of queries is sent, the response will be an array of GraphQL responses. + +

CORS support

+ +If Apollo Server runs under a different origin than the frontend app, then CORS support must be configured on the server. For example, if apollo server is running under `graphql.example.com` and the website is served from `www.example.com`, CORS needs to be configured in the express app. [CORS](https://github.com/expressjs/cors) is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options. + +```javascript +import { apolloExpress } from 'apollo-server'; +import cors from 'cors'; + +var app = express().use('*', cors());; +``` + +Ensure you have npm installed cors. The * value allows access from any third-party site. It should probably be updated to reflect your specific environment. Simple usage details to [Enable All CORS Requests](https://github.com/expressjs/cors#simple-usage-enable-all-cors-requests) More complex configuration options are available including the ability to [Enable CORS for a Single Route](https://github.com/expressjs/cors#enable-cors-for-a-single-route). + +The information contained in the apolloClient re: CORS configuration did not effect on the server. + +

Authentication Tokens

+ +Authentication tokens sent from the client can be retrieved, processed, and then passed into context to be accessed by resolvers like so: +```javascript +app.use('/graphql', apolloExpress(async (req) => { + // Retrieve token from authorization header and lookup user in DB + const user = await models.mongoose.users.fromToken(req.headers.authorization); + + return { + context: { + // Attach user data to context + user, + } + } +})); +// ... +``` From c44590304776c646045a2160c68b50ea2b2699dc Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 8 Jul 2016 19:28:18 -0700 Subject: [PATCH 187/409] Reorganize docs to make room for new stuff --- docs/_config.yml | 13 +- docs/source/apollo-client/angular2.md | 2 +- docs/source/apollo-client/devtools.md | 24 ++-- docs/source/apollo-client/fragments.md | 7 + docs/source/apollo-client/how-it-works.md | 2 +- docs/source/apollo-client/index.md | 62 +++++++- docs/source/apollo-client/meteor.md | 3 +- docs/source/apollo-client/mutations.md | 63 ++++++++ docs/source/apollo-client/network.md | 2 +- .../apollo-client/{core.md => queries.md} | 136 ++---------------- docs/source/apollo-client/react.md | 2 +- docs/source/apollo-client/redux.md | 13 +- 12 files changed, 169 insertions(+), 160 deletions(-) create mode 100644 docs/source/apollo-client/fragments.md create mode 100644 docs/source/apollo-client/mutations.md rename docs/source/apollo-client/{core.md => queries.md} (62%) diff --git a/docs/_config.yml b/docs/_config.yml index 774d69dbadd..a9973a695b9 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -14,16 +14,19 @@ versions: sidebar_categories: null: - index - Apollo Client: + Apollo Client Core: - apollo-client/index - - apollo-client/core + - apollo-client/queries + - apollo-client/mutations + - apollo-client/fragments + - apollo-client/network + - apollo-client/devtools + - apollo-client/how-it-works + Apollo Client Integrations: - apollo-client/react - apollo-client/angular2 - apollo-client/meteor - apollo-client/redux - - apollo-client/network - - apollo-client/devtools - - apollo-client/how-it-works Apollo Server: - apollo-server/index - apollo-server/guide diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index 6f752db862d..e46fc9cf40b 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -1,6 +1,6 @@ --- title: Angular 2.0 integration -order: 111 +order: 151 description: How to use the Apollo Client to fetch GraphQL data in your Angular 2.0 application. --- diff --git a/docs/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md index e9f7e277236..37e97f1e69d 100644 --- a/docs/source/apollo-client/devtools.md +++ b/docs/source/apollo-client/devtools.md @@ -1,6 +1,6 @@ --- title: Developer tools -order: 142 +order: 111 description: How to use extensions and developer tools to get insight into what your app is doing. --- @@ -20,18 +20,18 @@ To get started with Redux DevTools, click the DevTools icon in your chrome brows * Lets you go back in time by “cancelling” action. * If the change in Apollo's `apolloReducer` throws, you will see which action caused this to happen, and what the error was. -### Lifecycles +### Lifecycles Redux Store's can be created with initial states. At the top of your DevTools you should see an action for `@@INIT`. The `@@INIT` action is responsible for calling `combineReducers` which bootstraps our store with 3 special state keys: -* `queries` +* `queries` * `mutations` * `data` -Along with these keys, any non-apollo reducer will have the same behavior as they do in vanilla Redux today. +Along with these keys, any non-apollo reducer will have the same behavior as they do in vanilla Redux today. As you interact with your application, the GraphQL server will resolve queries and mutations from the client. We utilize Redux to manage the state change our application goes through as we issue queries and mutations from the client. - + ### Queries When a query is sent to your GraphQL server, Apollo dispatches an action to the Redux Store of type `APOLLO_QUERY_INIT`. @@ -48,12 +48,12 @@ When a query is sent to your GraphQL server, Apollo dispatches an action to the } ``` -Taking a closer look at the metadata that comes with a `APOLLO_QUERY_INIT` action, we see that `APOLLO_QUERY_INIT` sends over `queryId`, `queryString`, and `query`. The action takes these pieces of metadata and adds it to the Redux store. These properties can now be found saved in Redux. +Taking a closer look at the metadata that comes with a `APOLLO_QUERY_INIT` action, we see that `APOLLO_QUERY_INIT` sends over `queryId`, `queryString`, and `query`. The action takes these pieces of metadata and adds it to the Redux store. These properties can now be found saved in Redux. The beauty of these state changes is the management for data "readyness". When the Store dispatches `APOLLO_QUERY_INIT`, the particular query we are trying to resolve will have this structure: ![QUERY_INIT_DATA](../assets/devtools/query-init-data.png) -* The keys `loading` to manage our data "readyness", +* The keys `loading` to manage our data "readyness", * `networkError` and `graphQLErrors` to have complete visibility of errors to the end user. When a query is executed and data has been resolved, the Store dispatches `APOLLO_QUERY_RESULT`. @@ -74,7 +74,7 @@ When a query is executed and data has been resolved, the Store dispatches `APOLL returnPartialData: false, queryId: "0" lastRequestId: 1 - + } } } @@ -82,7 +82,7 @@ When a query is executed and data has been resolved, the Store dispatches `APOLL } ``` -When the Store gets a `APOLLO_QUERY_RESULT`, a couple pieces of state change. First our query is no longer `loading`, so we can see that state has updated in oure Store. Next we see that the `data` property is hyrdated with the data resolved by our query. From here you can use one of the Frontend integrations to bind the data from `APOLLO_QUERY_RESULT` to your UI Components. +When the Store gets a `APOLLO_QUERY_RESULT`, a couple pieces of state change. First our query is no longer `loading`, so we can see that state has updated in oure Store. Next we see that the `data` property is hyrdated with the data resolved by our query. From here you can use one of the Frontend integrations to bind the data from `APOLLO_QUERY_RESULT` to your UI Components. ### Mutations @@ -102,13 +102,13 @@ When a mutation is sent to your GraphQL server, Apollo dispatches an action to t } ``` -Here we can see the `selection set` of our mutation and the variables used in the mutation. +Here we can see the `selection set` of our mutation and the variables used in the mutation. -When a mutation has been resolved, the Store dispatches `APOLLO_MUTATION_RESULT`. +When a mutation has been resolved, the Store dispatches `APOLLO_MUTATION_RESULT`. ![MUTATION_RESULT](../assets/devtools/mutation-result.png) -* The keys `loading` to manage our mutation "readyness" +* The keys `loading` to manage our mutation "readyness" * `error` to have complete visibility of errors to the end user. ```js diff --git a/docs/source/apollo-client/fragments.md b/docs/source/apollo-client/fragments.md new file mode 100644 index 00000000000..dd306a2eb03 --- /dev/null +++ b/docs/source/apollo-client/fragments.md @@ -0,0 +1,7 @@ +--- +title: Fragments +order: 104 +description: How to compose your queries and mutations from fragments with Apollo Client. +--- + +(Coming soon!) diff --git a/docs/source/apollo-client/how-it-works.md b/docs/source/apollo-client/how-it-works.md index f32104b0369..b1e23296aa9 100644 --- a/docs/source/apollo-client/how-it-works.md +++ b/docs/source/apollo-client/how-it-works.md @@ -1,6 +1,6 @@ --- title: How it works -order: 143 +order: 120 description: An explanation of Apollo Client internals and query lifecycle --- diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index f1f3b91f90f..0d45fd1aab8 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -22,7 +22,7 @@ The most convenient way to use Apollo Client in your app is through [react-apoll The Apollo Client class is the thing you import from this package, and should be instantiated to communicate with your server. You can instantiate as many clients as you want, but most apps will have exactly one of these. If you want to talk to multiple backends, the right place to do that is in your GraphQL server. -

new ApolloClient(options)

+

new ApolloClient(options)

Instantiate a new Apollo Client. @@ -50,6 +50,54 @@ var ApolloClient = require('apollo-client').default; The rest of the code snippets will use ES2015 import syntax. +

gql query strings

+ +When using Apollo Client, you usually write your queries using multiline template literals. These literals need to be tagged with the `gql` tag, like this: + +```js +import gql from 'graphql-tag'; + +const query = gql` + { + user(id: 5) { + username + } + } +` +``` + +The `gql` tag is a function that parses the query string passed to it. It can be found in the `graphql-tag` companion package on npm. + +As a shortcut, if you prefer *not* to import `gql` tag in every place you use it, you can register it as a global: + +```js +// In the browser +import gql from 'graphql-tag'; +window['gql'] = gql; + +// In node.js +import gql from 'graphql-tag'; +global['gql'] = gql; + +// Now, in any part of your app you can use the gql tag +const query = gql`...`; +``` + +**Note:** ES6 imports are hoisted, which may mean that client code using the `gql` tag gets evaluated before the registration of the global. To avoid race conditions, it's best to just import the tag into each file that uses it. + +

Why use a template literal?

+ +This template literal tag serves two functions: + +1. It parses the query string. +2. It tells developer tools like `eslint-plugin-graphql` which strings in your app are GraphQL queries, so that they can be treated specially. + +Being able to statically analyze GraphQL queries in your app is a huge benefit of GraphQL, so it's correct to write them as special strings that can be found by these tools. + +

Network interfaces

+ +Apollo Client has a pluggable network interface layer, which can let you configure how queries are sent over HTTP, or replace the whole network part with something completely custom, like a websocket transport, mocked server data, or anything else you can imagine. +

createNetworkInterface(url, options)

Create a new HTTP network interface that points to a GraphQL server at a specific URI. @@ -69,7 +117,7 @@ const client = new ApolloClient({ }); ``` -

Middleware

+

Middleware

It is possible to use middleware with the network interface created via `createNetworkInterface`. In order to do so, you must pass an array of objects into the interface created with `createNetworkInterface()`. Each object must contain an `applyMiddleware` method with the following parameters: @@ -140,11 +188,17 @@ const client = new ApolloClient({ Given the above code, the header's `Authorization` value will be that of `token2`. This example shows how you can use more than one middleware to make multiple/separate modifications to the request being processed in the form of a chain. This example doesn't show the use of `localStorage`, but is instead just meant to demonstrate the use of more than one middleware, passed to `.use()` as an array. -

CORS support

+

CORS support

If your GraphQL server and client application are running on different origins, you will get HTTP 405 errors thrown by the client. This happens when receiving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. How to do this is documented in the [apollo-server section](/apollo-server/tools.html#corsSupport). -

Loading Initial Data from Server

+

Fetch polyfill

+ +Apollo uses [fetch](https://fetch.spec.whatwg.org/) behind the scenes to make HTTP requests. Be aware that many browser versions now support the `window.fetch` function natively (check [caniuse.com](http://caniuse.com/#feat=fetch)), but Node, for example, doesn't (as of v6). + +Where it is not supported, you can use one of several popular polyfills, including [whatwg-fetch](https://github.com/github/fetch), [node-fetch](https://github.com/bitinn/node-fetch) or [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch). + +

Store hydration

For applications that support server side rendering, or that can perform some queries on the server prior to rendering the client, ApolloClient allows for setting the initial state of data. This is sometimes called store rehydration for redux applications. diff --git a/docs/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md index acd101ee84e..01263a5b116 100644 --- a/docs/source/apollo-client/meteor.md +++ b/docs/source/apollo-client/meteor.md @@ -1,6 +1,6 @@ --- title: Meteor integration -order: 112 +order: 152 description: Specifics about using Apollo in your Meteor application. --- @@ -95,4 +95,3 @@ Returns an [`options` object](http://0.0.0.0:4000/apollo-client/index.html#Apoll - `maxAccountsCacheSizeInMB`: User account ids are cached in memory to reduce the response latency on multiple requests from the same user. Default: `1`. It will use the same port as your Meteor server. Don't put a route or static asset at the same path as the Apollo server (default is `/graphql`). - diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md new file mode 100644 index 00000000000..f4ef5498b56 --- /dev/null +++ b/docs/source/apollo-client/mutations.md @@ -0,0 +1,63 @@ +--- +title: Mutations +order: 103 +description: How to run mutations to modify data with Apollo Client. +--- + +In addition to fetching data using queries, the Apollo Client also handles GraphQL mutations. Current support for mutations is relatively basic, just letting you send a mutation and then incorporate the result into the store. + +

ApolloClient#mutate(options)

+ +Send a mutation to the server and get the result. The result is also incorporated into the store, updating any queries registered with `watchQuery` that are interested in the changed objects. Returns a promise that resolves to a GraphQLResult. + +- `mutation: string` The mutation to send to the server. +- `variables: Object` The variables to send along with the mutation. + +Here's how you would call a mutation and pass in arguments via variables: + +```js +import ApolloClient from 'apollo-client'; + +const client = new ApolloClient(); + +client.mutate({ + mutation: gql` + mutation postReply( + $token: String! + $topic_id: ID! + $category_id: ID! + $raw: String! + ) { + createPost( + token: $token + topic_id: $topic_id + category: $category_id + raw: $raw + ) { + id + cooked + } + } + `, + variables: { + token: 'asdf', + topic_id: '123', + category_id: '456', + raw: 'This is the post text.', + } +}).then((graphQLResult) => { + const { errors, data } = graphQLResult; + + if (data) { + console.log('got data', data); + } + + if (errors) { + console.log('got some GraphQL execution errors', errors); + } +}).catch((error) => { + console.log('there was an error sending the query', error); +}); +``` + +Right now, this is a bit verbose because you have to list the names of the variables three times, but we hope to improve this in the future. diff --git a/docs/source/apollo-client/network.md b/docs/source/apollo-client/network.md index d72efdb09c8..be43fcf8c8e 100644 --- a/docs/source/apollo-client/network.md +++ b/docs/source/apollo-client/network.md @@ -1,6 +1,6 @@ --- title: Network layer -order: 141 +order: 110 description: How to point your Apollo client to a different GraphQL server, or use a totally different protocol. --- diff --git a/docs/source/apollo-client/core.md b/docs/source/apollo-client/queries.md similarity index 62% rename from docs/source/apollo-client/core.md rename to docs/source/apollo-client/queries.md index 0c8ebb70bd8..1ed481e4782 100644 --- a/docs/source/apollo-client/core.md +++ b/docs/source/apollo-client/queries.md @@ -1,60 +1,12 @@ --- -title: Client core API -order: 101 -description: How to use the Apollo Client directly, without a view integration. +title: Queries +order: 102 +description: How to run queries to fetch data with Apollo Client. --- -Most of the time, when you use the Apollo Client, you'll do it through one of the view layer integrations. But sometimes, you just want to fetch some data directly and use it in your application logic, or your preferred view technology doesn't have an integration package. - -

gql template literals

- -When using Apollo Client, you usually write your queries using multiline template literals. These literals need to be tagged with the `gql` tag, like this: - -```js -import gql from 'graphql-tag'; - -const query = gql` - { - user(id: 5) { - username - } - } -` -``` - -The `gql` tag is a function that parses the query string passed to it. It can be found in the `graphql-tag` companion package on npm. - -As a shortcut, if you prefer *not* to import `gql` tag in every place you use it, you can register it as a global: - -```js -// In the browser -import gql from 'graphql-tag'; -window['gql'] = gql; - -// In node.js -import gql from 'graphql-tag'; -global['gql'] = gql; - -// Now, in any part of your app you can use the gql tag -const query = gql`...`; -``` - -**Note:** ES6 imports are hoisted, which may mean that client code using the `gql` tag gets evaluated before the registration of the global. To avoid race conditions, it's best to just import the tag into each file that uses it. - -

Why use a template literal?

- -This template literal tag serves two functions: - -1. It parses the query string. -2. It tells developer tools like `eslint-plugin-graphql` which strings in your app are GraphQL queries, so that they can be treated specially. - -Being able to statically analyze GraphQL queries in your app is a huge benefit of GraphQL, so it's correct to write them as special strings that can be found by these tools. - -

Queries

- The primary function of the Apollo Client is running GraphQL queries to retrieve data from the server. There are two ways to get data: running a query once and getting a single result, and running a query then watching the result via a callback. -

`query` vs. `watchQuery`

+

`query` vs. `watchQuery`

If you want to fetch some data to perform a one-time operation, then `query` is the right way to go. If you are using the query result to render some UI, it's advantageous to use `watchQuery`, since that will automatically update whenever any of the following things happen: @@ -66,7 +18,7 @@ This means that using `watchQuery` will keep your UI consistent, so that every q Currently `watchQuery` allows reactivity via the optional `pollInterval` argument. In the future, `watchQuery` will also have more options for reactivity, like connecting to a source of invalidations for reactive re-fetching, or accepting pushed data from the server for low-latency updates. Using it now will allow you to easily switch those options on when they become available. -

query diffing and forceFetch

+

Query result caching

The Apollo Client doesn't just directly send your GraphQL queries to the server. It does a lot of pre-and-post processing of the data. One of the main things it does is _query diffing_, which means comparing a query you're about to fetch with the data the client fetched previously, and sending a new query that fetches only the necessary data. @@ -118,11 +70,11 @@ You can take advantage of this feature to reduce the amount of data your app is We are always going to be improving the efficiency of the query diffing algorithm. Right now, it just does basic operations, but in the future it will be able to fetch single missing objects, and diff deeply nested queries. Follow along on the GitHub repository to find out when these features are coming. -

Using forceFetch

+

Using forceFetch

Of course, you don't always want to use the existing data in the store - sometimes you want to get the new data directly from the server even though you already have it on the client. In this case, you should pass the `forceFetch` option to `query` or `watchQuery`, as documented below. -

ApolloClient#query(options)

+

ApolloClient#query(options)

Run a GraphQL query and return a promise that resolves to a `GraphQLResult`. @@ -168,7 +120,7 @@ client.query({ }); ``` -

ApolloClient#watchQuery(options)

+

ApolloClient#watchQuery(options)

Run a GraphQL query and return a QueryObservable that is updated as the query result in the store changes. @@ -178,20 +130,20 @@ Run a GraphQL query and return a QueryObservable that is updated as the query re - `returnPartialData: boolean` (Optional, default is `false`) If false, wait until the query has finished the initial load from the server to return any data. If true, return any data we might happen to already have in the store immediately. If you pass true for this option, your UI should be ready to deal with the possibility that it will get a partial result at first. - `pollInterval: number` (Optional, default is no polling). Setting a polling interval (in ms) will refetch your query from the server (forceFetch) on the interval rate provided by the key. -

QueryObservable

+

QueryObservable

This is the object you get when you call `watchQuery`. It has just one method, `subscribe`, to which you can pass a `QueryObserver` object: - `subscribe(observer: QueryObserver)` Pass an observer object which gets called when there is new data. Returns a `QuerySubscription` object which you can use to unsubscribe or refetch. -

interface QueryObserver

+

interface QueryObserver

The object you pass into `QueryObservable#subscribe`. Includes optional callbacks to receive results: - `next(result: GraphQLResult)` Called when there is a new result for the query. - `error(error: Error)` Called when there is a network error for the query. -

QuerySubscription

+

QuerySubscription

The object returned from `QueryObservable#subscribe`. Includes four methods: @@ -251,69 +203,3 @@ subscription.startPolling(100); // Call when we're done watching this query subscription.unsubscribe(); ``` - -## Mutations - -In addition to fetching data using queries, the Apollo Client also handles GraphQL mutations. Current support for mutations is relatively basic, just letting you send a mutation and then incorporate the result into the store. - -

ApolloClient#mutate(options)

- -Send a mutation to the server and get the result. The result is also incorporated into the store, updating any queries registered with `watchQuery` that are interested in the changed objects. Returns a promise that resolves to a GraphQLResult. - -- `mutation: string` The mutation to send to the server. -- `variables: Object` The variables to send along with the mutation. - -Here's how you would call a mutation and pass in arguments via variables: - -```js -import ApolloClient from 'apollo-client'; - -const client = new ApolloClient(); - -client.mutate({ - mutation: gql` - mutation postReply( - $token: String! - $topic_id: ID! - $category_id: ID! - $raw: String! - ) { - createPost( - token: $token - topic_id: $topic_id - category: $category_id - raw: $raw - ) { - id - cooked - } - } - `, - variables: { - token: 'asdf', - topic_id: '123', - category_id: '456', - raw: 'This is the post text.', - } -}).then((graphQLResult) => { - const { errors, data } = graphQLResult; - - if (data) { - console.log('got data', data); - } - - if (errors) { - console.log('got some GraphQL execution errors', errors); - } -}).catch((error) => { - console.log('there was an error sending the query', error); -}); -``` - -Right now, this is a bit verbose because you have to list the names of the variables three times, but we hope to improve this in the future. - -

Fetch Polyfill

- -Apollo uses [fetch](https://fetch.spec.whatwg.org/) behind the scenes to make HTTP requests. Be aware that many browser versions now support the `window.fetch` function natively (check [caniuse.com](http://caniuse.com/#feat=fetch)), but Node, for example, doesn't (as of v6). - -Where it is not supported, you can use one of several popular polyfills, including [whatwg-fetch](https://github.com/github/fetch), [node-fetch](https://github.com/bitinn/node-fetch) or [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch). diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 6423459a9de..52f4eb3c594 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -1,6 +1,6 @@ --- title: React and React Native -order: 110 +order: 150 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- diff --git a/docs/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md index 5fff6c8d6fa..a0348a69c40 100644 --- a/docs/source/apollo-client/redux.md +++ b/docs/source/apollo-client/redux.md @@ -1,6 +1,6 @@ --- title: Redux integration -order: 130 +order: 153 description: How to integrate Apollo Client into your existing Redux store. --- @@ -80,12 +80,12 @@ The `react-apollo` integration package is a drop-in replacement for `react-redux

Async Actions with thunk

In Redux, we handle asynchronity via the `thunk` middleware. This allows you to dispatch a function, instead of an Action Object. To integrate `thunk` into your workflow, follow the steps below: - + 1. Install `redux-thunk` from npm. 2. Include the middleware into your store initiation. ```js -import ReduxThunk from 'redux-thunk' +import ReduxThunk from 'redux-thunk' const client = new ApolloClient({ reduxRootKey: 'myDifferentKey', @@ -102,12 +102,12 @@ const store = createStore( ``` -Great! Now your store can dispatch functions. This will allow you to write more complex Action Creators. +Great! Now your store can dispatch functions. This will allow you to write more complex Action Creators. Since 2.1.0, `Redux Thunk` supports injecting a custom argument using the withExtraArgument function. It is recommended we attach the `ApolloClient` into our middleware. This will allow you to have reference to `dispatch`, `getState`, and the `ApolloClient`: ```js -import ReduxThunk from 'redux-thunk' +import ReduxThunk from 'redux-thunk' const client = new ApolloClient({ reduxRootKey: 'myDifferentKey', @@ -196,6 +196,3 @@ function CounterButton({ dispatch }) { export default connect()(CounterButton); ``` - - - From e33dd24270a9568a6ed3c6b1daf1b33b9e99a7bf Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 8 Jul 2016 19:40:18 -0700 Subject: [PATCH 188/409] v0 --- docs/source/apollo-client/fragments.md | 78 +++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-client/fragments.md b/docs/source/apollo-client/fragments.md index dd306a2eb03..0942026229e 100644 --- a/docs/source/apollo-client/fragments.md +++ b/docs/source/apollo-client/fragments.md @@ -4,4 +4,80 @@ order: 104 description: How to compose your queries and mutations from fragments with Apollo Client. --- -(Coming soon!) +Apollo Client supports composition of queries and mutations using named fragments. For example, if you have several UI components and each defines a fragment that it must fetch in order to render itself, a root UI component can compose a single query that references each of those fragments. This single query is then fetched from the server and will return the data requested by each of the fragments. This alows you to get the data needed to render all of those UI components in a single request to your GraphQL server. + +

Creating fragments

+ +Fragments can be defined anywhere in your application code where you need a reusable bit of a GraphQL query. + +

createFragment

+ +To create a fragment, you can use the `createFragment` function which can be imported from the `apollo-client` package like so: + +``` +import { createFragment } from 'apollo-client' +``` + +This function takes the following arguments: + +- `doc: Document`: A GraphQL document defined with a `gql` template literal, just like a query. This can contain one or more fragment definitions. +- `fragments: FragmentDefinition[]` (Optional): A list of fragments that are used in the document, so that you can pass around a fragment and any of its dependencies as one unit. + +The method `createFragment` returns an array of `FragmentDefinition` objects extracted from `doc`. This array can be passed to the `query`, `watchQuery` or `mutate` methods on Apollo Client, allowing the GraphQL query or mutation to reference these fragments. + +

Example with fragments

+ +Say we need to fetch a list of authors' names in one UI component and fetch the cities they live in from another UI component. + +```javascript +client.query({ query: gql` + query { + author { + firstName + lastName + } + }`, +}); + +client.query({query: gql` + query { + author { + city + } + }`, +}) + +``` + +Instead of firing those two queries separately, we can define the data that they request as fragments and register them with Apollo Client. Then, we can compose a single query that uses these fragments and fire that instead. We can do that with `createFragment`: + +```javascript +import { createFragment } from 'apollo-client'; + +const fragmentDefs = createFragment(gql` + fragment authorNames on Author { + firstName + lastName + } + + fragment authorCities on Author { + city + } +`); + +client.query({ query: gql` + query { + author { + ...authorNames + ...authorCities + } + } + `, +}, fragmentDefs); +``` + +By doing this, we're no longer firing two queries. Instead, we're only firing one query which will get us all the data that we need. So, query composition through named fragments benefits you by reducing the number of roundtrips you make to the server. Query composition through fragments is often useful when we you want to load nested data, refetch the same data in a mutation and a query or if a UI component defines its own fields. + +

Unique fragment names

+ +For query composition through fragments to work, Apollo Client requires unique fragment names across your application and will warn you if this is not the case. We can use the `createFragment` method to register a fragment for use in queries or mutations. From f8e5e6f1ef4eb57fab40b1dfd16cfb033182c1fc Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 8 Jul 2016 19:43:30 -0700 Subject: [PATCH 189/409] Better explain fragment uniqueness --- docs/source/apollo-client/fragments.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-client/fragments.md b/docs/source/apollo-client/fragments.md index 0942026229e..c2f396a942d 100644 --- a/docs/source/apollo-client/fragments.md +++ b/docs/source/apollo-client/fragments.md @@ -25,7 +25,7 @@ This function takes the following arguments: The method `createFragment` returns an array of `FragmentDefinition` objects extracted from `doc`. This array can be passed to the `query`, `watchQuery` or `mutate` methods on Apollo Client, allowing the GraphQL query or mutation to reference these fragments. -

Example with fragments

+

Using fragments

Say we need to fetch a list of authors' names in one UI component and fetch the cities they live in from another UI component. @@ -78,6 +78,6 @@ client.query({ query: gql` By doing this, we're no longer firing two queries. Instead, we're only firing one query which will get us all the data that we need. So, query composition through named fragments benefits you by reducing the number of roundtrips you make to the server. Query composition through fragments is often useful when we you want to load nested data, refetch the same data in a mutation and a query or if a UI component defines its own fields. -

Unique fragment names

+

Unique fragment names

-For query composition through fragments to work, Apollo Client requires unique fragment names across your application and will warn you if this is not the case. We can use the `createFragment` method to register a fragment for use in queries or mutations. +For better server-side debugging and logging, it's good to have the fragment names in your app be unique. If your fragments have unique names, Apollo Client doesn't have to generate fragment names for you, which means you can easily see which fragments are appearing in your network logs and server-side debugging tools. Apollo Client checks that fragment names are unique across your application for you, and will warn you if you create two fragments with the same name. From 53f1ee4e99020b96557e6934d748584429e0430c Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 8 Jul 2016 19:54:30 -0700 Subject: [PATCH 190/409] Replace example with a nested data situation --- docs/source/apollo-client/fragments.md | 86 +++++++++++++++----------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/docs/source/apollo-client/fragments.md b/docs/source/apollo-client/fragments.md index c2f396a942d..53cb1690fa8 100644 --- a/docs/source/apollo-client/fragments.md +++ b/docs/source/apollo-client/fragments.md @@ -27,57 +27,69 @@ The method `createFragment` returns an array of `FragmentDefinition` objects ext

Using fragments

-Say we need to fetch a list of authors' names in one UI component and fetch the cities they live in from another UI component. - -```javascript -client.query({ query: gql` - query { - author { - firstName - lastName - } - }`, -}); +Fragments are especially helpful in the case where you have deeply nested UI components, and you want to keep the fields the component needs next to the component code itself. You also want to avoid multiple roundtrips. Imagine the following UI structure: + +```js + + + + + +``` -client.query({query: gql` - query { - author { - city - } - }`, -}) +To render such a UI, without fragments the first intuition might be: +```js +// One query on the Author component to render the list of books +{ + author(id: 5) { + books { + id + } + } +} + +// Another query on the Book component to get book details +{ + book(id: 19) { + name + coverImage + numPages + } +} ``` -Instead of firing those two queries separately, we can define the data that they request as fragments and register them with Apollo Client. Then, we can compose a single query that uses these fragments and fire that instead. We can do that with `createFragment`: +However, this isn't optimal because you have to wait to get the entire list of books before you send any requests to get the details. This means the data will only appear after two roundtrips to the server. It would be much better to instead compose these two queries together into one, and send that in one request. Here's how you could do that: -```javascript +```js import { createFragment } from 'apollo-client'; -const fragmentDefs = createFragment(gql` - fragment authorNames on Author { - firstName - lastName - } - - fragment authorCities on Author { - city +// Save the fragment into a variable +const bookInfoFragment = createFragment(gql` + fragment bookInfo on Book { + name + coverImage + numPages } `); -client.query({ query: gql` - query { - author { - ...authorNames - ...authorCities +// Use the fragment in a query +// Note that we use the fragment name to refer to it, not the variable name from JavaScript. +client.query({ + query: gql` + { + author(id: 5) { + books { + id + ...bookInfo + } + } } - } `, -}, fragmentDefs); + fragments: bookInfoFragment, +}) ``` -By doing this, we're no longer firing two queries. Instead, we're only firing one query which will get us all the data that we need. So, query composition through named fragments benefits you by reducing the number of roundtrips you make to the server. Query composition through fragments is often useful when we you want to load nested data, refetch the same data in a mutation and a query or if a UI component defines its own fields. -

Unique fragment names

For better server-side debugging and logging, it's good to have the fragment names in your app be unique. If your fragments have unique names, Apollo Client doesn't have to generate fragment names for you, which means you can easily see which fragments are appearing in your network logs and server-side debugging tools. Apollo Client checks that fragment names are unique across your application for you, and will warn you if you create two fragments with the same name. From aaaceb9f04733b1426a4b364a5434ed3f7223c8b Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 8 Jul 2016 19:59:55 -0700 Subject: [PATCH 191/409] Add fragments to list of args --- docs/source/apollo-client/mutations.md | 2 ++ docs/source/apollo-client/queries.md | 3 +++ 2 files changed, 5 insertions(+) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index f4ef5498b56..9793faa9790 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -12,6 +12,8 @@ Send a mutation to the server and get the result. The result is also incorporate - `mutation: string` The mutation to send to the server. - `variables: Object` The variables to send along with the mutation. +- `fragments: FragmentDefinition[]` An array of fragment definitions, as returned by `createFragment`. [Learn more on the fragments page.](fragments.html) + Here's how you would call a mutation and pass in arguments via variables: diff --git a/docs/source/apollo-client/queries.md b/docs/source/apollo-client/queries.md index 1ed481e4782..07c4c185a23 100644 --- a/docs/source/apollo-client/queries.md +++ b/docs/source/apollo-client/queries.md @@ -81,6 +81,7 @@ Run a GraphQL query and return a promise that resolves to a `GraphQLResult`. - `query: string` A GraphQL query string to fetch. - `variables: Object` The variables to pass along with the query. - `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. +- `fragments: FragmentDefinition[]` An array of fragment definitions, as returned by `createFragment`. [Learn more on the fragments page.](fragments.html) Here's how you would run a single query and get the result: @@ -129,6 +130,8 @@ Run a GraphQL query and return a QueryObservable that is updated as the query re - `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. - `returnPartialData: boolean` (Optional, default is `false`) If false, wait until the query has finished the initial load from the server to return any data. If true, return any data we might happen to already have in the store immediately. If you pass true for this option, your UI should be ready to deal with the possibility that it will get a partial result at first. - `pollInterval: number` (Optional, default is no polling). Setting a polling interval (in ms) will refetch your query from the server (forceFetch) on the interval rate provided by the key. +- `fragments: FragmentDefinition[]` An array of fragment definitions, as returned by `createFragment`. [Learn more on the fragments page.](fragments.html) +

QueryObservable

From 1fcd33d971bb7b5fb651e5a94765e725379e6ab6 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 8 Jul 2016 20:31:31 -0700 Subject: [PATCH 192/409] Clarify batching vs fragments --- docs/source/apollo-client/fragments.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-client/fragments.md b/docs/source/apollo-client/fragments.md index 53cb1690fa8..b3355777d09 100644 --- a/docs/source/apollo-client/fragments.md +++ b/docs/source/apollo-client/fragments.md @@ -4,7 +4,9 @@ order: 104 description: How to compose your queries and mutations from fragments with Apollo Client. --- -Apollo Client supports composition of queries and mutations using named fragments. For example, if you have several UI components and each defines a fragment that it must fetch in order to render itself, a root UI component can compose a single query that references each of those fragments. This single query is then fetched from the server and will return the data requested by each of the fragments. This alows you to get the data needed to render all of those UI components in a single request to your GraphQL server. +Apollo Client supports composition of queries and mutations using named fragments. For example, if you have several UI components and each defines a fragment that it must fetch in order to render itself, a root UI component can compose a single query that references each of those fragments. This single query is then fetched from the server and will return the data requested by each of the fragments. This allows you to get the data needed to render all of those UI components in a single request to your GraphQL server. + +Note that a similar effect can be achieved with [batching](network.html#query-batching), so it's up to you to decide when it's a good idea to use fragments vs. batching. Fragments are particularly useful in cases when you need to render nested components, each with their own data requirements.

Creating fragments

From ad108739376bb7c6f1ac51c23c75b49af569efec Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 8 Jul 2016 20:31:56 -0700 Subject: [PATCH 193/409] Change highlighting --- docs/source/apollo-client/fragments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/fragments.md b/docs/source/apollo-client/fragments.md index b3355777d09..1c9c59e737d 100644 --- a/docs/source/apollo-client/fragments.md +++ b/docs/source/apollo-client/fragments.md @@ -31,7 +31,7 @@ The method `createFragment` returns an array of `FragmentDefinition` objects ext Fragments are especially helpful in the case where you have deeply nested UI components, and you want to keep the fields the component needs next to the component code itself. You also want to avoid multiple roundtrips. Imagine the following UI structure: -```js +```html From f8cdc4ab1309ead942a87dbf7a7b16d2c6c5e8b5 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Sun, 10 Jul 2016 14:47:23 -0700 Subject: [PATCH 194/409] Fill in some info about mutations --- docs/source/apollo-client/mutations.md | 62 +++++++++++++++++++------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index 9793faa9790..9b3e52f1938 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -4,7 +4,12 @@ order: 103 description: How to run mutations to modify data with Apollo Client. --- -In addition to fetching data using queries, the Apollo Client also handles GraphQL mutations. Current support for mutations is relatively basic, just letting you send a mutation and then incorporate the result into the store. +In addition to fetching data using queries, the Apollo Client also handles GraphQL mutations. GraphQL mutations consist of two parts: + +1. The root field with arguments, which represents the actual operation to be done on the server +2. The rest of the query, which describes the results to fetch to update the client + +Apollo Client handles both of these requirements.

ApolloClient#mutate(options)

@@ -24,25 +29,14 @@ const client = new ApolloClient(); client.mutate({ mutation: gql` - mutation postReply( - $token: String! - $topic_id: ID! - $category_id: ID! - $raw: String! - ) { - createPost( - token: $token - topic_id: $topic_id - category: $category_id - raw: $raw - ) { + mutation postReply($topic_id: ID!, $category_id: ID!, $raw: String!) { + createPost(topic_id: $topic_id, category: $category_id, raw: $raw) { id cooked } } `, variables: { - token: 'asdf', topic_id: '123', category_id: '456', raw: 'This is the post text.', @@ -62,4 +56,42 @@ client.mutate({ }); ``` -Right now, this is a bit verbose because you have to list the names of the variables three times, but we hope to improve this in the future. +Mutations can get a bit verbose because you often need to pass in variables for a lot of different arguments, and those need to be declared in several places. This is inherent to the design of GraphQL itself, but future versions of Apollo Client may contain helpers to reduce the necessary boilerplate. In an ideal world, GraphQL itself would make variable type declarations optional. + +

Designing mutation results

+ +When people talk about GraphQL, they often focus on the data fetching side of things, because that's where GraphQL brings the most value. Mutations can be pretty nice if done well, but the principles of designing good mutations, and especially good mutation result types, are not yet well-understood in the open source community. So when you are working with mutations it might often feel like you need to make a lot of application-specific decisions. + +In GraphQL, mutations can return any type, and that type can be queried just like a regular GraphQL query. So the question is - what type should a particular mutation return? + +In GraphQL itself, there isn't any specification about how this is supposed to work. In most cases, the data available from a mutation result should be the server developer's best guess of the data a client would need to understand what happened on the server. For example, a mutation that creates a new comment on a blog post might return the comment itself. A mutation that reorders an array might need to return the new array. + +In many cases, it's beneficial to have the mutation result return the _parent_ of the new object, so that the client developer can decide what data they need to update. For example, if a todo list has a computed field for the number of tasks, inserting a new task might update that as well, meaning it might be good to have the mutation return a `TodoList` type rather than a `Task` type. + +Sometimes, you might need to define a new type just for the result of a specific mutation. For example, in the todo list case, it might make sense for the result of the mutation to have two fields, and include _both_ the inserted task and the associated todo list. That way, the client can more easily refetch related data. + +

Mutation behaviors

+ +In Apollo Client, there is a special system for handling mutation results and incorporating them back into the store. Then, any queries you have bound to your UI components via `watchQuery` or any of the view integrations will automatically update. + +This section is still under construction, the tests can give some indication of how it works: [apollo-client/test/mutationResults](https://github.com/apollostack/apollo-client/blob/22f038de8d64c50f86aa152714288f51dd674ac9/test/mutationResults.ts) + +

Default: update fields

+ +... + +

ARRAY_INSERT

+ +... + +

DELETE

+ +... + +

ARRAY_DELETE

+ +... + +

Custom mutation behaviors

+ +... From 9d3772f136aaf43000b9dc5f409ace6f20aa52e0 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Jul 2016 16:17:53 -0700 Subject: [PATCH 195/409] Add changelog to ToC --- docs/source/apollo-client/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index 0d45fd1aab8..aa1f75c2c9f 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -234,3 +234,7 @@ const client = new ApolloClient({ ``` Then, when a client calls ApolloClient#query or ApolloClient#watchQuery, the data should be returned instantly because it is already in the store! This also makes full page server side rendering without a page rebuild (if using react for instance) possible because the server rendered template won't differ from the client) + +## Change log + +Upgrading to a new version? [Check out the change log on GitHub](https://github.com/apollostack/apollo-client/blob/master/CHANGELOG.md). From 260a352305651e0966532274faf0199177616248 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Jul 2016 16:55:30 -0700 Subject: [PATCH 196/409] Add docs about ApolloError --- docs/source/apollo-client/mutations.md | 14 ++------- docs/source/apollo-client/queries.md | 40 +++++++++++--------------- 2 files changed, 20 insertions(+), 34 deletions(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index 9b3e52f1938..97fdf702af5 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -13,7 +13,7 @@ Apollo Client handles both of these requirements.

ApolloClient#mutate(options)

-Send a mutation to the server and get the result. The result is also incorporated into the store, updating any queries registered with `watchQuery` that are interested in the changed objects. Returns a promise that resolves to a GraphQLResult. +Send a mutation to the server and get the result. The result is also incorporated into the store, updating any queries registered with `watchQuery` that are interested in the changed objects. Returns a promise that resolves to a GraphQLResult, or throws an [`ApolloError`](queries.html#ApolloError). - `mutation: string` The mutation to send to the server. - `variables: Object` The variables to send along with the mutation. @@ -41,16 +41,8 @@ client.mutate({ category_id: '456', raw: 'This is the post text.', } -}).then((graphQLResult) => { - const { errors, data } = graphQLResult; - - if (data) { - console.log('got data', data); - } - - if (errors) { - console.log('got some GraphQL execution errors', errors); - } +}).then(({ data }) => { + console.log('got data', data); }).catch((error) => { console.log('there was an error sending the query', error); }); diff --git a/docs/source/apollo-client/queries.md b/docs/source/apollo-client/queries.md index 07c4c185a23..f56112dc2c2 100644 --- a/docs/source/apollo-client/queries.md +++ b/docs/source/apollo-client/queries.md @@ -76,7 +76,7 @@ Of course, you don't always want to use the existing data in the store - sometim

ApolloClient#query(options)

-Run a GraphQL query and return a promise that resolves to a `GraphQLResult`. +Run a GraphQL query and return a promise that resolves to a `GraphQLResult`, or throws an [`ApolloError`](#ApolloError). - `query: string` A GraphQL query string to fetch. - `variables: Object` The variables to pass along with the query. @@ -106,16 +106,8 @@ client.query({ categoryId: 5, }, forceFetch: false, -}).then((graphQLResult) => { - const { errors, data } = graphQLResult; - - if (data) { - console.log('got data', data); - } - - if (errors) { - console.log('got some GraphQL execution errors', errors); - } +}).then(({ data }) => { + console.log('got data', data); }).catch((error) => { console.log('there was an error sending the query', error); }); @@ -123,7 +115,7 @@ client.query({

ApolloClient#watchQuery(options)

-Run a GraphQL query and return a QueryObservable that is updated as the query result in the store changes. +Run a GraphQL query and return a QueryObservable that is updated as the query result in the store changes, or throws an [`ApolloError`](#ApolloError). - `query: string` A GraphQL query string to fetch. - `variables: Object` The variables to pass along with the query. @@ -144,7 +136,7 @@ This is the object you get when you call `watchQuery`. It has just one method, ` The object you pass into `QueryObservable#subscribe`. Includes optional callbacks to receive results: - `next(result: GraphQLResult)` Called when there is a new result for the query. -- `error(error: Error)` Called when there is a network error for the query. +- `error(error: ApolloError)` Called when there is any error for the query. Read more [in the `ApolloError` section below](queries.html#ApolloError).

QuerySubscription

@@ -178,16 +170,8 @@ const queryObservable = client.watchQuery({ }); const subscription = queryObservable.subscribe({ - next: (graphQLResult) => { - const { errors, data } = graphQLResult; - - if (data) { - console.log('got data', data); - } - - if (errors) { - console.log('got some GraphQL execution errors', errors); - } + next: ({ data }) => { + console.log('got data', data); }, error: (error) => { console.log('there was an error sending the query', error); @@ -206,3 +190,13 @@ subscription.startPolling(100); // Call when we're done watching this query subscription.unsubscribe(); ``` + +

ApolloError

+ +Apollo uses the custom error type `ApolloError` as the standard way to communicate GraphQL-related errors to your application. + +`ApolloError` extends the standard Javascript `Error` type, meaning that you can treat it as a standard `Error` and expect it to work correctly, but it also includes some extra fields that will help you write code that handles different types of errors. As a rule of thumb, you should not use the error message string to determine the type of error that has occurred. Instead, you should use the information that `ApolloError` provides: + +- `graphQLErrors: GraphQLError[]`: Array containing the errors returned by the server on a specific GraphQL query. When Apollo Client sends a query to the GraphQL server, these errors are contained within the errors key of the response returned by the server. +- `networkError: Error`: Error that has occurred in fetching the query from the server (e.g. Apollo Client is unable to reach the server). +- `message: string`: The error message that describes what went wrong. If there were multiple errors, this error message includes the error messages (separated by newlines) for each element in `graphQLErrors` and the `networkError`, if they are defined. From fd9deb995434db775f900822c176145ace46cc6e Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 11 Jul 2016 16:57:19 -0700 Subject: [PATCH 197/409] Document change in observable API --- docs/source/apollo-client/queries.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/source/apollo-client/queries.md b/docs/source/apollo-client/queries.md index f56112dc2c2..d643dba11ba 100644 --- a/docs/source/apollo-client/queries.md +++ b/docs/source/apollo-client/queries.md @@ -127,25 +127,25 @@ Run a GraphQL query and return a QueryObservable that is updated as the query re

QueryObservable

-This is the object you get when you call `watchQuery`. It has just one method, `subscribe`, to which you can pass a `QueryObserver` object: +This is the object you get when you call `watchQuery`. The most important method is `subscribe`, which lets you get query results. There are also some Apollo-Client-specific methods to refetch and poll query results: - `subscribe(observer: QueryObserver)` Pass an observer object which gets called when there is new data. Returns a `QuerySubscription` object which you can use to unsubscribe or refetch. +- `refetch(variables: Object)` Refetch this query from the server. Think of it like a refresh button. This can take an object of new variables +- `stopPolling()` Stop an actively polling query. +- `startPolling(pollInterval: number)` Start polling a query

interface QueryObserver

-The object you pass into `QueryObservable#subscribe`. Includes optional callbacks to receive results: +The object you pass into `QueryObservable#subscribe`. It should include optional callbacks to get results or errors from the query: - `next(result: GraphQLResult)` Called when there is a new result for the query. - `error(error: ApolloError)` Called when there is any error for the query. Read more [in the `ApolloError` section below](queries.html#ApolloError).

QuerySubscription

-The object returned from `QueryObservable#subscribe`. Includes four methods: +The object returned from `QueryObservable#subscribe`. Includes just one method: -- `refetch(variables: Object)` Refetch this query from the server. Think of it like a refresh button. This can take an object of new variables - `unsubscribe()` Notify the client to no longer care about this query. After this is called, none of the callbacks on the observer will be fired anymore. It's very important to call this when you are done with the query, because that is what lets the client know that it can clean up the data associated with this subscription. The view integrations will do this for you. -- `stopPolling()` Stop an actively polling query. -- `startPolling(pollInterval: number)` Start polling a query #### Code sample From 71dd818a9412e04b070427d29d109c67ed08594f Mon Sep 17 00:00:00 2001 From: Kieran Browne Date: Wed, 13 Jul 2016 07:00:12 +1000 Subject: [PATCH 198/409] Replaced TODO: Add Screenshot with screenshot of Graphiql with mocks (#143) * Added Screenshot for casual mocks * added screenshot file for casual mocks * added screenshot file for casual mocks --- .../apollo-server/graphiql-casual-mocks.png | Bin 0 -> 66455 bytes docs/source/apollo-server/guide.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/source/apollo-server/graphiql-casual-mocks.png diff --git a/docs/source/apollo-server/graphiql-casual-mocks.png b/docs/source/apollo-server/graphiql-casual-mocks.png new file mode 100644 index 0000000000000000000000000000000000000000..8b08101ba78b8031357c5b7641ffe5a0e46b3ac4 GIT binary patch literal 66455 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 literal 0 HcmV?d00001 diff --git a/docs/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md index 5d12cfe569c..d513a67d216 100644 --- a/docs/source/apollo-server/guide.md +++ b/docs/source/apollo-server/guide.md @@ -158,7 +158,7 @@ export default mocks; ``` Go ahead and give the server a try with the new mocks. If all went well, you should be able to run the following query and get a similar result. -**TODO:** Screenshot here +![Mock author data with casual](graphiql-casual-mocks.png) You can tell `apolloServer` to mock a scalar type, such as Int or String in a specific way. In this case, we told it to return an integer between 1 and 1000 every time an Int field is requested by the client. From 5720763565d9eb8827ae33d899f47c306732af16 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Tue, 12 Jul 2016 14:04:39 -0700 Subject: [PATCH 199/409] Fix theme to point to correct docs --- themes/meteor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/meteor b/themes/meteor index 94485262479..fe683bc627b 160000 --- a/themes/meteor +++ b/themes/meteor @@ -1 +1 @@ -Subproject commit 94485262479eabc1d9e9c8917570a5bb11530bf7 +Subproject commit fe683bc627bbe7b41ea1a882a8f70bc4e117612e From 352fdf57aaf809cac106d0e8598acc50b7ecafa8 Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Wed, 13 Jul 2016 20:26:30 +0200 Subject: [PATCH 200/409] 'Kind' import statements (#146) Fix the wrong import for 'Kind' and add it to all code snippets #145 --- docs/source/apollo-server/scalars.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/source/apollo-server/scalars.md b/docs/source/apollo-server/scalars.md index 3ad6ae6774a..79c6eb2d6e1 100644 --- a/docs/source/apollo-server/scalars.md +++ b/docs/source/apollo-server/scalars.md @@ -44,6 +44,8 @@ type MyType { And here is the resolver: ```js +import { Kind } from 'graphql/language'; + Date: { __parseValue (value) { return new Date(value); // value from the client @@ -76,7 +78,7 @@ type MyType { And now the resolver: ```js -import { Kind } from 'graphql/type' +import { Kind } from 'graphql/language'; Odd: { __serialize: oddValue, @@ -111,6 +113,8 @@ type MyType { And the implementation of the resolver: ```js +import { Kind } from 'graphql/language'; + function parseJSONLiteral(ast) { switch (ast.kind) { case Kind.STRING: From 6989e28ffd013dcd7e719ca2924ed891d2670f29 Mon Sep 17 00:00:00 2001 From: Tim Mikeladze Date: Mon, 18 Jul 2016 11:19:54 -0700 Subject: [PATCH 201/409] Documentation on using React Router (#147) --- docs/source/apollo-client/react.md | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 52f4eb3c594..1c9873e90bb 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -234,3 +234,35 @@ export default CategoryWithData; ``` In this case, `CategoryWithData` gets two props: `category` and `selectedCategory`. + +

Usage with React Router

+ +```txt +npm install react-router --save +``` + +In order to use [React Router](https://github.com/reactjs/react-router) with Apollo you need to render the `Router` component within an `ApolloProvider` component. That's all there is to it. You can find an introduction to React Router, advanced usage, and API documentation inside its [Github repository](https://github.com/reactjs/react-router/blob/master/docs/README.md). + +```js +import React from 'react'; +import ReactDOM from 'react-dom'; +import ApolloClient from 'apollo-client'; +import { ApolloProvider } from 'react-apollo'; +import { Router, Route, browserHistory } from 'react-router'; + +const client = new ApolloClient(); + +const Home = () => ( +
+ The contents of your first route +
+); + +ReactDOM.render( + + + + + , + root +); From 57c407c4898a3bdc854b9abc28042583a7652cf3 Mon Sep 17 00:00:00 2001 From: Josh Meads Date: Mon, 18 Jul 2016 17:46:37 -0700 Subject: [PATCH 202/409] Update react.md (#148) Added the ``` to the bottom of the page, github renders it fine without but the docs break. --- docs/source/apollo-client/react.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 1c9873e90bb..c88a6ec47fd 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -266,3 +266,4 @@ ReactDOM.render( , root ); +``` From 3a2fcf227bd00577ab21b4dedd4e60f966d3423f Mon Sep 17 00:00:00 2001 From: Saikat Chakrabarti Date: Mon, 18 Jul 2016 20:46:51 -0400 Subject: [PATCH 203/409] Add react-apollo-starter-kit (#144) --- docs/source/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/index.md b/docs/source/index.md index 94b15b33072..97bc25eb203 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -34,6 +34,7 @@ We have put together some basic example apps using various parts of Apollo; chec - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - [A simple GraphQL blog that uses Feathersjs for managing database services](https://github.com/swarthout/feathers-apollo) - [A fork of Facebook's F8 React Native app that uses Apollo](https://github.com/nnance/f8app-apollo) +- [A production-ready starter-kit using React and Webpack](https://github.com/saikat/react-apollo-starter-kit) ### Meteor Examples - [A bare-bones Meteor starter kit](https://github.com/apollostack/meteor-starter-kit) From 3da979be18f799c10a1a65f5e8e4f12fa96f3582 Mon Sep 17 00:00:00 2001 From: Mirza Joldic Date: Tue, 19 Jul 2016 12:32:46 -0400 Subject: [PATCH 204/409] corrected object where refetch(), stopPolling(), startPolling() (#149) `refetch()`, `stopPolling()`, `startPolling()` are part of `queryObservable` not `subscription` --- docs/source/apollo-client/queries.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/apollo-client/queries.md b/docs/source/apollo-client/queries.md index d643dba11ba..fb02dae1d12 100644 --- a/docs/source/apollo-client/queries.md +++ b/docs/source/apollo-client/queries.md @@ -179,13 +179,13 @@ const subscription = queryObservable.subscribe({ }); // Refetch the query if we want an updated result -subscription.refetch(); +queryObservable.refetch(); // Stop polling this query -subscription.stopPolling(); +queryObservable.stopPolling(); // Start polling this query -subscription.startPolling(100); +queryObservable.startPolling(100); // Call when we're done watching this query subscription.unsubscribe(); From 8c7f830d59b98d8f970888e32d519cdc7efeffb6 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 20 Jul 2016 15:16:27 -0700 Subject: [PATCH 205/409] update mutation docs --- docs/package.json | 4 +- .../apollo-client/angular2.md | 0 .../apollo-client/devtools.md | 0 .../apollo-client/fragments.md | 0 .../apollo-client/how-it-works.md | 0 .../source => source}/apollo-client/index.md | 0 .../source => source}/apollo-client/meteor.md | 0 .../apollo-client/mutations.md | 76 +++++++++++++++--- .../apollo-client/network.md | 0 .../apollo-client/queries.md | 0 .../source => source}/apollo-client/react.md | 0 .../source => source}/apollo-client/redux.md | 0 .../apollo-server/connectors.md | 0 .../source => source}/apollo-server/errors.md | 0 .../apollo-server/generate-schema.md | 0 .../apollo-server/graphiql-casual-mocks.png | Bin .../apollo-server/graphiql-test.png | Bin .../source => source}/apollo-server/guide.md | 0 .../source => source}/apollo-server/index.md | 0 .../apollo-server/mocking.md | 0 .../apollo-server/resolvers.md | 0 .../apollo-server/scalars.md | 0 .../source => source}/apollo-server/tools.md | 0 .../assets/client-diagrams/1-overview.png | Bin .../assets/client-diagrams/2-map.png | Bin .../assets/client-diagrams/3-minimize.png | Bin .../assets/client-diagrams/4-normalize.png | Bin .../assets/devtools/devtools.png | Bin .../assets/devtools/mutation-init.png | Bin .../assets/devtools/mutation-result-data.png | Bin .../assets/devtools/mutation-result.png | Bin .../assets/devtools/query-init-data.png | Bin .../assets/devtools/query-init.png | Bin .../assets/devtools/query-result.png | Bin {docs/source => source}/index.md | 0 {docs/source => source}/logo/large.png | Bin {docs/source => source}/logo/square.png | Bin 37 files changed, 65 insertions(+), 15 deletions(-) rename {docs/source => source}/apollo-client/angular2.md (100%) rename {docs/source => source}/apollo-client/devtools.md (100%) rename {docs/source => source}/apollo-client/fragments.md (100%) rename {docs/source => source}/apollo-client/how-it-works.md (100%) rename {docs/source => source}/apollo-client/index.md (100%) rename {docs/source => source}/apollo-client/meteor.md (100%) rename {docs/source => source}/apollo-client/mutations.md (55%) rename {docs/source => source}/apollo-client/network.md (100%) rename {docs/source => source}/apollo-client/queries.md (100%) rename {docs/source => source}/apollo-client/react.md (100%) rename {docs/source => source}/apollo-client/redux.md (100%) rename {docs/source => source}/apollo-server/connectors.md (100%) rename {docs/source => source}/apollo-server/errors.md (100%) rename {docs/source => source}/apollo-server/generate-schema.md (100%) rename {docs/source => source}/apollo-server/graphiql-casual-mocks.png (100%) rename {docs/source => source}/apollo-server/graphiql-test.png (100%) rename {docs/source => source}/apollo-server/guide.md (100%) rename {docs/source => source}/apollo-server/index.md (100%) rename {docs/source => source}/apollo-server/mocking.md (100%) rename {docs/source => source}/apollo-server/resolvers.md (100%) rename {docs/source => source}/apollo-server/scalars.md (100%) rename {docs/source => source}/apollo-server/tools.md (100%) rename {docs/source => source}/assets/client-diagrams/1-overview.png (100%) rename {docs/source => source}/assets/client-diagrams/2-map.png (100%) rename {docs/source => source}/assets/client-diagrams/3-minimize.png (100%) rename {docs/source => source}/assets/client-diagrams/4-normalize.png (100%) rename {docs/source => source}/assets/devtools/devtools.png (100%) rename {docs/source => source}/assets/devtools/mutation-init.png (100%) rename {docs/source => source}/assets/devtools/mutation-result-data.png (100%) rename {docs/source => source}/assets/devtools/mutation-result.png (100%) rename {docs/source => source}/assets/devtools/query-init-data.png (100%) rename {docs/source => source}/assets/devtools/query-init.png (100%) rename {docs/source => source}/assets/devtools/query-result.png (100%) rename {docs/source => source}/index.md (100%) rename {docs/source => source}/logo/large.png (100%) rename {docs/source => source}/logo/square.png (100%) diff --git a/docs/package.json b/docs/package.json index ffc44e4f6c5..a95c0828d1d 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "hexo": { - "version": "3.2.0" + "version": "3.2.2" }, "dependencies": { "hexo": "^3.1.0", @@ -23,4 +23,4 @@ "start": "hexo serve", "deploy": "hexo-s3-deploy" } -} +} \ No newline at end of file diff --git a/docs/source/apollo-client/angular2.md b/source/apollo-client/angular2.md similarity index 100% rename from docs/source/apollo-client/angular2.md rename to source/apollo-client/angular2.md diff --git a/docs/source/apollo-client/devtools.md b/source/apollo-client/devtools.md similarity index 100% rename from docs/source/apollo-client/devtools.md rename to source/apollo-client/devtools.md diff --git a/docs/source/apollo-client/fragments.md b/source/apollo-client/fragments.md similarity index 100% rename from docs/source/apollo-client/fragments.md rename to source/apollo-client/fragments.md diff --git a/docs/source/apollo-client/how-it-works.md b/source/apollo-client/how-it-works.md similarity index 100% rename from docs/source/apollo-client/how-it-works.md rename to source/apollo-client/how-it-works.md diff --git a/docs/source/apollo-client/index.md b/source/apollo-client/index.md similarity index 100% rename from docs/source/apollo-client/index.md rename to source/apollo-client/index.md diff --git a/docs/source/apollo-client/meteor.md b/source/apollo-client/meteor.md similarity index 100% rename from docs/source/apollo-client/meteor.md rename to source/apollo-client/meteor.md diff --git a/docs/source/apollo-client/mutations.md b/source/apollo-client/mutations.md similarity index 55% rename from docs/source/apollo-client/mutations.md rename to source/apollo-client/mutations.md index 97fdf702af5..0c99cd49b7b 100644 --- a/docs/source/apollo-client/mutations.md +++ b/source/apollo-client/mutations.md @@ -62,28 +62,78 @@ In many cases, it's beneficial to have the mutation result return the _parent_ o Sometimes, you might need to define a new type just for the result of a specific mutation. For example, in the todo list case, it might make sense for the result of the mutation to have two fields, and include _both_ the inserted task and the associated todo list. That way, the client can more easily refetch related data. -

Mutation behaviors

+

Updating Queries Results

-In Apollo Client, there is a special system for handling mutation results and incorporating them back into the store. Then, any queries you have bound to your UI components via `watchQuery` or any of the view integrations will automatically update. +In Apollo Client, there is a special system that allows mutations to update the results of the active queries. Active queries are bound to your UI components via `watchQuery` or any of the view integrations. These UI components will automatically re-render as updated queries are updated. -This section is still under construction, the tests can give some indication of how it works: [apollo-client/test/mutationResults](https://github.com/apollostack/apollo-client/blob/22f038de8d64c50f86aa152714288f51dd674ac9/test/mutationResults.ts) +

New Object Or Updated Fields

-

Default: update fields

+In the simplest case, your mutation returns either a completely new object (with a uniquely new `id`) or a new value for an existing object with some fields updated. -... +If the new object doesn't appear in any relations to other objects, and the Apollo Client has [`dataIdFromObject`](/apollo-client/index.html#ApolloClient) option defined, the occurrences of the object in the active queries will be updated automatically without any extra code. -

ARRAY_INSERT

+For example, say you have a query with a flat list list of `TodoList`s. Later, after clicking a "new todo-list" button the mutation `createNewTodoList(name: String!)` was fired. If `createNewTodoList` mutation returns a new `TodoList` object, then it will be incorporated into store and updated in active queries automatically. -... +

Updating Complicated Queries With `updateQueries`

-

DELETE

+For more complicated queries you might want to apply more sophisticated logic. -... +For example, let's say you have a mutation `addNewTask(text: String!, list_id: ID!)` that adds a new task of type `Task` to a `TodoList` currently displayed on the screen. In this example, to update a query with the new task returned by the mutation, it is required to insert the new task into the correct place in the list of tasks. -

ARRAY_DELETE

+For cases like these, use the special option `updateQueries`. `updateQueries` is a mapping from query name to a reducer function. -... +Each reducer function accepts the old result of the query and the new information such that the mutation result. The job of the reducer function is to return a new query result. -

Custom mutation behaviors

+```js + +client.watchQuery({ + query: gql` + query todos($list_id: ID!) { + todo_list(id: $list_id) { + title + tasks { + id + text + completed + createdAt + } + } + } + `, + variables: { + list_id: '123, + }, +}); + +client.mutate({ + mutation: gql` + mutation ($text: String!, $list_id: ID!) { + addNewTask(text: $text, list_id: $list_id) { + id + text + completed + createdAt + } + } + `, + variables: { + text: 'walk the dog', + list_id: '123', + }, + updateQueries: { + todos: (previousQueryResult, { mutationResult, queryVariables }) => { + return { + title: previousQueryResult.title, + tasks: [...previousQueryResult.tasks, mutationResult], + }; + }, + }, +}); +``` + +The `updateQueries` reducer functions are similar to [Redux](http://redux.js.org/docs/basics/Reducers.html) reducers, if you are familiar with Redux. -... +This means that reducer functions: +- must return an updated query result that incorporates `mutationResult` +- must avoid mutating the arguments, such that previous query result, and prefer cloning +- should have no side effects diff --git a/docs/source/apollo-client/network.md b/source/apollo-client/network.md similarity index 100% rename from docs/source/apollo-client/network.md rename to source/apollo-client/network.md diff --git a/docs/source/apollo-client/queries.md b/source/apollo-client/queries.md similarity index 100% rename from docs/source/apollo-client/queries.md rename to source/apollo-client/queries.md diff --git a/docs/source/apollo-client/react.md b/source/apollo-client/react.md similarity index 100% rename from docs/source/apollo-client/react.md rename to source/apollo-client/react.md diff --git a/docs/source/apollo-client/redux.md b/source/apollo-client/redux.md similarity index 100% rename from docs/source/apollo-client/redux.md rename to source/apollo-client/redux.md diff --git a/docs/source/apollo-server/connectors.md b/source/apollo-server/connectors.md similarity index 100% rename from docs/source/apollo-server/connectors.md rename to source/apollo-server/connectors.md diff --git a/docs/source/apollo-server/errors.md b/source/apollo-server/errors.md similarity index 100% rename from docs/source/apollo-server/errors.md rename to source/apollo-server/errors.md diff --git a/docs/source/apollo-server/generate-schema.md b/source/apollo-server/generate-schema.md similarity index 100% rename from docs/source/apollo-server/generate-schema.md rename to source/apollo-server/generate-schema.md diff --git a/docs/source/apollo-server/graphiql-casual-mocks.png b/source/apollo-server/graphiql-casual-mocks.png similarity index 100% rename from docs/source/apollo-server/graphiql-casual-mocks.png rename to source/apollo-server/graphiql-casual-mocks.png diff --git a/docs/source/apollo-server/graphiql-test.png b/source/apollo-server/graphiql-test.png similarity index 100% rename from docs/source/apollo-server/graphiql-test.png rename to source/apollo-server/graphiql-test.png diff --git a/docs/source/apollo-server/guide.md b/source/apollo-server/guide.md similarity index 100% rename from docs/source/apollo-server/guide.md rename to source/apollo-server/guide.md diff --git a/docs/source/apollo-server/index.md b/source/apollo-server/index.md similarity index 100% rename from docs/source/apollo-server/index.md rename to source/apollo-server/index.md diff --git a/docs/source/apollo-server/mocking.md b/source/apollo-server/mocking.md similarity index 100% rename from docs/source/apollo-server/mocking.md rename to source/apollo-server/mocking.md diff --git a/docs/source/apollo-server/resolvers.md b/source/apollo-server/resolvers.md similarity index 100% rename from docs/source/apollo-server/resolvers.md rename to source/apollo-server/resolvers.md diff --git a/docs/source/apollo-server/scalars.md b/source/apollo-server/scalars.md similarity index 100% rename from docs/source/apollo-server/scalars.md rename to source/apollo-server/scalars.md diff --git a/docs/source/apollo-server/tools.md b/source/apollo-server/tools.md similarity index 100% rename from docs/source/apollo-server/tools.md rename to source/apollo-server/tools.md diff --git a/docs/source/assets/client-diagrams/1-overview.png b/source/assets/client-diagrams/1-overview.png similarity index 100% rename from docs/source/assets/client-diagrams/1-overview.png rename to source/assets/client-diagrams/1-overview.png diff --git a/docs/source/assets/client-diagrams/2-map.png b/source/assets/client-diagrams/2-map.png similarity index 100% rename from docs/source/assets/client-diagrams/2-map.png rename to source/assets/client-diagrams/2-map.png diff --git a/docs/source/assets/client-diagrams/3-minimize.png b/source/assets/client-diagrams/3-minimize.png similarity index 100% rename from docs/source/assets/client-diagrams/3-minimize.png rename to source/assets/client-diagrams/3-minimize.png diff --git a/docs/source/assets/client-diagrams/4-normalize.png b/source/assets/client-diagrams/4-normalize.png similarity index 100% rename from docs/source/assets/client-diagrams/4-normalize.png rename to source/assets/client-diagrams/4-normalize.png diff --git a/docs/source/assets/devtools/devtools.png b/source/assets/devtools/devtools.png similarity index 100% rename from docs/source/assets/devtools/devtools.png rename to source/assets/devtools/devtools.png diff --git a/docs/source/assets/devtools/mutation-init.png b/source/assets/devtools/mutation-init.png similarity index 100% rename from docs/source/assets/devtools/mutation-init.png rename to source/assets/devtools/mutation-init.png diff --git a/docs/source/assets/devtools/mutation-result-data.png b/source/assets/devtools/mutation-result-data.png similarity index 100% rename from docs/source/assets/devtools/mutation-result-data.png rename to source/assets/devtools/mutation-result-data.png diff --git a/docs/source/assets/devtools/mutation-result.png b/source/assets/devtools/mutation-result.png similarity index 100% rename from docs/source/assets/devtools/mutation-result.png rename to source/assets/devtools/mutation-result.png diff --git a/docs/source/assets/devtools/query-init-data.png b/source/assets/devtools/query-init-data.png similarity index 100% rename from docs/source/assets/devtools/query-init-data.png rename to source/assets/devtools/query-init-data.png diff --git a/docs/source/assets/devtools/query-init.png b/source/assets/devtools/query-init.png similarity index 100% rename from docs/source/assets/devtools/query-init.png rename to source/assets/devtools/query-init.png diff --git a/docs/source/assets/devtools/query-result.png b/source/assets/devtools/query-result.png similarity index 100% rename from docs/source/assets/devtools/query-result.png rename to source/assets/devtools/query-result.png diff --git a/docs/source/index.md b/source/index.md similarity index 100% rename from docs/source/index.md rename to source/index.md diff --git a/docs/source/logo/large.png b/source/logo/large.png similarity index 100% rename from docs/source/logo/large.png rename to source/logo/large.png diff --git a/docs/source/logo/square.png b/source/logo/square.png similarity index 100% rename from docs/source/logo/square.png rename to source/logo/square.png From 045653043e70e352735b91b72475c7d90ea1b325 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 20 Jul 2016 15:17:16 -0700 Subject: [PATCH 206/409] wrong headding tag --- {source => docs/source}/apollo-client/angular2.md | 0 {source => docs/source}/apollo-client/devtools.md | 0 {source => docs/source}/apollo-client/fragments.md | 0 .../source}/apollo-client/how-it-works.md | 0 {source => docs/source}/apollo-client/index.md | 0 {source => docs/source}/apollo-client/meteor.md | 0 {source => docs/source}/apollo-client/mutations.md | 2 +- {source => docs/source}/apollo-client/network.md | 0 {source => docs/source}/apollo-client/queries.md | 0 {source => docs/source}/apollo-client/react.md | 0 {source => docs/source}/apollo-client/redux.md | 0 {source => docs/source}/apollo-server/connectors.md | 0 {source => docs/source}/apollo-server/errors.md | 0 .../source}/apollo-server/generate-schema.md | 0 .../source}/apollo-server/graphiql-casual-mocks.png | Bin .../source}/apollo-server/graphiql-test.png | Bin {source => docs/source}/apollo-server/guide.md | 0 {source => docs/source}/apollo-server/index.md | 0 {source => docs/source}/apollo-server/mocking.md | 0 {source => docs/source}/apollo-server/resolvers.md | 0 {source => docs/source}/apollo-server/scalars.md | 0 {source => docs/source}/apollo-server/tools.md | 0 .../source}/assets/client-diagrams/1-overview.png | Bin .../source}/assets/client-diagrams/2-map.png | Bin .../source}/assets/client-diagrams/3-minimize.png | Bin .../source}/assets/client-diagrams/4-normalize.png | Bin .../source}/assets/devtools/devtools.png | Bin .../source}/assets/devtools/mutation-init.png | Bin .../assets/devtools/mutation-result-data.png | Bin .../source}/assets/devtools/mutation-result.png | Bin .../source}/assets/devtools/query-init-data.png | Bin .../source}/assets/devtools/query-init.png | Bin .../source}/assets/devtools/query-result.png | Bin {source => docs/source}/index.md | 0 {source => docs/source}/logo/large.png | Bin {source => docs/source}/logo/square.png | Bin 36 files changed, 1 insertion(+), 1 deletion(-) rename {source => docs/source}/apollo-client/angular2.md (100%) rename {source => docs/source}/apollo-client/devtools.md (100%) rename {source => docs/source}/apollo-client/fragments.md (100%) rename {source => docs/source}/apollo-client/how-it-works.md (100%) rename {source => docs/source}/apollo-client/index.md (100%) rename {source => docs/source}/apollo-client/meteor.md (100%) rename {source => docs/source}/apollo-client/mutations.md (98%) rename {source => docs/source}/apollo-client/network.md (100%) rename {source => docs/source}/apollo-client/queries.md (100%) rename {source => docs/source}/apollo-client/react.md (100%) rename {source => docs/source}/apollo-client/redux.md (100%) rename {source => docs/source}/apollo-server/connectors.md (100%) rename {source => docs/source}/apollo-server/errors.md (100%) rename {source => docs/source}/apollo-server/generate-schema.md (100%) rename {source => docs/source}/apollo-server/graphiql-casual-mocks.png (100%) rename {source => docs/source}/apollo-server/graphiql-test.png (100%) rename {source => docs/source}/apollo-server/guide.md (100%) rename {source => docs/source}/apollo-server/index.md (100%) rename {source => docs/source}/apollo-server/mocking.md (100%) rename {source => docs/source}/apollo-server/resolvers.md (100%) rename {source => docs/source}/apollo-server/scalars.md (100%) rename {source => docs/source}/apollo-server/tools.md (100%) rename {source => docs/source}/assets/client-diagrams/1-overview.png (100%) rename {source => docs/source}/assets/client-diagrams/2-map.png (100%) rename {source => docs/source}/assets/client-diagrams/3-minimize.png (100%) rename {source => docs/source}/assets/client-diagrams/4-normalize.png (100%) rename {source => docs/source}/assets/devtools/devtools.png (100%) rename {source => docs/source}/assets/devtools/mutation-init.png (100%) rename {source => docs/source}/assets/devtools/mutation-result-data.png (100%) rename {source => docs/source}/assets/devtools/mutation-result.png (100%) rename {source => docs/source}/assets/devtools/query-init-data.png (100%) rename {source => docs/source}/assets/devtools/query-init.png (100%) rename {source => docs/source}/assets/devtools/query-result.png (100%) rename {source => docs/source}/index.md (100%) rename {source => docs/source}/logo/large.png (100%) rename {source => docs/source}/logo/square.png (100%) diff --git a/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md similarity index 100% rename from source/apollo-client/angular2.md rename to docs/source/apollo-client/angular2.md diff --git a/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md similarity index 100% rename from source/apollo-client/devtools.md rename to docs/source/apollo-client/devtools.md diff --git a/source/apollo-client/fragments.md b/docs/source/apollo-client/fragments.md similarity index 100% rename from source/apollo-client/fragments.md rename to docs/source/apollo-client/fragments.md diff --git a/source/apollo-client/how-it-works.md b/docs/source/apollo-client/how-it-works.md similarity index 100% rename from source/apollo-client/how-it-works.md rename to docs/source/apollo-client/how-it-works.md diff --git a/source/apollo-client/index.md b/docs/source/apollo-client/index.md similarity index 100% rename from source/apollo-client/index.md rename to docs/source/apollo-client/index.md diff --git a/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md similarity index 100% rename from source/apollo-client/meteor.md rename to docs/source/apollo-client/meteor.md diff --git a/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md similarity index 98% rename from source/apollo-client/mutations.md rename to docs/source/apollo-client/mutations.md index 0c99cd49b7b..6e60e1bce50 100644 --- a/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -74,7 +74,7 @@ If the new object doesn't appear in any relations to other objects, and the Apol For example, say you have a query with a flat list list of `TodoList`s. Later, after clicking a "new todo-list" button the mutation `createNewTodoList(name: String!)` was fired. If `createNewTodoList` mutation returns a new `TodoList` object, then it will be incorporated into store and updated in active queries automatically. -

Updating Complicated Queries With `updateQueries`

+

Updating Complicated Queries With `updateQueries`

For more complicated queries you might want to apply more sophisticated logic. diff --git a/source/apollo-client/network.md b/docs/source/apollo-client/network.md similarity index 100% rename from source/apollo-client/network.md rename to docs/source/apollo-client/network.md diff --git a/source/apollo-client/queries.md b/docs/source/apollo-client/queries.md similarity index 100% rename from source/apollo-client/queries.md rename to docs/source/apollo-client/queries.md diff --git a/source/apollo-client/react.md b/docs/source/apollo-client/react.md similarity index 100% rename from source/apollo-client/react.md rename to docs/source/apollo-client/react.md diff --git a/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md similarity index 100% rename from source/apollo-client/redux.md rename to docs/source/apollo-client/redux.md diff --git a/source/apollo-server/connectors.md b/docs/source/apollo-server/connectors.md similarity index 100% rename from source/apollo-server/connectors.md rename to docs/source/apollo-server/connectors.md diff --git a/source/apollo-server/errors.md b/docs/source/apollo-server/errors.md similarity index 100% rename from source/apollo-server/errors.md rename to docs/source/apollo-server/errors.md diff --git a/source/apollo-server/generate-schema.md b/docs/source/apollo-server/generate-schema.md similarity index 100% rename from source/apollo-server/generate-schema.md rename to docs/source/apollo-server/generate-schema.md diff --git a/source/apollo-server/graphiql-casual-mocks.png b/docs/source/apollo-server/graphiql-casual-mocks.png similarity index 100% rename from source/apollo-server/graphiql-casual-mocks.png rename to docs/source/apollo-server/graphiql-casual-mocks.png diff --git a/source/apollo-server/graphiql-test.png b/docs/source/apollo-server/graphiql-test.png similarity index 100% rename from source/apollo-server/graphiql-test.png rename to docs/source/apollo-server/graphiql-test.png diff --git a/source/apollo-server/guide.md b/docs/source/apollo-server/guide.md similarity index 100% rename from source/apollo-server/guide.md rename to docs/source/apollo-server/guide.md diff --git a/source/apollo-server/index.md b/docs/source/apollo-server/index.md similarity index 100% rename from source/apollo-server/index.md rename to docs/source/apollo-server/index.md diff --git a/source/apollo-server/mocking.md b/docs/source/apollo-server/mocking.md similarity index 100% rename from source/apollo-server/mocking.md rename to docs/source/apollo-server/mocking.md diff --git a/source/apollo-server/resolvers.md b/docs/source/apollo-server/resolvers.md similarity index 100% rename from source/apollo-server/resolvers.md rename to docs/source/apollo-server/resolvers.md diff --git a/source/apollo-server/scalars.md b/docs/source/apollo-server/scalars.md similarity index 100% rename from source/apollo-server/scalars.md rename to docs/source/apollo-server/scalars.md diff --git a/source/apollo-server/tools.md b/docs/source/apollo-server/tools.md similarity index 100% rename from source/apollo-server/tools.md rename to docs/source/apollo-server/tools.md diff --git a/source/assets/client-diagrams/1-overview.png b/docs/source/assets/client-diagrams/1-overview.png similarity index 100% rename from source/assets/client-diagrams/1-overview.png rename to docs/source/assets/client-diagrams/1-overview.png diff --git a/source/assets/client-diagrams/2-map.png b/docs/source/assets/client-diagrams/2-map.png similarity index 100% rename from source/assets/client-diagrams/2-map.png rename to docs/source/assets/client-diagrams/2-map.png diff --git a/source/assets/client-diagrams/3-minimize.png b/docs/source/assets/client-diagrams/3-minimize.png similarity index 100% rename from source/assets/client-diagrams/3-minimize.png rename to docs/source/assets/client-diagrams/3-minimize.png diff --git a/source/assets/client-diagrams/4-normalize.png b/docs/source/assets/client-diagrams/4-normalize.png similarity index 100% rename from source/assets/client-diagrams/4-normalize.png rename to docs/source/assets/client-diagrams/4-normalize.png diff --git a/source/assets/devtools/devtools.png b/docs/source/assets/devtools/devtools.png similarity index 100% rename from source/assets/devtools/devtools.png rename to docs/source/assets/devtools/devtools.png diff --git a/source/assets/devtools/mutation-init.png b/docs/source/assets/devtools/mutation-init.png similarity index 100% rename from source/assets/devtools/mutation-init.png rename to docs/source/assets/devtools/mutation-init.png diff --git a/source/assets/devtools/mutation-result-data.png b/docs/source/assets/devtools/mutation-result-data.png similarity index 100% rename from source/assets/devtools/mutation-result-data.png rename to docs/source/assets/devtools/mutation-result-data.png diff --git a/source/assets/devtools/mutation-result.png b/docs/source/assets/devtools/mutation-result.png similarity index 100% rename from source/assets/devtools/mutation-result.png rename to docs/source/assets/devtools/mutation-result.png diff --git a/source/assets/devtools/query-init-data.png b/docs/source/assets/devtools/query-init-data.png similarity index 100% rename from source/assets/devtools/query-init-data.png rename to docs/source/assets/devtools/query-init-data.png diff --git a/source/assets/devtools/query-init.png b/docs/source/assets/devtools/query-init.png similarity index 100% rename from source/assets/devtools/query-init.png rename to docs/source/assets/devtools/query-init.png diff --git a/source/assets/devtools/query-result.png b/docs/source/assets/devtools/query-result.png similarity index 100% rename from source/assets/devtools/query-result.png rename to docs/source/assets/devtools/query-result.png diff --git a/source/index.md b/docs/source/index.md similarity index 100% rename from source/index.md rename to docs/source/index.md diff --git a/source/logo/large.png b/docs/source/logo/large.png similarity index 100% rename from source/logo/large.png rename to docs/source/logo/large.png diff --git a/source/logo/square.png b/docs/source/logo/square.png similarity index 100% rename from source/logo/square.png rename to docs/source/logo/square.png From 606df478f6724dde157c0083084fdf1e3cde8b35 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 20 Jul 2016 15:18:21 -0700 Subject: [PATCH 207/409] capitalization in headings --- docs/source/apollo-client/mutations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index 6e60e1bce50..7e26383b3b8 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -62,7 +62,7 @@ In many cases, it's beneficial to have the mutation result return the _parent_ o Sometimes, you might need to define a new type just for the result of a specific mutation. For example, in the todo list case, it might make sense for the result of the mutation to have two fields, and include _both_ the inserted task and the associated todo list. That way, the client can more easily refetch related data. -

Updating Queries Results

+

Updating Queries results

In Apollo Client, there is a special system that allows mutations to update the results of the active queries. Active queries are bound to your UI components via `watchQuery` or any of the view integrations. These UI components will automatically re-render as updated queries are updated. @@ -74,7 +74,7 @@ If the new object doesn't appear in any relations to other objects, and the Apol For example, say you have a query with a flat list list of `TodoList`s. Later, after clicking a "new todo-list" button the mutation `createNewTodoList(name: String!)` was fired. If `createNewTodoList` mutation returns a new `TodoList` object, then it will be incorporated into store and updated in active queries automatically. -

Updating Complicated Queries With `updateQueries`

+

Updating complicated queries with `updateQueries`

For more complicated queries you might want to apply more sophisticated logic. From f453f46d8e3f7fad573e2f77bc0943ad0535c211 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 20 Jul 2016 15:18:49 -0700 Subject: [PATCH 208/409] typo in example --- docs/source/apollo-client/mutations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index 7e26383b3b8..a93490a0657 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -101,7 +101,7 @@ client.watchQuery({ } `, variables: { - list_id: '123, + list_id: '123', }, }); From 88e1d7ebc7c7839d835b44361888bf72ef48554a Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 20 Jul 2016 15:39:09 -0700 Subject: [PATCH 209/409] more edits to the mutations page --- docs/source/apollo-client/mutations.md | 61 ++++++++++++++------------ 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index a93490a0657..b8363730523 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -29,18 +29,19 @@ const client = new ApolloClient(); client.mutate({ mutation: gql` - mutation postReply($topic_id: ID!, $category_id: ID!, $raw: String!) { - createPost(topic_id: $topic_id, category: $category_id, raw: $raw) { + mutation ($text: String!, $list_id: ID!) { + addNewTask(text: $text, list_id: $list_id) { id - cooked + text + completed + createdAt } } `, variables: { - topic_id: '123', - category_id: '456', - raw: 'This is the post text.', - } + text: 'walk the dog', + list_id: '123', + }, }).then(({ data }) => { console.log('got data', data); }).catch((error) => { @@ -50,33 +51,14 @@ client.mutate({ Mutations can get a bit verbose because you often need to pass in variables for a lot of different arguments, and those need to be declared in several places. This is inherent to the design of GraphQL itself, but future versions of Apollo Client may contain helpers to reduce the necessary boilerplate. In an ideal world, GraphQL itself would make variable type declarations optional. -

Designing mutation results

- -When people talk about GraphQL, they often focus on the data fetching side of things, because that's where GraphQL brings the most value. Mutations can be pretty nice if done well, but the principles of designing good mutations, and especially good mutation result types, are not yet well-understood in the open source community. So when you are working with mutations it might often feel like you need to make a lot of application-specific decisions. -In GraphQL, mutations can return any type, and that type can be queried just like a regular GraphQL query. So the question is - what type should a particular mutation return? - -In GraphQL itself, there isn't any specification about how this is supposed to work. In most cases, the data available from a mutation result should be the server developer's best guess of the data a client would need to understand what happened on the server. For example, a mutation that creates a new comment on a blog post might return the comment itself. A mutation that reorders an array might need to return the new array. - -In many cases, it's beneficial to have the mutation result return the _parent_ of the new object, so that the client developer can decide what data they need to update. For example, if a todo list has a computed field for the number of tasks, inserting a new task might update that as well, meaning it might be good to have the mutation return a `TodoList` type rather than a `Task` type. - -Sometimes, you might need to define a new type just for the result of a specific mutation. For example, in the todo list case, it might make sense for the result of the mutation to have two fields, and include _both_ the inserted task and the associated todo list. That way, the client can more easily refetch related data. - -

Updating Queries results

+

Updating Query results

In Apollo Client, there is a special system that allows mutations to update the results of the active queries. Active queries are bound to your UI components via `watchQuery` or any of the view integrations. These UI components will automatically re-render as updated queries are updated. -

New Object Or Updated Fields

- -In the simplest case, your mutation returns either a completely new object (with a uniquely new `id`) or a new value for an existing object with some fields updated. - -If the new object doesn't appear in any relations to other objects, and the Apollo Client has [`dataIdFromObject`](/apollo-client/index.html#ApolloClient) option defined, the occurrences of the object in the active queries will be updated automatically without any extra code. - -For example, say you have a query with a flat list list of `TodoList`s. Later, after clicking a "new todo-list" button the mutation `createNewTodoList(name: String!)` was fired. If `createNewTodoList` mutation returns a new `TodoList` object, then it will be incorporated into store and updated in active queries automatically. - -

Updating complicated queries with `updateQueries`

+

Updating query results with `updateQueries`

-For more complicated queries you might want to apply more sophisticated logic. +Depending on how complicated are your queries, the logic incorporating the mutation result could be sophisticated. For example, let's say you have a mutation `addNewTask(text: String!, list_id: ID!)` that adds a new task of type `Task` to a `TodoList` currently displayed on the screen. In this example, to update a query with the new task returned by the mutation, it is required to insert the new task into the correct place in the list of tasks. @@ -137,3 +119,24 @@ This means that reducer functions: - must return an updated query result that incorporates `mutationResult` - must avoid mutating the arguments, such that previous query result, and prefer cloning - should have no side effects + +

New Object Or Updated Fields

+ +In cases when your mutation returns either a completely new object (with a uniquely new `id`) or a new value for an existing object with some fields updated, you might avoid writing any queries updating code at all. + +If the new object doesn't appear in any relations to other objects, and the Apollo Client has [`dataIdFromObject`](/apollo-client/index.html#ApolloClient) option defined, the occurrences of the object in the active queries will be updated automatically without any extra code. + +For example, say you have a query with a flat list list of `TodoList`s. Later, after clicking a "new todo-list" button the mutation `createNewTodoList(name: String!)` was fired. If `createNewTodoList` mutation returns a new `TodoList` object, then it will be incorporated into store and updated in active queries automatically. + + +

Designing mutation results

+ +When people talk about GraphQL, they often focus on the data fetching side of things, because that's where GraphQL brings the most value. Mutations can be pretty nice if done well, but the principles of designing good mutations, and especially good mutation result types, are not yet well-understood in the open source community. So when you are working with mutations it might often feel like you need to make a lot of application-specific decisions. + +In GraphQL, mutations can return any type, and that type can be queried just like a regular GraphQL query. So the question is - what type should a particular mutation return? + +In GraphQL itself, there isn't any specification about how this is supposed to work. In most cases, the data available from a mutation result should be the server developer's best guess of the data a client would need to understand what happened on the server. For example, a mutation that creates a new comment on a blog post might return the comment itself. A mutation that reorders an array might need to return the new array. + +In many cases, it's beneficial to have the mutation result return the _parent_ of the new object, so that the client developer can decide what data they need to update. For example, if a todo list has a computed field for the number of tasks, inserting a new task might update that as well, meaning it might be good to have the mutation return a `TodoList` type rather than a `Task` type. + +Sometimes, you might need to define a new type just for the result of a specific mutation. For example, in the todo list case, it might make sense for the result of the mutation to have two fields, and include _both_ the inserted task and the associated todo list. That way, the client can more easily refetch related data. From 9516131d33e6d0d327bbd17d7dec1daa25301374 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Thu, 21 Jul 2016 00:43:38 +0200 Subject: [PATCH 210/409] Add angular2Apollo.query() and ApolloQueryObservable (#150) Closes #129 --- docs/source/apollo-client/angular2.md | 71 +++++++++++++++++++++------ 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index e46fc9cf40b..c49d41851f4 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -75,23 +75,64 @@ class postsList {

Queries

-To bind to query you can use `watchQuery` method with the same arguments as [`ApolloClient#watchQuery`](core.html#watchQuery). In this case as the result you will receive the [`QueryObservable`](core.html#watchQuery). +To bind to query you can use `watchQuery` method with the same arguments as [`ApolloClient#watchQuery`](queries.html#watchQuery). In this case as the result you will receive the `ApolloQueryObservable`. It is an enhanced version of [`QueryObservable`](queries.html#watchQuery) that can be used with RxJS's operators. Here's how you could run a query: ```ts +import 'rxjs'; + import { - Component, - Injectable + Component } from '@angular/core'; import { - Angular2Apollo + Angular2Apollo, + ApolloQueryObservable } from 'angular2-apollo'; +import gql from 'graphql-tag'; + +@Component({ + selector: 'postsList', + templateUrl: 'client/postsList.html' +}) +class postsList { + posts: ApolloQueryObservable; + + constructor(private angularApollo : Angular2Apollo) { + this.posts = angularApollo.watchQuery({ + query: gql` + query getPosts($tag: String) { + posts(tag: $tag) { + title + } + } + `, + variables: { + tag: '1234' + } + }) + .map((post) => { + post.title = post.title.toUpperCase(); + return post; + }); + } +} +``` + +If you just want to fetch a query you can use `query` method with the same arguments as [`ApolloClient#query`](queries.html#query). In this case as the result you will receive the Promise that resolves to a [`ApolloQueryResult`](queries.html#query). + +Here's how you could run a query: + +```ts import { - Observable -} from 'rxjs/Observable'; + Component +} from '@angular/core'; + +import { + Angular2Apollo +} from 'angular2-apollo'; import gql from 'graphql-tag'; @@ -99,12 +140,11 @@ import gql from 'graphql-tag'; selector: 'postsList', templateUrl: 'client/postsList.html' }) -@Injectable() class postsList { - posts: Observable; + posts: any[] = []; constructor(private angularApollo : Angular2Apollo) { - this.posts = angularApollo.watchQuery({ + angularApollo.query({ query: gql` query getPosts($tag: String) { posts(tag: $tag) { @@ -115,14 +155,17 @@ class postsList { variables: { tag: '1234' } - }); + }) + .then(({ data }) => { + this.posts = data; + }); } } ```

Mutations

-To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](core.html#mutate). In this case as the result you will receive a promise that resolves to a GraphQLResult. +To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](mutations.html#mutate). In this case as the result you will receive a promise that resolves to a GraphQLResult. Here's how you would call a mutation and pass in arguments via variables: @@ -210,9 +253,9 @@ It allows you to define queries and mutations and to make them reactive. You can

Queries

-Each key on the object returned by `queries` function should be made up of the same possible arguments as [`ApolloClient#watchQuery`](core.html#watchQuery). +Each key on the object returned by `queries` function should be made up of the same possible arguments as [`ApolloClient#watchQuery`](queries.html#watchQuery). -The result of each query contains the same API as [`QuerySubscription`](core.html#QuerySubscription) and has the following form: +The result of each query contains the same API as [`QuerySubscription`](queries.html#QuerySubscription) and has the following form: ```js { @@ -287,7 +330,7 @@ class postsList {

Mutations

-`mutations` function returns an object made up of keys and values that are custom functions to call the mutation. The resulting function must return the same possible arguments as [`ApolloClient#mutate`](core.html#mutate) +`mutations` function returns an object made up of keys and values that are custom functions to call the mutation. The resulting function must return the same possible arguments as [`ApolloClient#mutate`](mutations.html#mutate) Since `mutations` function receives one argument which is a component's context you can use it to inside variables. It is also reactive so your variables will be always up to date. From bdb9bceec2f33f11c652a8240526505083418770 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 20 Jul 2016 15:56:55 -0700 Subject: [PATCH 211/409] optimistic ui text --- docs/source/apollo-client/mutations.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index b8363730523..53905dfb18e 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -128,6 +128,28 @@ If the new object doesn't appear in any relations to other objects, and the Apol For example, say you have a query with a flat list list of `TodoList`s. Later, after clicking a "new todo-list" button the mutation `createNewTodoList(name: String!)` was fired. If `createNewTodoList` mutation returns a new `TodoList` object, then it will be incorporated into store and updated in active queries automatically. +

Optimistic Results

+ +Sometimes your client code can easily predict the result of the mutation, if it succeeds, even before the server responds with the result. When a user clicks a button "add new task", you want to add the new task to the list immediately, without waiting for the 300ms round-trip latency, giving the users the feeling of a snappy UI. This is what we call [Optimistic UI](http://info.meteor.com/blog/optimistic-ui-with-meteor-latency-compensation). This is possible if the client can predict an *Optimistic Response* for the mutation. + +Apollo Client gives you a way to specify the `optimisticResponse` option, that will be used to update active queries immediately. Once the actual mutation response returns, the optimistic part will be thrown away and replaced with the real result. + +For the example above, it is easy to construct an optimistic response, since we know the text field of the new task, we know that it is created not completed, and can approximately predict the created date. The optimistic response doesn't have to be exactly correct, but should be close enough to trick users into thinking it is legitimate. + +```js +client.mutate({ + mutation: ..., + variables: ..., + updateQueries: ..., + optimisticResponse: { + id: generatedId, + text: text, + createdAt: new Date, + completed: false, + }, +}); +``` +

Designing mutation results

From 42de26e9455dbf0b2195ba6b8d92b3cfb9b5d3e8 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 20 Jul 2016 16:08:00 -0700 Subject: [PATCH 212/409] clarify query name --- docs/source/apollo-client/mutations.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index 53905dfb18e..d044f95babe 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -62,12 +62,11 @@ Depending on how complicated are your queries, the logic incorporating the mutat For example, let's say you have a mutation `addNewTask(text: String!, list_id: ID!)` that adds a new task of type `Task` to a `TodoList` currently displayed on the screen. In this example, to update a query with the new task returned by the mutation, it is required to insert the new task into the correct place in the list of tasks. -For cases like these, use the special option `updateQueries`. `updateQueries` is a mapping from query name to a reducer function. +For cases like these, use the special option `updateQueries`. `updateQueries` is a mapping from query name to a reducer function. The query name goes between the `query` keyword and the declaration of variables (in the example below it is `todos`). Each reducer function accepts the old result of the query and the new information such that the mutation result. The job of the reducer function is to return a new query result. ```js - client.watchQuery({ query: gql` query todos($list_id: ID!) { From 9d57c3fd7083a4712cb50eb5a51939f7a9b5ed03 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 20 Jul 2016 16:12:07 -0700 Subject: [PATCH 213/409] edits to mutations --- docs/source/apollo-client/mutations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index d044f95babe..05c82d0af0f 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -133,7 +133,7 @@ Sometimes your client code can easily predict the result of the mutation, if it Apollo Client gives you a way to specify the `optimisticResponse` option, that will be used to update active queries immediately. Once the actual mutation response returns, the optimistic part will be thrown away and replaced with the real result. -For the example above, it is easy to construct an optimistic response, since we know the text field of the new task, we know that it is created not completed, and can approximately predict the created date. The optimistic response doesn't have to be exactly correct, but should be close enough to trick users into thinking it is legitimate. +For the example above, it is easy to construct an optimistic response, since we know the text field of the new task, we know that it is created not completed, and can approximately predict the created date. The optimistic response doesn't have to be exactly correct because it will always will be replaced with the real result from the server. But it should be close enough to make users feel like there is no delay. ```js client.mutate({ From bf7191ee6772d74eb4145269668b99332cddf5ae Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Wed, 20 Jul 2016 16:14:15 -0700 Subject: [PATCH 214/409] Update mutations.md --- docs/source/apollo-client/mutations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index 05c82d0af0f..23ce9ba30bf 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -52,7 +52,7 @@ client.mutate({ Mutations can get a bit verbose because you often need to pass in variables for a lot of different arguments, and those need to be declared in several places. This is inherent to the design of GraphQL itself, but future versions of Apollo Client may contain helpers to reduce the necessary boilerplate. In an ideal world, GraphQL itself would make variable type declarations optional. -

Updating Query results

+

Updating Query results

In Apollo Client, there is a special system that allows mutations to update the results of the active queries. Active queries are bound to your UI components via `watchQuery` or any of the view integrations. These UI components will automatically re-render as updated queries are updated. From e1e77168e31926ce9c732912d6c2c2a2ff7cc3a4 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Thu, 21 Jul 2016 16:59:35 +1000 Subject: [PATCH 215/409] Get rid of slightly weird "300ms round trip" --- docs/source/apollo-client/mutations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index 23ce9ba30bf..f35d623a372 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -129,7 +129,7 @@ For example, say you have a query with a flat list list of `TodoList`s. Later, a

Optimistic Results

-Sometimes your client code can easily predict the result of the mutation, if it succeeds, even before the server responds with the result. When a user clicks a button "add new task", you want to add the new task to the list immediately, without waiting for the 300ms round-trip latency, giving the users the feeling of a snappy UI. This is what we call [Optimistic UI](http://info.meteor.com/blog/optimistic-ui-with-meteor-latency-compensation). This is possible if the client can predict an *Optimistic Response* for the mutation. +Sometimes your client code can easily predict the result of the mutation, if it succeeds, even before the server responds with the result. When a user clicks a button "add new task", you want to add the new task to the list immediately, without waiting on the latency of a round trip to the server, giving the users the feeling of a snappy UI. This is what we call [Optimistic UI](http://info.meteor.com/blog/optimistic-ui-with-meteor-latency-compensation). This is possible if the client can predict an *Optimistic Response* for the mutation. Apollo Client gives you a way to specify the `optimisticResponse` option, that will be used to update active queries immediately. Once the actual mutation response returns, the optimistic part will be thrown away and replaced with the real result. From d208caa2012f62dc391feefc371e614a8caa0586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20H=C3=A5kansson?= Date: Thu, 21 Jul 2016 20:16:47 +0200 Subject: [PATCH 216/409] Add documentation regarding afterwares (#151) --- docs/source/apollo-client/index.md | 78 ++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/docs/source/apollo-client/index.md b/docs/source/apollo-client/index.md index aa1f75c2c9f..562325b1372 100644 --- a/docs/source/apollo-client/index.md +++ b/docs/source/apollo-client/index.md @@ -188,6 +188,84 @@ const client = new ApolloClient({ Given the above code, the header's `Authorization` value will be that of `token2`. This example shows how you can use more than one middleware to make multiple/separate modifications to the request being processed in the form of a chain. This example doesn't show the use of `localStorage`, but is instead just meant to demonstrate the use of more than one middleware, passed to `.use()` as an array. +

Afterware

+A afterware is very similar to a middleware, except that a afterware runs after a request has been made, +that is when a response is going to get processed. + +It is possible to use afterware with the network interface created via `createNetworkInterface`. +In order to do so, you must pass an array of objects into the interface created with `createNetworkInterface()`. +Each object must contain an `applyAfterware` method with the following parameters: + +- `response: object` The HTTP response object that a response resturns. +- `next: function` This function pushes the HTTP response onward through the afterware. + +This example shows how you'd create a afterware. +It can be done either by providing the required object directly to `.useAfter()` +or by creating an object and passing it to `.useAfter()`. +In both cases all afterware objects have to be wrapped inside an array. + +Below are some examples of using afterwares. + +```js +import ApolloClient, { createNetworkInterface } from 'apollo-client'; +import {logout} from './logout'; + +const networkInterface = createNetworkInterface('/graphql'); + +networkInterface.useAfter([{ + applyAfterware(response, next) { + if (response.status === 401) { + logout(); + } + next(); + } +}]); + +const client = new ApolloClient({ + networkInterface, +}); +``` + +The above example shows the use of a single afterware passed directly to `.useAfter()`. +It checks to see if the response status code is equal to 401 and if it is then we will +logout the user from the application. + +The following example shows the use of multiple afterwares passed as an array: + +```js +import ApolloClient, { createNetworkInterface } from 'apollo-client'; +import {redirectTo} from './redirect'; + +const networkInterface = createNetworkInterface('/graphql'); + +const exampleWare1 = { + applyAfterware(response, next) { + if (response.status === 500) { + console.error('Server returned an error'); + } + next(); + } +} + +const exampleWare2 = { + applyAfterware(response, next) { + if (response.status === 200) { + redirectTo('/'); + } + next(); + } +} + +networkInterface.useAfter([exampleWare1, exampleWare2]); + +const client = new ApolloClient({ + networkInterface, +}); +``` + +This example shows how you can use more than one afterware to make multiple/separate +modifications to the response being processed in the form of a chain. +

CORS support

If your GraphQL server and client application are running on different origins, you will get HTTP 405 errors thrown by the client. This happens when receiving the response from the server which is denying the request because of CORS. The client is working as designed. CORS support should be enabled in the apollo-server instance. How to do this is documented in the [apollo-server section](/apollo-server/tools.html#corsSupport). From d1fc8bf4838ecde63defa6c2654399e532809fd0 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Fri, 22 Jul 2016 10:39:22 -0700 Subject: [PATCH 217/409] Edits on updated fields --- docs/source/apollo-client/mutations.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index f35d623a372..d7235cd79d0 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -119,13 +119,11 @@ This means that reducer functions: - must avoid mutating the arguments, such that previous query result, and prefer cloning - should have no side effects -

New Object Or Updated Fields

+

Updated Fields

-In cases when your mutation returns either a completely new object (with a uniquely new `id`) or a new value for an existing object with some fields updated, you might avoid writing any queries updating code at all. +In cases when your mutation returns a new value for an existing object with some fields updated, you might avoid writing any queries updating code at all. As long as your instance of Apollo Client has [`dataIdFromObject`](/apollo-client/index.html#ApolloClient) option defined, the occurrences of the object (matching by the generated id) in the active queries will be updated automatically without any extra code. -If the new object doesn't appear in any relations to other objects, and the Apollo Client has [`dataIdFromObject`](/apollo-client/index.html#ApolloClient) option defined, the occurrences of the object in the active queries will be updated automatically without any extra code. - -For example, say you have a query with a flat list list of `TodoList`s. Later, after clicking a "new todo-list" button the mutation `createNewTodoList(name: String!)` was fired. If `createNewTodoList` mutation returns a new `TodoList` object, then it will be incorporated into store and updated in active queries automatically. +For example, say you have a query with a flat list list of `TodoList`s. Later, after editing the name of one of lists, the mutation `changeTodoListName(list_id: ID!, name: String!)` was fired. If `changeTodoListName` mutation returns the `TodoList` object with the same id and updated fields, then it will be incorporated into store and updated in active queries automatically.

Optimistic Results

@@ -143,7 +141,7 @@ client.mutate({ optimisticResponse: { id: generatedId, text: text, - createdAt: new Date, + createdAt: +(new Date), completed: false, }, }); From 4116747097b87e4d4372b699c87bd462bbd8e9f2 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Thu, 28 Jul 2016 12:24:11 -0400 Subject: [PATCH 218/409] Move apollo demo to Meteor section --- docs/source/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.md b/docs/source/index.md index 97bc25eb203..a4a764b8d1c 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -30,7 +30,6 @@ We have put together some basic example apps using various parts of Apollo; chec ### General JS Examples - [Githunt - A full-stack Apollo Client and Server example app that uses React, Webpack, Babel, and Redux](https://github.com/apollostack/GitHunt) - [Githunt written in Angular 2](https://github.com/apollostack/GitHunt-angular2) -- [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) - [A GraphQL server example that uses SQL, MongoDB + REST](https://github.com/apollostack/apollo-server-tutorial) - [A simple GraphQL blog that uses Feathersjs for managing database services](https://github.com/swarthout/feathers-apollo) - [A fork of Facebook's F8 React Native app that uses Apollo](https://github.com/nnance/f8app-apollo) @@ -42,3 +41,4 @@ We have put together some basic example apps using various parts of Apollo; chec - [Instagram Recent Search](https://github.com/abhiaiyer91/meteor-instagram-apollo) - [Shopping Cart](https://github.com/abhiaiyer91/meteor-pg-apollo-shopping-cart) - [A Meteor Integration example that uses SQL, MongoDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) +- [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) From bf81bc454de365972a84fec02bfa22af4264d695 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Thu, 28 Jul 2016 18:32:36 -0700 Subject: [PATCH 219/409] Add Connect integration --- docs/source/apollo-server/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md index bc56f6f5233..c3a62b61b9e 100644 --- a/docs/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -4,7 +4,7 @@ order: 301 description: How to install Apollo Server --- -Apollo Server is a GraphQL server for Node.js built to be run in production. It has integrations for Express, HAPI and Koa. +Apollo Server is a GraphQL server for Node.js built to be run in production. It has integrations for Express, Connect, HAPI and Koa. ```txt From 26f6377a82d5862493609d7892e53effdf34f2af Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 29 Jul 2016 17:44:15 -0700 Subject: [PATCH 220/409] write documentation for makeExecutableSchema --- docs/source/graphql-tools/generate-schema.md | 29 ++++++++++++-------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/docs/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md index 2a816e5db72..52e1fe9ebf3 100644 --- a/docs/source/graphql-tools/generate-schema.md +++ b/docs/source/graphql-tools/generate-schema.md @@ -4,19 +4,28 @@ order: 204 description: Generate a GraphQL schema from the concise type definition language. --- -The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `generateSchema`. +The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `makeExecutableSchema`. -

generateSchema(typeDefinitions, resolveFunctions)

+

makeExecutableSchema(typeDefs, resolvers)

``` -import { generateSchema } from 'graphql-tools'; - -const jsSchema = generateSchema(typeDefinitions, resolveFunctions ); +import { makeExecutableSchema } from 'graphql-tools'; + +const jsSchema = makeExecutableSchema( + typeDefinitions, + resolveFunctions, + allowUndefinedInResolve = false, //optional + resolverValidationOptions = {}, //optional +); ``` -`typeDefinitions` should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. +`typeDefinitions` is a required argument and should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. + +`resolveFunctions` is a required argument and should be an object that follows the pattern explained in the guide [section on resolvers](http://docs.apollostack.com/apollo-server/resolvers.html). -`resolveFunctions` should be an object that follows the pattern explained in the guide [section on resolvers](http://docs.apollostack.com/apollo-server/resolvers.html). +`allowUndefinedInResolve` is an optional argument, which is `false` by default, and causes your resolve function to throw an error, if they return undefined. This can help make debugging easier. To get the default behavior of GraphQL, set this option to `true`. + +`resolverValidationOptions` is an optional argument which accepts an object of the following shape: `{ requireResolversForArgs, requireResolversForNonScalar }`. If set to true, `requireResolversForArgs` will cause `makeExecutableSchema` to throw an error, if no resolve function is defined for a field that has arguments. Similarly, `requireResolversForNonScalar` will cause `makeExecutableSchema` to throw an error if a non-scalar field has no resolver defined. By default, both of these are true, which can help catch errors faster. To get the normal behavior of GraphQL, set both of them to `false`. The type definitions must define a query type, which means a minimal schema would look something like this: ```js @@ -29,11 +38,9 @@ const typeDefinition = [` aNumber: Int } `]; - -const jsSchema = generateSchema(typeDefinition); ``` -If your schema gets large, you may want to define parts of it in different files and import them to create the full schema. This is possible by including them in the array. If there are circular dependencies, the array should be wrapped in arrow function. `generateSchema` will only include each type definition once, even if it is imported multiple times by different types. +If your schema gets large, you may want to define parts of it in different files and import them to create the full schema. This is possible by including them in the array. If there are circular dependencies, the array should be wrapped in arrow function. `makeExecutableSchema` will only include each type definition once, even if it is imported multiple times by different types. ```js // in author.js ------------------- @@ -75,7 +82,7 @@ const SchemaDefinition = ` } `; -export default generateSchema([SchemaDefinition, RootQuery, Author]); +export default makeExecutableSchema([SchemaDefinition, RootQuery, Author], {}); ``` This [GraphQL schema language cheat sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png) by Hafiz Ismail is an excellent reference for all the features of the GraphQL schema language. From b87d0808f94a782051bb0dfd5f98fb1fc46b842a Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Fri, 29 Jul 2016 17:55:05 -0700 Subject: [PATCH 221/409] write better landing page for apollo server --- docs/source/apollo-server/index.md | 12 ++++++------ docs/source/apollo-server/setup.md | 5 +++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md index c3a62b61b9e..63c0194ad6e 100644 --- a/docs/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -4,15 +4,15 @@ order: 301 description: How to install Apollo Server --- -Apollo Server is a GraphQL server for Node.js built to be run in production. It has integrations for Express, Connect, HAPI and Koa. +Apollo Server is a community driven, hackable GraphQL server for production use. You can use it with Express, Connect, HAPI and Koa. ```txt npm install apollo-server ``` -Apollo Server comes with a set of features that make it ideal for running in production: -- Simple external interface: reduces potential attack surface by only allowing one request format -- Separation of concerns: reduces complexity (eg. by serving GraphiQL on a separate path) -- Query batching: makes the server more performant by reducing roundtrips -- Query whitelisting: increases security, reduces bandwidth, saves parsing and validation time +Apollo Server differs from express-graphql in the following ways: +- It has a simpler interface and allows only POST requests, which makes the server easier to understand and secure. +- Apollo Server serves GraphiQL on a separate route, which reduces complexity. +- Apollo Server supports query batching which can make your app faster by reducing roundtrips. +- Apollo Server has built-in support for query whitelisting, which can make your app faster and your server more secure. diff --git a/docs/source/apollo-server/setup.md b/docs/source/apollo-server/setup.md index 503393e5933..3e7eed01b5f 100644 --- a/docs/source/apollo-server/setup.md +++ b/docs/source/apollo-server/setup.md @@ -4,7 +4,9 @@ order: 302 description: How to set up Apollo Server --- -Apollo Server exports `apolloExpress`, which can be used as a drop-in Express middleware to turn your server into a GraphQL server. +Apollo Server exports `apolloExpress`, `apolloConnect`, `apolloHAPI` and `apolloKoa` which can be used as a drop-in to turn your Express, Connect, HAPI or Koa server into a GraphQL server. + +The example below uses `apolloExpress`, but the options object is the same for all other integrations.

ApolloExpress(options)

@@ -29,7 +31,6 @@ apolloExpress({ rootValue?: any, formatError?: Function, // function used to format errors before returning them to clients validationRules?: Array, // additional validation rules to be applied to client-specified queries - logFunction?: Function, // function called for logging errors and info formatParams?: Function, // function applied for each query in a batch to format parameters before passing them to `runQuery` formatResponse?: Function, // function applied to each response before returning data to clients }) From 4c02c0ea0acf453740001886001a02a9aed46fb8 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Sat, 30 Jul 2016 08:47:44 -0700 Subject: [PATCH 222/409] clarify comparison between express-graphql and apollo-server --- docs/package.json | 2 +- docs/source/apollo-server/index.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/package.json b/docs/package.json index a95c0828d1d..77964d3e8db 100644 --- a/docs/package.json +++ b/docs/package.json @@ -23,4 +23,4 @@ "start": "hexo serve", "deploy": "hexo-s3-deploy" } -} \ No newline at end of file +} diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md index 63c0194ad6e..1844f16835c 100644 --- a/docs/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -12,7 +12,7 @@ npm install apollo-server ``` Apollo Server differs from express-graphql in the following ways: -- It has a simpler interface and allows only POST requests, which makes the server easier to understand and secure. -- Apollo Server serves GraphiQL on a separate route, which reduces complexity. -- Apollo Server supports query batching which can make your app faster by reducing roundtrips. +- It has a simpler interface and allows only POST requests, which makes it a bit easier to reason about what's going on. +- Apollo Server serves GraphiQL on a separate route, giving you more flexibility to decide when and how to expose it. +- Apollo Server supports query batching which can help reduce load on your server. - Apollo Server has built-in support for query whitelisting, which can make your app faster and your server more secure. From c2b4910cb21235f4c644ef1a4d9de82a708c6eb5 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 1 Aug 2016 11:27:19 -0700 Subject: [PATCH 223/409] add examples for each server --- docs/_config.yml | 1 + docs/package.json | 4 +- docs/source/apollo-server/graphiql.md | 71 +++++++++--- docs/source/apollo-server/index.md | 2 +- docs/source/apollo-server/migration.md | 2 +- docs/source/apollo-server/setup.md | 144 +++++++++++++++---------- 6 files changed, 148 insertions(+), 76 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index e6d0dda7347..cbd991f71ea 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -30,6 +30,7 @@ sidebar_categories: Apollo Server: - apollo-server/index - apollo-server/setup + - apollo-server/requests - apollo-server/graphiql - apollo-server/migration GraphQL Tools: diff --git a/docs/package.json b/docs/package.json index 77964d3e8db..6d539cda797 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "hexo": { - "version": "3.2.2" + "version": "3.2.0" }, "dependencies": { "hexo": "^3.1.0", @@ -23,4 +23,4 @@ "start": "hexo serve", "deploy": "hexo-s3-deploy" } -} +} \ No newline at end of file diff --git a/docs/source/apollo-server/graphiql.md b/docs/source/apollo-server/graphiql.md index 4238fbf05b4..3e279a62704 100644 --- a/docs/source/apollo-server/graphiql.md +++ b/docs/source/apollo-server/graphiql.md @@ -1,31 +1,76 @@ --- title: GraphiQL -order: 303 +order: 304 description: How to set up GraphiQL with Apollo Server --- -Apollo Server allows you to easily use [GraphiQL](https://github.com/graphql/graphiql). If you are using Express, it can be configured as follows: +Apollo Server allows you to easily use [GraphiQL](https://github.com/graphql/graphiql). Here's how: -```js -import { graphiqlExpress } from 'apollo-server'; - -app.use('/graphiql', graphiqlExpress({ - endpointURL: '/graphql', -})); -``` +

Configuring GraphiQL

-`graphiqlExpress` accepts the following arguments: +`graphiql` accepts the following options object: ```js -graphiqlExpress({ +const options = { endpointUrl: String, // URL for the GraphQL endpoint this instance of GraphiQL serves query?: String, // optional query to pre-populate the GraphiQL UI with operationName?: String, // optional operationName to pre-populate the GraphiQL UI with variables?: Object, // optional variables to pre-populate the GraphiQL UI with result?: Object, // optional result to pre-populate the GraphiQL UI with -}) +} ``` -`graphiqlExpress` does not run any query passed to it, it simply renders it in the UI. +Apollo Server's `graphiql` middleware does not run any query passed to it, it simply renders it in the UI. To actually execute the query, the user must submit it via the GraphiQL UI, which will send the request to the GraphQL endpoint specified with `endpointURL`. + +

Using with Express

+ +If you are using Express, GraphiQL can be configured as follows: + +```js +import { graphiqlExpress } from 'apollo-server'; + +app.use('/graphiql', graphiqlExpress({ + endpointURL: '/graphql', +})); +``` + + +

Using with Connect

+ +If you are using Connect, GraphiQL can be configured as follows: + +```js +import { graphiqlConnect } from 'apollo-server'; + +app.use('/graphiql', graphiqlConnect({ + endpointURL: '/graphql', +})); +``` + + +

Using with HAPI

+ +If you are using HAPI, GraphiQL can be configured as follows: + +```js +import { graphqlHAPI } from 'apollo-server'; + +server.register({ + register: new GraphiQLHAPI(), + options: { endpointURL: '/graphql' }, + routes: { prefix: '/graphiql' }, +}); +``` + + +

Using with Koa

+ +If you are using Koa, GraphiQL can be configured as follows: + +```js +import { graphiqlKoa } from 'apollo-server'; + +router.get('/graphiql', graphiqlKoa({ endpointURL: '/graphql' })); +``` diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md index 1844f16835c..3f7da9559a7 100644 --- a/docs/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -11,7 +11,7 @@ Apollo Server is a community driven, hackable GraphQL server for production use. npm install apollo-server ``` -Apollo Server differs from express-graphql in the following ways: +Here are the main differences between Apollo Server and express-graphql: - It has a simpler interface and allows only POST requests, which makes it a bit easier to reason about what's going on. - Apollo Server serves GraphiQL on a separate route, giving you more flexibility to decide when and how to expose it. - Apollo Server supports query batching which can help reduce load on your server. diff --git a/docs/source/apollo-server/migration.md b/docs/source/apollo-server/migration.md index 156f7e9aaba..c169b8db036 100644 --- a/docs/source/apollo-server/migration.md +++ b/docs/source/apollo-server/migration.md @@ -1,6 +1,6 @@ --- title: Migrating from v0.1 -order: 304 +order: 305 description: How to migrate from an older version of Apollo Server --- diff --git a/docs/source/apollo-server/setup.md b/docs/source/apollo-server/setup.md index 3e7eed01b5f..5c895a8b6a4 100644 --- a/docs/source/apollo-server/setup.md +++ b/docs/source/apollo-server/setup.md @@ -6,26 +6,14 @@ description: How to set up Apollo Server Apollo Server exports `apolloExpress`, `apolloConnect`, `apolloHAPI` and `apolloKoa` which can be used as a drop-in to turn your Express, Connect, HAPI or Koa server into a GraphQL server. -The example below uses `apolloExpress`, but the options object is the same for all other integrations. -

ApolloExpress(options)

+

ApolloOptions

-```js -import { apolloExpress } from 'apollo-server'; - -var app = express(); - -app.use('/graphql', bodyParser.json(), apolloExpress({ schema: myGraphQLSchema})); -``` - -The `options` may be either: -- an ApolloOptions object object with the parameters specified below -- a function that, given an Express [`request`](http://expressjs.com/en/4x/api.html#req), returns an ApolloOptions object -- a function that, given an Express [`request`](http://expressjs.com/en/4x/api.html#req), returns a promise for an ApolloOptions object +Apollo Server accepts an ApolloOptions object as its single argument: ```js // options object -apolloExpress({ +const options = { schema: GraphQLSchema, context?: any, // value to be used as context in resolvers rootValue?: any, @@ -34,76 +22,114 @@ apolloExpress({ formatParams?: Function, // function applied for each query in a batch to format parameters before passing them to `runQuery` formatResponse?: Function, // function applied to each response before returning data to clients }) +``` + + +Alternatively, Apollo Server accepts a function which takes the request as input and returns a promise for an ApolloOptions object: + +```js // example options function -apolloExpress(request => ({ +apollo(request => ({ schema: typeDefinitionArray, context: { user: request.session.user } })) ``` -

Sending Requests

+

Using with Express

-ApolloExpress accepts only JSON-encoded POST requests. A valid request must contain eiter a `query` or an `operationName`, and may include `variables.` For example: +The following code snippet shows how to use Apollo Server with Express: ```js -{ - "query": "query aTest{ test(who: $arg1) }", - "operationName": "aTest", - "variables": { "arg1": "me" } -} -``` +import express from 'express'; +import { apolloExpress } from 'apollo-server'; -Variables can be an object or a JSON-encoded string. I.e. the following is equivalent to the previous query: +const PORT = 3000; -```js -{ - "query": "query aTest{ test(who: $arg1) }", - "operationName": "aTest", - "variables": "{ \"arg1\": \"me\" }" -} +var app = express(); + +app.use('/graphql', bodyParser.json(), apolloExpress({ schema: myGraphQLSchema })); + +app.listen(PORT); ``` -A batch of queries can be sent by simply sending a JSON-encoded array of queries, e.g. +The `options` passed to `apolloExpress` may be either: +- an ApolloOptions object object with the parameters specified above +- a function that, given an Express [`request`](http://expressjs.com/en/4x/api.html#req), returns an ApolloOptions object +- a function that, given an Express [`request`](http://expressjs.com/en/4x/api.html#req), returns a promise for an ApolloOptions object + +

Using with Connect

+ +The following code snippet shows how to use Apollo Server with Connect: ```js -[ - { "query": "{ testString }" }, - { "query": "query q2{ test(who: \"you\" ) }" } -] +import connect from 'express'; +import { apolloConnect } from 'apollo-server'; + +const PORT = 3000; + +var app = connect(); + +app.use('/graphql', bodyParser.json(), apolloConnect({ schema: myGraphQLSchema })); + +app.listen(PORT); ``` -If a batch of queries is sent, the response will be an array of GraphQL responses. +The `options` passed to `apolloConnect` are the same as those passed to `apolloExpress`. -

CORS support

-If Apollo Server runs under a different origin than the frontend app, then CORS support must be configured on the server. For example, if apollo server is running under `graphql.example.com` and the website is served from `www.example.com`, CORS needs to be configured in the express app. [CORS](https://github.com/expressjs/cors) is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options. +

Using with HAPI

-```javascript -import { apolloExpress } from 'apollo-server'; -import cors from 'cors'; +The following code snippet shows how to use Apollo Server with HAPI: -var app = express().use('*', cors());; +```js +import hapi from 'hapi'; + +const server = new hapi.Server(); + +const HOST = 'localhost'; +const PORT = 3000; + +server.connection({ + host: HOST, + port: PORT, +}); + +server.register({ + register: new ApolloHAPI(), + options: { schema: myGraphQLSchema }, + routes: { prefix: '/graphql' }, +}); ``` -Ensure you have npm installed cors. The * value allows access from any third-party site. It should probably be updated to reflect your specific environment. Simple usage details to [Enable All CORS Requests](https://github.com/expressjs/cors#simple-usage-enable-all-cors-requests) More complex configuration options are available including the ability to [Enable CORS for a Single Route](https://github.com/expressjs/cors#enable-cors-for-a-single-route). +The `options` passed to `apolloHAPI` may be either: +- an ApolloOptions object object with the parameters specified above +- a function that, given a Node.js request object, returns an ApolloOptions object +- a function that, given a Node.js request object, returns a promise for an ApolloOptions object -The information contained in the apolloClient re: CORS configuration did not effect on the server. -

Authentication Tokens

+

Using with Koa

-Authentication tokens sent from the client can be retrieved, processed, and then passed into context to be accessed by resolvers like so: -```javascript -app.use('/graphql', apolloExpress(async (req) => { - // Retrieve token from authorization header and lookup user in DB - const user = await models.mongoose.users.fromToken(req.headers.authorization); +The following code snippet shows how to use Apollo Server with Koa: - return { - context: { - // Attach user data to context - user, - } - } -})); -// ... +```js +import koa from 'koa'; +import koaRouter from 'koa-router'; +import { apolloKoa } from 'apollo-server'; + +const app = new koa(); +const router = new koaRouter(); +const PORT = 3000; + +app.use(koaBody()); + +router.post('/graphql', apolloKoa({ schema: myGraphQLSchema })); +app.use(router.routes()); +app.use(router.allowedMethods()); +app.listen(PORT); ``` + +The `options` passed to `apolloKoa` may be either: +- an ApolloOptions object object with the parameters specified above +- a function that, given a Node.js request object, returns an ApolloOptions object +- a function that, given a Node.js request object, returns a promise for an ApolloOptions object From a572d687e3608d7845124d8177df6c21f7266024 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 1 Aug 2016 11:27:42 -0700 Subject: [PATCH 224/409] move requests stuff to its own item --- docs/source/apollo-server/requests.md | 38 +++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/source/apollo-server/requests.md diff --git a/docs/source/apollo-server/requests.md b/docs/source/apollo-server/requests.md new file mode 100644 index 00000000000..6984b32626f --- /dev/null +++ b/docs/source/apollo-server/requests.md @@ -0,0 +1,38 @@ +--- +title: Sending requests +order: 303 +description: How to send requests to Apollo Server +--- + +Apollo Server accepts only JSON-encoded POST requests. A valid request must contain eiter a `query` or an `operationName`, and may include `variables.` For example: + +```js +{ + "query": "query aTest{ test(who: $arg1) }", + "operationName": "aTest", + "variables": { "arg1": "me" } +} +``` + +Variables can be an object or a JSON-encoded string. I.e. the following is equivalent to the previous query: + +```js +{ + "query": "query aTest{ test(who: $arg1) }", + "operationName": "aTest", + "variables": "{ \"arg1\": \"me\" }" +} +``` + +A batch of queries can be sent by simply sending a JSON-encoded array of queries, e.g. + +```js +[ + { "query": "{ testString }" }, + { "query": "query q2{ test(who: \"you\" ) }" } +] +``` + +If a batch of queries is sent, the response will be an array of GraphQL responses. + +If Apollo Server is running under a different origin than your client, you will need to enable CORS support, or proxy the GraphQL requests through a web server under the main origin. From bc3edb384225cb8206ed414a72787179d38dbe0a Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Mon, 1 Aug 2016 23:50:13 -0700 Subject: [PATCH 225/409] Fix broken docs (#155) I believe these were wrong, but please double-check before merging @jbaxleyiii --- docs/source/apollo-client/react.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index c88a6ec47fd..165bb9f1c39 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -151,7 +151,7 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa loading: boolean, errors: Error[], refetch: Function(variables), - getCategory: Data // only when the query has returned + category: Data // only when the query has returned } ``` @@ -161,7 +161,7 @@ Each key on the object returned by mapQueriesToProps should be made up of the sa { loading: boolean, errors: Error[], - postReply: Data, // only when the mutation has returned + createPost: Data, // only when the mutation has returned } ``` From 7dacae82e9da642728ce00f89ccd43f609f5dd82 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Tue, 2 Aug 2016 10:26:55 -0700 Subject: [PATCH 226/409] edits based on Tom's feedback --- docs/source/apollo-server/index.md | 8 +++---- docs/source/apollo-server/requests.md | 4 ++-- docs/source/apollo-server/setup.md | 25 ++++---------------- docs/source/graphql-tools/generate-schema.md | 5 ++++ 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/docs/source/apollo-server/index.md b/docs/source/apollo-server/index.md index 3f7da9559a7..f4a76cc2898 100644 --- a/docs/source/apollo-server/index.md +++ b/docs/source/apollo-server/index.md @@ -4,15 +4,15 @@ order: 301 description: How to install Apollo Server --- -Apollo Server is a community driven, hackable GraphQL server for production use. You can use it with Express, Connect, HAPI and Koa. +Apollo Server is a community driven, flexible JavaScript GraphQL server for production use. You can use it with Express, Connect, HAPI and Koa. ```txt npm install apollo-server ``` -Here are the main differences between Apollo Server and express-graphql: -- It has a simpler interface and allows only POST requests, which makes it a bit easier to reason about what's going on. +The following features distinguish Apollo Server from the reference implementation (express-graphql): +- Apollo Server has a simpler interface and allows only POST requests, which makes it a bit easier to reason about what's going on. - Apollo Server serves GraphiQL on a separate route, giving you more flexibility to decide when and how to expose it. -- Apollo Server supports query batching which can help reduce load on your server. +- Apollo Server supports [query batching](https://medium.com/apollo-stack/query-batching-in-apollo-63acfd859862) which can help reduce load on your server. - Apollo Server has built-in support for query whitelisting, which can make your app faster and your server more secure. diff --git a/docs/source/apollo-server/requests.md b/docs/source/apollo-server/requests.md index 6984b32626f..6ac4e928b5e 100644 --- a/docs/source/apollo-server/requests.md +++ b/docs/source/apollo-server/requests.md @@ -4,7 +4,7 @@ order: 303 description: How to send requests to Apollo Server --- -Apollo Server accepts only JSON-encoded POST requests. A valid request must contain eiter a `query` or an `operationName`, and may include `variables.` For example: +Apollo Server accepts only JSON-encoded POST requests. A valid request must contain eiter a `query` or an `operationName` (or both, in case of a named query), and may include `variables.` For example: ```js { @@ -35,4 +35,4 @@ A batch of queries can be sent by simply sending a JSON-encoded array of queries If a batch of queries is sent, the response will be an array of GraphQL responses. -If Apollo Server is running under a different origin than your client, you will need to enable CORS support, or proxy the GraphQL requests through a web server under the main origin. +If Apollo Server is running under a different origin than your client, you will need to enable CORS support on the server, or proxy the GraphQL requests through a web server under the main origin. diff --git a/docs/source/apollo-server/setup.md b/docs/source/apollo-server/setup.md index 5c895a8b6a4..40c37c0898b 100644 --- a/docs/source/apollo-server/setup.md +++ b/docs/source/apollo-server/setup.md @@ -9,11 +9,11 @@ Apollo Server exports `apolloExpress`, `apolloConnect`, `apolloHAPI` and `apollo

ApolloOptions

-Apollo Server accepts an ApolloOptions object as its single argument: +Apollo Server accepts an ApolloOptions object as its single argument. An ApolloOptions object has the following properties: ```js // options object -const options = { +const ApolloOptions = { schema: GraphQLSchema, context?: any, // value to be used as context in resolvers rootValue?: any, @@ -25,12 +25,12 @@ const options = { ``` -Alternatively, Apollo Server accepts a function which takes the request as input and returns a promise for an ApolloOptions object: +Alternatively, Apollo Server accepts a function which takes the request as input and returns an ApolloOptions object (or a promise for one): ```js -// example options function -apollo(request => ({ +// example options function (for express) +apolloExpress(request => ({ schema: typeDefinitionArray, context: { user: request.session.user } })) @@ -53,11 +53,6 @@ app.use('/graphql', bodyParser.json(), apolloExpress({ schema: myGraphQLSchema } app.listen(PORT); ``` -The `options` passed to `apolloExpress` may be either: -- an ApolloOptions object object with the parameters specified above -- a function that, given an Express [`request`](http://expressjs.com/en/4x/api.html#req), returns an ApolloOptions object -- a function that, given an Express [`request`](http://expressjs.com/en/4x/api.html#req), returns a promise for an ApolloOptions object -

Using with Connect

The following code snippet shows how to use Apollo Server with Connect: @@ -102,11 +97,6 @@ server.register({ }); ``` -The `options` passed to `apolloHAPI` may be either: -- an ApolloOptions object object with the parameters specified above -- a function that, given a Node.js request object, returns an ApolloOptions object -- a function that, given a Node.js request object, returns a promise for an ApolloOptions object -

Using with Koa

@@ -128,8 +118,3 @@ app.use(router.routes()); app.use(router.allowedMethods()); app.listen(PORT); ``` - -The `options` passed to `apolloKoa` may be either: -- an ApolloOptions object object with the parameters specified above -- a function that, given a Node.js request object, returns an ApolloOptions object -- a function that, given a Node.js request object, returns a promise for an ApolloOptions object diff --git a/docs/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md index 52e1fe9ebf3..2da1046a92e 100644 --- a/docs/source/graphql-tools/generate-schema.md +++ b/docs/source/graphql-tools/generate-schema.md @@ -53,8 +53,11 @@ const Author = ` } `; +// we export have to export Author and all types it depends on in order to make it reusable export default () => [Author, Book]; +``` +```js // in book.js ----------------------- import Author from './author'; @@ -66,7 +69,9 @@ const Book = ` `; export default () => [Book, Author]; +``` +```js // in schema.js ---------------------- import Author from './author.js'; From 03a1af3d0a91a993d02bde81d47206a74ba3f84c Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Wed, 3 Aug 2016 10:59:41 -0700 Subject: [PATCH 227/409] Fix broken makeExecutableSchema function signature --- docs/source/graphql-tools/generate-schema.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md index 2da1046a92e..348a3b0b926 100644 --- a/docs/source/graphql-tools/generate-schema.md +++ b/docs/source/graphql-tools/generate-schema.md @@ -14,6 +14,8 @@ import { makeExecutableSchema } from 'graphql-tools'; const jsSchema = makeExecutableSchema( typeDefinitions, resolveFunctions, + connectors, + logger, allowUndefinedInResolve = false, //optional resolverValidationOptions = {}, //optional ); @@ -23,6 +25,10 @@ const jsSchema = makeExecutableSchema( `resolveFunctions` is a required argument and should be an object that follows the pattern explained in the guide [section on resolvers](http://docs.apollostack.com/apollo-server/resolvers.html). +`connectors` is an optional argument, which will take the connectors object provided and attach them to the context of every resolve function. See the [connector docs](http://docs.apollostack.com/graphql-tools/connectors.html) for more information. + +`logger` is an optional argument, which can be used to print errors to the server console that are usually swallowed by GraphQL. The `logger` argument should be an object with a `log` function, eg. `const logger = { log: (e) => console.log(e) }` + `allowUndefinedInResolve` is an optional argument, which is `false` by default, and causes your resolve function to throw an error, if they return undefined. This can help make debugging easier. To get the default behavior of GraphQL, set this option to `true`. `resolverValidationOptions` is an optional argument which accepts an object of the following shape: `{ requireResolversForArgs, requireResolversForNonScalar }`. If set to true, `requireResolversForArgs` will cause `makeExecutableSchema` to throw an error, if no resolve function is defined for a field that has arguments. Similarly, `requireResolversForNonScalar` will cause `makeExecutableSchema` to throw an error if a non-scalar field has no resolver defined. By default, both of these are true, which can help catch errors faster. To get the normal behavior of GraphQL, set both of them to `false`. From fabb39d4ba9b9e693910d6192ef9da7d60442818 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Wed, 3 Aug 2016 11:26:56 -0700 Subject: [PATCH 228/409] Add brackets to makeExecutableSchema --- docs/source/graphql-tools/generate-schema.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md index 348a3b0b926..3eb664db32b 100644 --- a/docs/source/graphql-tools/generate-schema.md +++ b/docs/source/graphql-tools/generate-schema.md @@ -11,21 +11,21 @@ The graphql-tools package allows you to create a GraphQLSchema instance from Gra ``` import { makeExecutableSchema } from 'graphql-tools'; -const jsSchema = makeExecutableSchema( +const jsSchema = makeExecutableSchema({ typeDefinitions, resolveFunctions, connectors, logger, allowUndefinedInResolve = false, //optional resolverValidationOptions = {}, //optional -); +}); ``` `typeDefinitions` is a required argument and should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. `resolveFunctions` is a required argument and should be an object that follows the pattern explained in the guide [section on resolvers](http://docs.apollostack.com/apollo-server/resolvers.html). -`connectors` is an optional argument, which will take the connectors object provided and attach them to the context of every resolve function. See the [connector docs](http://docs.apollostack.com/graphql-tools/connectors.html) for more information. +`connectors` is an optional argument, which will take an object with connectors and attach them to the context of every resolve function. See the [connector docs](http://docs.apollostack.com/graphql-tools/connectors.html) for more information. `logger` is an optional argument, which can be used to print errors to the server console that are usually swallowed by GraphQL. The `logger` argument should be an object with a `log` function, eg. `const logger = { log: (e) => console.log(e) }` From cdb5da18c4ea39a653475444a3d28f8f5f17ba32 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Wed, 3 Aug 2016 12:33:23 -0700 Subject: [PATCH 229/409] Update generate-schema.md --- docs/source/graphql-tools/generate-schema.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md index 3eb664db32b..b5b381c4be8 100644 --- a/docs/source/graphql-tools/generate-schema.md +++ b/docs/source/graphql-tools/generate-schema.md @@ -6,7 +6,7 @@ description: Generate a GraphQL schema from the concise type definition language The graphql-tools package allows you to create a GraphQLSchema instance from GraphQL schema language by using the function `makeExecutableSchema`. -

makeExecutableSchema(typeDefs, resolvers)

+

makeExecutableSchema(option)

``` import { makeExecutableSchema } from 'graphql-tools'; From 9561330efbd2c42a9998663bb8d0cf197032921b Mon Sep 17 00:00:00 2001 From: Matthew Schulz Date: Wed, 3 Aug 2016 14:37:00 -0500 Subject: [PATCH 230/409] Update migration.md (#160) Simple typo, QL was not capitalized as it is declared. --- docs/source/apollo-server/migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/migration.md b/docs/source/apollo-server/migration.md index c169b8db036..6548af2df67 100644 --- a/docs/source/apollo-server/migration.md +++ b/docs/source/apollo-server/migration.md @@ -89,7 +89,7 @@ graphQLServer.use('/graphql', bodyParser.json(), apolloExpress({ schema: executableSchema, })); -graphqlServer.use('/graphiql', graphiqlExpress({ +graphQLServer.use('/graphiql', graphiqlExpress({ endpointURL: '/graphql', })); From 437572d3b1b6703352a0a0df8e2df07e950695b0 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 3 Aug 2016 14:42:12 -0700 Subject: [PATCH 231/409] Fetch more (#157) * draft pagination * an example on cursor-based pagination * add info about reducer arguments --- docs/_config.yml | 1 + docs/source/apollo-client/pagination.md | 155 ++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 docs/source/apollo-client/pagination.md diff --git a/docs/_config.yml b/docs/_config.yml index cbd991f71ea..f09827913c0 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -19,6 +19,7 @@ sidebar_categories: - apollo-client/queries - apollo-client/mutations - apollo-client/fragments + - apollo-client/pagination - apollo-client/network - apollo-client/devtools - apollo-client/how-it-works diff --git a/docs/source/apollo-client/pagination.md b/docs/source/apollo-client/pagination.md new file mode 100644 index 00000000000..3e23e5d9066 --- /dev/null +++ b/docs/source/apollo-client/pagination.md @@ -0,0 +1,155 @@ +--- +title: Pagination +order: 105 +description: How to continuously fetch more data for a paginated query. +--- + +Sometimes you need to fetch a rather long list of items from the server but for the performance and user experience sake you want to fetch only 10 items at a time. Later, when the user scrolls through the list, you might want to fetch 10 more, but for the initial request it is paramount to load and display the first 10 items as fast as possible. + +Apollo Client has a built in functionality for this behavior, widely known as "infinite scroll", that allows you to load more items as you go. + +

Watch Query

+ +Start by watching a query with the initial variables set. In our example, we will fetch a list of comments for an entry in the paginated fashion: + +```js +const query = client.watchQuery({ + query: gql` + query Comments($id: Int!, $start: Int, $limit: Int) { + entry(id: $id) { + title + author { + name + } + + # this is where the start and limit arguments are used + comments(start: $start, limit: $limit) { + author { + name + } + text + } + } + } + `, + // only fetch first 10 items + variables: { start: 0, limit: 10, id: '1' }, +}); + +query.subscribe({ + next(queryResult) { + // do something with the results of the query + console.log('result of the query is now:', queryResult); + } +}); +``` + +Now, since we subscribed to the query's observable, we will receive the initial result of the query. + +

Fetch more

+ +Later, let's say the user scrolled past the end of the list and you want to fetch more comments. You can do it using the `fetchMore` method on the query observable and either pass new variables or an entirely new query. + +Here is an example of calling `fetchMore` with new variables. The results of the subsequent query would need to be incorporated back into Apollo Store, this can be done by supplying an `updateQuery` function that will merge the previous results and the new data: + +```js +query.fetchMore({ + // fetch 10 more items starting from new offset + // limit and id variables are the same + variables: { start: 10 }, + // tell Apollo Client how to merge the new results of the query + updateQuery: (previousResult, { fetchMoreResult, queryVariables }) => { + const prevEntry = previousResult.entry; + const newComments = fetchMoreResult.data.entry.comments; + return { + title: prevEntry.title, + author: prevEntry.author, + comments: [...prevEntry.comments, ...newComments], + }; + } +}); +``` + +Now, the cached value in the store will contain both old and new comments and the observable subscription will emit a new query result. + +

Fetch more with a different query

+ +You might have noticed that in the previous example we fetched new comments with the same query. Sometimes, you might want to use an entirely different query with a different shape, or a similar query with a smaller payload size. You can do it in Apollo Client using the same `fetchMore` API: + +```js +query.fetchMore({ + query: gql` + query PromotedComments($id: Int!) { + promotedComments(id: $id) { + author + text + } + } + `, + variables: { id: '1' }, + updateQuery: (previousResult, { fetchMoreResult, queryVariables }) => { + const prevEntry = previousResult.entry; + const newComments = fetchMoreResult.data.promotedComments; + return { + title: prevEntry.title, + author: prevEntry.author, + // put promoted comments in front + comments: [...newComments, ...prevEntry.comments], + }; + } +}); +``` + +Again, the result of the watched query will be updated in the store, even when updated with a completely differently shaped query. + + +

Cursor-based pagination

+ +A different common server-side implementation for the "infinite scroll" feature is a cursor-based approach. Every time the clients want to fetch more data, they can optionally pass an id of a cursor they got from the last fetch. If cursor is passed as an argument, it is simple to use with `fetchMore`: + +```js +query.fetchMore({ + query: gql` + query nextComments($cursor_id: String!) { + nextComments(cursor_id: $cursor_id) { + cursor + comments { + author + text + } + } + } + `, + variables: { cursor_id: cursor }, + updateQuery: (previousResult, { fetchMoreResult, queryVariables }) => { + const prevEntry = previousResult.entry; + const newComments = fetchMoreResult.data.comments.nextComments; + + // update cursor + cursor = fetchMoreResult.data.cursor; + + return { + title: prevEntry.title, + author: prevEntry.author, + // put promoted comments in front + comments: [...newComments, ...prevEntry.comments], + }; + } +}); +``` + +

Merge Function

+ +The merge function used in the example is acting as a reducer, similar to the reducers in [Redux](http://redux.js.org/docs/basics/Reducers.html). + +You don't have to use Redux to understand reducers. All you need to know is that reducer never mutates the arguments and acts as a pure function: +- must return an updated query result that incorporates `fetchMoreResult` +- must avoid mutating the arguments, such that previous query result, and prefer cloning +- should have no side effects + +

Options passed to the merge function

+ +Merge function `updateQuery` takes two arguments: previous result of the query from store and options. Here is a list of options: + +- `fetchMoreResult` - result of the `fetchMore` query +- `queryVariables` - variables used on the original query From eaf5b79e961d4ae7180afa6d3894a8b7ca2706a0 Mon Sep 17 00:00:00 2001 From: Hammad Jutt Date: Wed, 3 Aug 2016 16:44:31 -0700 Subject: [PATCH 232/409] Improved mutations docs (#161) * Improved mutations docs * fix updateQueries example --- docs/package.json | 2 +- docs/source/apollo-client/mutations.md | 105 +++++++++++++++++++------ 2 files changed, 84 insertions(+), 23 deletions(-) diff --git a/docs/package.json b/docs/package.json index 6d539cda797..a95c0828d1d 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "hexo": { - "version": "3.2.0" + "version": "3.2.2" }, "dependencies": { "hexo": "^3.1.0", diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md index d7235cd79d0..43b4c0764aa 100644 --- a/docs/source/apollo-client/mutations.md +++ b/docs/source/apollo-client/mutations.md @@ -4,12 +4,34 @@ order: 103 description: How to run mutations to modify data with Apollo Client. --- -In addition to fetching data using queries, the Apollo Client also handles GraphQL mutations. GraphQL mutations consist of two parts: +In addition to fetching data using queries, the Apollo Client also handles GraphQL mutations. Mutation strings are identical to query strings in syntax, the only difference is that you use the keyword `mutation` instead of `query` to indicate that the operation is used to change the dataset behind the schema. Basically, a query is the GraphQL equivalent of an HTTP GET and a mutation is the equivalent of an HTTP POST. -1. The root field with arguments, which represents the actual operation to be done on the server -2. The rest of the query, which describes the results to fetch to update the client +```js +mutation { + createUser(name: "Jane Doe", email: "jane@apollostack.com") { + id + name + } +} +``` + +GraphQL mutations consist of two parts: -Apollo Client handles both of these requirements. +1. The mutation name with arguments (`createUser`), which represents the actual operation to be done on the server +2. The fields you want back from the result of the mutation to update the client (`id` and `name`) + +The result of the above mutation would be: + +``` +{ + "data": { + "createUser": { + "id": "123", + "name": "Jane Doe" + } + } +} +```

ApolloClient#mutate(options)

@@ -56,21 +78,48 @@ Mutations can get a bit verbose because you often need to pass in variables for In Apollo Client, there is a special system that allows mutations to update the results of the active queries. Active queries are bound to your UI components via `watchQuery` or any of the view integrations. These UI components will automatically re-render as updated queries are updated. + +

Updated Fields

+ +In cases when your mutation returns a new value for an existing object with some fields updated, you might avoid writing any queries updating code at all. As long as your instance of Apollo Client has [`dataIdFromObject`](/apollo-client/index.html#ApolloClient) option defined, the occurrences of the object (matching by the generated id) in the active queries will be updated automatically without any extra code. + +For example, say you have a query with a flat list of `TodoList`s. Later, after editing the name of one of lists, the mutation `changeTodoListName(list_id: ID!, name: String!)` was fired. If `changeTodoListName` mutation returns the `TodoList` object with the same id and updated fields, then it will be incorporated into store and updated in active queries automatically. + +

Updating query results with `updateQueries`

Depending on how complicated are your queries, the logic incorporating the mutation result could be sophisticated. For example, let's say you have a mutation `addNewTask(text: String!, list_id: ID!)` that adds a new task of type `Task` to a `TodoList` currently displayed on the screen. In this example, to update a query with the new task returned by the mutation, it is required to insert the new task into the correct place in the list of tasks. -For cases like these, use the special option `updateQueries`. `updateQueries` is a mapping from query name to a reducer function. The query name goes between the `query` keyword and the declaration of variables (in the example below it is `todos`). +For cases like these, use the special option `updateQueries`. `updateQueries` is a mapping from query name to a reducer function to update that query. The query name goes between the `query` keyword and the declaration of variables (in the example below it is `todos`). + +--- + +The `updateQueries` functions are similar to [Redux](http://redux.js.org/docs/basics/Reducers.html) reducers. This means that they: -Each reducer function accepts the old result of the query and the new information such that the mutation result. The job of the reducer function is to return a new query result. +- must return an updated query result that incorporates the result of the mutation +- must avoid mutating the arguments and should return new objects instead +- should have no side effects +- should take the following form: + + +``` +(previousQueryResult, { mutationResult, queryVariables }) => updatedQueryResult +``` + +Each reducer function accepts the old result of the query, the `mutationResult`, and optionally a `queryVariables` object that contains the variables that were passed into the original query. `queryVariables` is useful when you have multiple queries of the same name but with different variables and you only want to update a certain one (i.e. fetching multiple todo lists with different id's). + +

Example

+ +Let's say we have the following query that is fetching a list of `todos`: ```js client.watchQuery({ query: gql` - query todos($list_id: ID!) { - todo_list(id: $list_id) { + query todos($id: ID!) { + todo_list(id: $id) { + id title tasks { id @@ -82,10 +131,14 @@ client.watchQuery({ } `, variables: { - list_id: '123', + id: '123', }, }); +``` +We can then call the following mutation to add an item to the list and update the query result: + +```js client.mutate({ mutation: gql` mutation ($text: String!, $list_id: ID!) { @@ -103,27 +156,35 @@ client.mutate({ }, updateQueries: { todos: (previousQueryResult, { mutationResult, queryVariables }) => { + if (queryVariables.id !== '123') { + // this isn't the query we updated, so just return the previous result + return previousQueryResult + } + // otherwise, create a new object with the same shape as the + // previous result with the mutationResult incorporated + const originalList = previousQueryResult.todo_list; + const newTask = mutationResult.data.addNewTask return { - title: previousQueryResult.title, - tasks: [...previousQueryResult.tasks, mutationResult], + todo_list: { + ...originalList, + tasks: [...originalList.tasks, newTask] + } }; }, }, }); ``` -The `updateQueries` reducer functions are similar to [Redux](http://redux.js.org/docs/basics/Reducers.html) reducers, if you are familiar with Redux. - -This means that reducer functions: -- must return an updated query result that incorporates `mutationResult` -- must avoid mutating the arguments, such that previous query result, and prefer cloning -- should have no side effects - -

Updated Fields

- -In cases when your mutation returns a new value for an existing object with some fields updated, you might avoid writing any queries updating code at all. As long as your instance of Apollo Client has [`dataIdFromObject`](/apollo-client/index.html#ApolloClient) option defined, the occurrences of the object (matching by the generated id) in the active queries will be updated automatically without any extra code. +If there are multiple active queries of the same name, the reducer function will be run for each one of them. In the example above, you can see how we used the `queryVariables` to check the id passed into the original query and update the correct list. Alternatively, if the field you want to check isn't a part of the `queryVariables`, you can also check the previous result itself: -For example, say you have a query with a flat list list of `TodoList`s. Later, after editing the name of one of lists, the mutation `changeTodoListName(list_id: ID!, name: String!)` was fired. If `changeTodoListName` mutation returns the `TodoList` object with the same id and updated fields, then it will be incorporated into store and updated in active queries automatically. +```js +(previousQueryResult, { mutationResult }) => { + if (previousQueryResult.todo_list.id !== '123') { + return previousQueryResult + } + ... +} +```

Optimistic Results

From c789ed853345cf2303c14676f9d2e12439da96bf Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Wed, 3 Aug 2016 17:21:25 -0700 Subject: [PATCH 233/409] Add info about `fetchMore` and `updateQuery` --- docs/source/apollo-client/queries.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/apollo-client/queries.md b/docs/source/apollo-client/queries.md index fb02dae1d12..b081da45259 100644 --- a/docs/source/apollo-client/queries.md +++ b/docs/source/apollo-client/queries.md @@ -131,8 +131,10 @@ This is the object you get when you call `watchQuery`. The most important method - `subscribe(observer: QueryObserver)` Pass an observer object which gets called when there is new data. Returns a `QuerySubscription` object which you can use to unsubscribe or refetch. - `refetch(variables: Object)` Refetch this query from the server. Think of it like a refresh button. This can take an object of new variables +- `fetchMore(options)` update results of the query by fetching a new query and combining the results. See [pagination](./pagination.html) for more info. - `stopPolling()` Stop an actively polling query. - `startPolling(pollInterval: number)` Start polling a query +- `updateQuery(transformFn: function)` Updates results of the query in store, by transforming its previous result. The transform function takes the previous result and options containing information about the original query. The function must return a new value of the query result.

interface QueryObserver

From e80c2beebf2dfe9f698fa41784c0e11b6b39d34e Mon Sep 17 00:00:00 2001 From: Luc Vauvillier Date: Thu, 4 Aug 2016 19:46:35 +0200 Subject: [PATCH 234/409] Fix wrong function name (#162) --- docs/source/graphql-tools/resolvers.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/graphql-tools/resolvers.md b/docs/source/graphql-tools/resolvers.md index 1822c28be3a..6a91bc58b49 100644 --- a/docs/source/graphql-tools/resolvers.md +++ b/docs/source/graphql-tools/resolvers.md @@ -45,8 +45,8 @@ const resolveFunctions = { ``` Note that if the types were defined in GraphQL schema language, the `info` argument to `resolveType` must be used to get a reference to the actual type, eg. `return info.schema.getType("Person")`. This may be changed in the future to support returning just the name of the type, eg. `return "Person"`. -

- addSchemaLevelResolver(schema, rootResolveFunction) +

+ addSchemaLevelResolveFunction(schema, rootResolveFunction)

-Some operations, such as authentication, need to be done only once per query. Logically, these operations belong in a root resolve function, but unfortunately GraphQL-JS does not let you define one. `addSchemaLevelResolver` solves this by modifying the GraphQLSchema that is passed as the first argument. +Some operations, such as authentication, need to be done only once per query. Logically, these operations belong in a root resolve function, but unfortunately GraphQL-JS does not let you define one. `addSchemaLevelResolveFunction` solves this by modifying the GraphQLSchema that is passed as the first argument. From a97e4edfc178b6c8f243cca33e3768b79f22a005 Mon Sep 17 00:00:00 2001 From: Jonas Helfer Date: Thu, 4 Aug 2016 11:01:38 -0700 Subject: [PATCH 235/409] Fix broken makeExecutableSchema function signature (again) --- docs/source/graphql-tools/generate-schema.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md index b5b381c4be8..025f131d19f 100644 --- a/docs/source/graphql-tools/generate-schema.md +++ b/docs/source/graphql-tools/generate-schema.md @@ -12,8 +12,8 @@ The graphql-tools package allows you to create a GraphQLSchema instance from Gra import { makeExecutableSchema } from 'graphql-tools'; const jsSchema = makeExecutableSchema({ - typeDefinitions, - resolveFunctions, + typeDefs, + resolvers, connectors, logger, allowUndefinedInResolve = false, //optional @@ -21,9 +21,9 @@ const jsSchema = makeExecutableSchema({ }); ``` -`typeDefinitions` is a required argument and should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. +`typeDefs` is a required argument and should be an array of GraphQL schema language strings or a function that takes no arguments and returns an array of GraphQL schema language strings. The order of the strings in the array is not important, but it must include a schema definition. -`resolveFunctions` is a required argument and should be an object that follows the pattern explained in the guide [section on resolvers](http://docs.apollostack.com/apollo-server/resolvers.html). +`resolvers` is a required argument and should be an object that follows the pattern explained in the guide [section on resolvers](http://docs.apollostack.com/apollo-server/resolvers.html). `connectors` is an optional argument, which will take an object with connectors and attach them to the context of every resolve function. See the [connector docs](http://docs.apollostack.com/graphql-tools/connectors.html) for more information. From fed21ffc1fc1beb2b8c63128cc169c0a255f69b7 Mon Sep 17 00:00:00 2001 From: Daniel Rinehart Date: Thu, 11 Aug 2016 12:06:01 -0400 Subject: [PATCH 236/409] correct typos in the hapi documentation (#169) --- docs/source/apollo-server/graphiql.md | 2 +- docs/source/apollo-server/setup.md | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-server/graphiql.md b/docs/source/apollo-server/graphiql.md index 3e279a62704..8ed48584cf0 100644 --- a/docs/source/apollo-server/graphiql.md +++ b/docs/source/apollo-server/graphiql.md @@ -55,7 +55,7 @@ app.use('/graphiql', graphiqlConnect({ If you are using HAPI, GraphiQL can be configured as follows: ```js -import { graphqlHAPI } from 'apollo-server'; +import { GraphiQLHAPI } from 'apollo-server'; server.register({ register: new GraphiQLHAPI(), diff --git a/docs/source/apollo-server/setup.md b/docs/source/apollo-server/setup.md index 40c37c0898b..6344df6fbc1 100644 --- a/docs/source/apollo-server/setup.md +++ b/docs/source/apollo-server/setup.md @@ -4,7 +4,7 @@ order: 302 description: How to set up Apollo Server --- -Apollo Server exports `apolloExpress`, `apolloConnect`, `apolloHAPI` and `apolloKoa` which can be used as a drop-in to turn your Express, Connect, HAPI or Koa server into a GraphQL server. +Apollo Server exports `apolloExpress`, `apolloConnect`, `ApolloHAPI` and `apolloKoa` which can be used as a drop-in to turn your Express, Connect, HAPI or Koa server into a GraphQL server.

ApolloOptions

@@ -78,9 +78,10 @@ The `options` passed to `apolloConnect` are the same as those passed to `apolloE The following code snippet shows how to use Apollo Server with HAPI: ```js -import hapi from 'hapi'; +import Hapi from 'hapi'; +import { ApolloHAPI } from 'apollo-server'; -const server = new hapi.Server(); +const server = new Hapi.Server(); const HOST = 'localhost'; const PORT = 3000; @@ -93,6 +94,7 @@ server.connection({ server.register({ register: new ApolloHAPI(), options: { schema: myGraphQLSchema }, + // or options: request => ({ schema, ... }) routes: { prefix: '/graphql' }, }); ``` From 7f50d9dac8a421aba037c005a9e351f53effef52 Mon Sep 17 00:00:00 2001 From: Robert Dickert Date: Thu, 11 Aug 2016 10:06:46 -0600 Subject: [PATCH 237/409] Update meteor.md (#168) install graphql for Meteor integration Right now, you also have to specify `apollo-server@^0.1.1`, but I think [that will change soon](https://github.com/apollostack/meteor-integration/pull/26). --- docs/source/apollo-client/meteor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md index 01263a5b116..44a239a4112 100644 --- a/docs/source/apollo-client/meteor.md +++ b/docs/source/apollo-client/meteor.md @@ -10,7 +10,7 @@ To install `apollo`, run both of these commands: ```text meteor add apollo -meteor npm install --save apollo-client apollo-server express +meteor npm install --save apollo-client apollo-server express graphql ``` ## Usage From ecded536a677531ad5dda7f9b18e45ba91d797aa Mon Sep 17 00:00:00 2001 From: JD Angerhofer Date: Thu, 11 Aug 2016 20:24:42 -0400 Subject: [PATCH 238/409] Adding conditional `context` requirement of `makeExecutableSchema` (#170) --- docs/source/graphql-tools/generate-schema.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md index 025f131d19f..f44b13977cf 100644 --- a/docs/source/graphql-tools/generate-schema.md +++ b/docs/source/graphql-tools/generate-schema.md @@ -25,7 +25,7 @@ const jsSchema = makeExecutableSchema({ `resolvers` is a required argument and should be an object that follows the pattern explained in the guide [section on resolvers](http://docs.apollostack.com/apollo-server/resolvers.html). -`connectors` is an optional argument, which will take an object with connectors and attach them to the context of every resolve function. See the [connector docs](http://docs.apollostack.com/graphql-tools/connectors.html) for more information. +`connectors` is an optional argument, which will take an object with connectors and attach them to the context of every resolve function. If this argument is provided, a `context` object must be passed to the `apollo{Express/Connect/HAPI/Koa}` call. See the [connector docs](http://docs.apollostack.com/graphql-tools/connectors.html) for more information. `logger` is an optional argument, which can be used to print errors to the server console that are usually swallowed by GraphQL. The `logger` argument should be an object with a `log` function, eg. `const logger = { log: (e) => console.log(e) }` From 3c883063e1a82dd8d3c086cc8e22124544444582 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Fri, 12 Aug 2016 15:54:09 +1000 Subject: [PATCH 239/409] Downgrade hexo to deal with wierd code block rendering. --- docs/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package.json b/docs/package.json index a95c0828d1d..f68d52545c0 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,17 +3,17 @@ "version": "0.0.0", "private": true, "hexo": { - "version": "3.2.2" + "version": "3.2.0" }, "dependencies": { - "hexo": "^3.1.0", + "hexo": "^3.2.0", "hexo-generator-archive": "^0.1.2", "hexo-generator-category": "^0.1.2", "hexo-generator-index": "^0.1.2", "hexo-generator-tag": "^0.1.1", "hexo-renderer-ejs": "^0.1.0", - "hexo-renderer-stylus": "^0.3.0", "hexo-renderer-marked": "^0.2.4", + "hexo-renderer-stylus": "^0.3.0", "hexo-server": "^0.1.2" }, "devDependencies": { From 7a3ea34b4f871ece6b047df2f25365b6f941ef76 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Fri, 12 Aug 2016 15:54:22 +1000 Subject: [PATCH 240/409] First pass at new react-apollo docs --- docs/source/apollo-client/react.md | 563 +++++++++++++++++++++-------- 1 file changed, 422 insertions(+), 141 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 165bb9f1c39..13ef08dca89 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -4,7 +4,7 @@ order: 150 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- -This package allows you to easily integrate your Apollo client and Redux store with your React components. It works almost exactly like [react-redux](https://github.com/reactjs/react-redux). +The `react-apollo` package gives a higher-order-component style interface to Apollo Client to allow you to easily integrated GraphQL data with your React components. ```txt npm install react-apollo --save @@ -16,14 +16,13 @@ Note: You don't have to do anything special to get Apollo Client to work in Reac

ApolloProvider

-Injects an ApolloClient instance into a React view tree. - -Basic Apollo version: +To get started, you should use an `ApolloProvider` to inject an [ApolloClient instance](../apollo-client/index.html#Initializing) into your React view heirarchy, *above* the point where you need GraphQL data. ```js import ApolloClient from 'apollo-client'; import { ApolloProvider } from 'react-apollo'; +// you can provide whichever options you require to the apollo client here. const client = new ApolloClient(); ReactDOM.render( @@ -34,206 +33,488 @@ ReactDOM.render( ) ``` -With an existing Redux store: +To fetch data using the client, or send mutations, use the [`graphql`](#graphql) or [`withApollo`](#withApollo) higher order components. + +

The `graphql` container

+ +The `graphql` container is the recommended approach for fetching data or making mutations. It is a [Higher Order Component](https://facebook.github.io/react/blog/2016/07/13/mixins-considered-harmful.html#subscriptions-and-side-effects) for providing Apollo data to a component. + +For queries, this means `graphql` handles the fetching and updating of information from the query using Apollo's [watchQuery method](../apollo-client/queries.html#watchQuery). For mutations, `graphql` binds the intended mutation to be called using Apollo. + +The basic usage of `graphql` is as follows: ```js -import { createStore, combineReducers, applyMiddleware } from 'redux'; -import ApolloClient from 'apollo-client'; -import { ApolloProvider } from 'react-apollo'; +import React, { Component } from 'react'; +import { graphql } from 'react-apollo'; -import { todoReducer, userReducer } from './reducers'; +// MyComponent is a "presentational" or apollo-unaware component, +// It could be a simple React class +class MyComponent extends Component { + render() { + return
...
; + } +} +// Or a stateless functional component: +const MyComponent = (props) =>
...
; -const client = new ApolloClient(); +// MyComponentWithData provides the query or mutation defined by +// QUERY_OR_MUTATION to MyComponent. We'll see how below. +const MyComponentWithData = graphql(QUERY_OR_MUTATION, options)(MyComponent); +``` -const store = createStore( - combineReducers({ - todos: todoReducer, - users: userReducer, - apollo: client.reducer(), - }), - applyMiddleware(client.middleware()) -); +If you are using [ES2016 decorators](https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841#.nn723s5u2), you may prefer the decorator syntax, although we'll use the older syntax in this guide: -ReactDOM.render( - - - , - rootEl -) +```js +import React, { Component } from 'react'; +import { graphql } from 'react-apollo'; + +@graphql(QUERY_OR_MUTATION, settings) +class MyComponent extends Component { + render() { + return
...
; + } +} +``` + +

For Queries

+ +The first, and only required, argument of `graphql` is a [graphql](https://www.npmjs.com/package/graphql) document. You can compile such documents from query strings using the [graphql-tag](../apollo-client/index.html#gql) library. + +```js +import React, { Component } from 'react'; +import { graphql } from 'react-apollo'; +import gql from 'graphql-tag'; + +class MyComponent extends Component { + render() { + // By default the result of the query will be available at `props.data` + const { loading, user } = this.props.data; + } +} + +MyComponent.propTypes = { + // We'll see the precise shape of this object below + data: React.PropTypes.object.isRequired, +}; + +const GET_USER = gql` + query getUser { + user { name } + } +`; + +const MyComponentWithData = graphql(GET_USER)(MyComponent); ``` +

Default Result Props

+ +Using `graphql` with queries makes it easy to bind data to components. As seen above, `graphql` will add the result of the query as `data` to the props passed to the wrapped component (it will also pass all of the props of the parent container). The shape of the `data` prop will be the following: + +- `loading: Boolean` + Loading will be true if a query is in flight (including when calling refetch) + +- [`error: ApolloError`](http://docs.apollostack.com/apollo-client/queries.html#ApolloError) + The error key will be `null` if no errors were created during the query + +- `...fields` + + One key for each field selected on the root query, so: + + ```graphql + query getUserAndLikes(id: $ID!) { + user(userId: $id) { name } + likes(userId: $id) { count } + } + ``` + + could return a result object that includes `{ user: { name: "James" }, likes: { count: 10 } }`. + +- [`...QuerySubscription`](../apollo-client/queries.html#QuerySubscription) -The wrapper is called `ApolloProvider` because in the base case you can use it instead of the Redux `Provider` or you can use it as an Apollo enhanced Redux `Provider`. + The subscription created on this query will be merged into the passed props so you can dynamically refetch, change polling settings, or even unsubscribe to this query. -

Connect

+ XXX: what does this end up getting called? +- [`query`](../apollo-client/queries.html#query) -Works like Redux `connect`, but supports two more properties: + Sometimes you may want to call a custom query within a component. To make this possible, `graphql` passes the query method from ApolloClient as a prop -- `mapQueriesToProps` to connect GraphQL queries to fetch data -- `mapMutationsToProps` to connect mutations with your components +- [`mutate`](../apollo-client/mutations.html#mutate) -It also uses keyword arguments instead of positional arguments, since that lets you more easily omit certain fields when you don't need them. + Sometimes you may want to call a custom mutation within a component. To make this possible, `graphql` passes the mutate method from ApolloClient as a prop -Basic Apollo version: +

Providing `options`

+ +If you want to configure the query (or the mutation, as we'll see below), you can provide an `options` function on the second argument to `graphql`: ```js -import { connect } from 'react-apollo'; +const MyComponentWithData = graphql(GET_USER, { + // Note ownProps here are the props that are passed into `MyComponentWithData` + // when it is used + options(ownProps) { + return { + // options for ApolloClient.watchQuery + } + } +})(MyComponent); +``` + +By default, `graphql` will attempt to pick up any missing variables from the query from `ownProps`. For example: + +```js +import { Component } from 'react'; +import { graphql } from 'react-apollo'; import gql from 'graphql-tag'; -import Category from '../components/Category'; - -function mapQueriesToProps({ ownProps, state }) { - return { - category: { - query: gql` - query getCategory($categoryId: Int!) { - category(id: $categoryId) { - name - color - } - } - `, - variables: { - categoryId: 5, - }, - forceFetch: false, - returnPartialData: true, - }, - }; -}; +class MyComponent extends Component { ... } -function mapMutationsToProps({ ownProps, state }) { - return { - postReply: (raw) => ({ - mutation: gql` - mutation postReply( - $topic_id: ID! - $category_id: ID! - $raw: String! - ) { - createPost( - topic_id: $topic_id - category: $category_id - raw: $raw - ) { - id - cooked - } - } - `, - variables: { - // Use the container component's props - topic_id: ownProps.topic_id, - - // Use the redux state - category_id: state.selectedCategory, - - // Use an argument passed from the triggering of the mutation - raw, - }, - }), - }; +const GET_USER_WITH_ID = gql` + query getUser(id: $ID!) { + user { name } + } +`; +// Even though we haven't defined where `id` comes from, as long as we call +// ``, the default options() will work. +const MyComponentWithData = graphql(GET_USER_WITH_ID)(MyComponent); +``` + +In general, you will probably want to be explicit about where the variables come from: + +```js +// If we'd prefer to call `` +const MyComponentWithData = graphql(GET_USER_WITH_ID, { + options: (ownProps) => ({ id: ownProps.userId }) +})(MyComponent); +``` + +Also, you may want to configure the [watchQuery](../apollo-client/queries.html#watchQuery) behaviour using `options`: + +```js +const MyComponentWithData = graphql(GET_USER_WITH_ID, { + options: () => ({ pollInterval: 1000 }) +})(MyComponent); +``` + +

Controlling child props

+ +As [we've seen](#default-result-props), by default, `graphql` will provide a `data` prop to the wrapped component with various information about the state of the query. We'll also see that [mutations](#graphql-mutations) provide a callback on the `mutate` prop. + +

Using `name`

+ +If you want to change the name of this default property, you can use `name` field. In particular this is useful for nested `graphql` containers: + +```js +import React, { Component } from 'react'; +import { graphql } from 'react-apollo'; + +class MyComponent extends Component { ... } +MyComponent.propTypes = { + upvote: React.PropTypes.func.isRequired, + downvote: React.PropTypes.func.isRequired, }; -const CategoryWithData = connect({ - mapQueriesToProps, - mapMutationsToProps, -})(Category); +// This provides an `upvote` callback prop to `MyComponent` +const MyComponentWithUpvote = graphql(UPVOTE, { + name: 'upvote', +})(MyComponent); -export default CategoryWithData; +// This provides an `downvote` callback prop to `MyComponentWithUpvote`, +// and subsequently `MyComponent` +const MyComponentWithUpvoteAndDownvote = graphql(DOWNVOTE, { + name: 'downvote', +})(MyComponentWithUpvote); ``` -Each key on the object returned by mapQueriesToProps should be made up of the same possible arguments as [`ApolloClient#watchQuery`](core.html#watchQuery). In this case, the `Category` component will get a prop called `category`, which has the following keys: +

Using `props`

+ +If you want a greater level of control, use the `props` to map the query results (or mutation, as we'll see [below](#graphql-mutations)) to the props to be passed to the child component: ```js -{ - loading: boolean, - errors: Error[], - refetch: Function(variables), - category: Data // only when the query has returned -} +import React, { Component } from 'react'; +import { graphql } from 'react-apollo'; +import gql from 'graphql-tag'; + +class MyComponent extends Component { ... } + +MyComponent.propTypes = { + loading: React.PropTypes.boolean, + hasErrors: React.PropTypes.boolean, + currentUser: React.PropTypes.object, + refetchUser: React.PropTypes.func, +}; + +const GET_USER_WITH_ID = gql` + query getUser(id: $ID!) { + user { name } + } +`; + +const MyComponentWithData = graphql(GET_USER_WITH_ID, { + // `ownProps` are the props passed into `MyComponentWithData` + // `data` is the result data (see above) + props: ({ ownProps, data }) => { + if (data.loading) return { userLoading: true }; + if (data.error) return { hasErrors: true }; + return { + currentUser: data.user, + refetchUser: data.refetch, + }; + } +}); ``` -`mapMutationsToProps` returns an object made up of keys and values that are custom functions to call the mutation. These can be used in children components (for instance, on a event handler) to trigger the mutation. The resulting function must return the same possible arguments as [`ApolloClient#mutate`](core.html#mutate). In this case, the `Category` component will get a prop called `postReply`, which has the following keys: +This style of usage leads to the greatest decoupling between your presentational component (`MyComponent`) and Apollo, and is recommended. + +XXX: do we want to say that? + +

For Mutations

+ +Using `graphql` with mutations makes it easy to bind actions to components. Unlike queries, mutations provide only a simple prop (the `mutate` function) to the wrapped component. When calling a mutation, you can pass an options that can be passed to the Apollo Client [`mutate` method](../apollo-client/mutations.html#mutate). + +Mutations will be passed to the child as `props.mutate`: ```js -{ - loading: boolean, - errors: Error[], - createPost: Data, // only when the mutation has returned -} +import React, { Component } from 'react'; +import { graphql } from 'react-apollo'; +import gql from 'graphql-tag'; + +class MyComponent extends Component { ... } + +MyComponent.propTypes = { + mutate: React.PropTypes.func.isRequired, +}; + +const ADD_TASK = gql` + mutation addTask($text: String!, $list_id: ID!) { + addNewTask(text: $text, list_id: $list_id) { + id + text + completed + createdAt + } + } +`; + +const MyComponentWithMutation = graphql(ADD_TASK)(MyComponent); ``` -The `Category` component will also get a prop of `mutations` that will have a key of `postReply`. This key is the method that triggers the mutation and can take custom arguments (e.g. `this.props.mutations.postReply('Apollo and React are really great!')`). These arguments are passed to the method that creates the mutation. +

Calling mutations

-

Refetch query (with new variables)

+Most mutations will require arguments in the form of query variables, and you may wish to provide other options to [ApolloClient#mutate](../apollo-client/mutations.html#mutate), such as `optimisticResponse` or `updateQueries`. -One typical pattern is wanting to refetch a query after a mutation has happened. In this example, `this.props.mutations.postReply`is a method that returns the mutation promise. Since queries pass a `refetch()` prop, this can be accomplished like so: +You can directly pass options to `mutate` when you call it in the wrapped component: ```js +import React, { Component } from 'react'; -@connect({ mapMutationsToProps, mapQueriesToProps }) -class Container extends React.Component{ - componentDidMount() { - // call the mutation - this.props.mutations.makeListPrivate() - .then((err, data) => { - // if we have the data we want - if (data.id) { - // refetch the categories query without variables, - // just refresh client store - this.props.categories.refetch(); - }; - }); +class MyComponent extends Component { + render() { + const onClick = () => { + // pass in extra / changed variables + this.props.mutate({ variables: { text: "task", list_id: 1 } }) + .then(({ data }) => { + console.log('got data', data); + }).catch((error) => { + console.log('there was an error sending the query', error); + }); + } + + return
Click me
; } +} + +MyComponent.propTypes = { + mutate: React.PropTypes.func.isRequired, +}; +``` +However, typically you'd want to keep the concern of understanding the query out of your presentational component. The best way to do this is to use the [`props`](#graphql-props) argument to bind your mutate function: + +```js +import React, { Component } from 'react'; +import { graphql } from 'react-apollo'; + +class MyComponent extends Component { render() { - return
; + const onClick = () => { + this.props.addTask("text"); + } + + return
Click me
; } +} + +MyComponent.propTypes = { + addTask: React.PropTypes.func.isRequired, }; +const ADD_TASK = ...; + +const MyComponentWithMutation = graphql(ADD_TASK, { + props: ({ ownProps, mutate }) => ({ + addTask(text) { + return mutate({ + variables: { text, list_id: 1 }, + optimisticResponse: { + id: '123', + text, + completed: + true, + createdAt: new Date(), + }, + + // Depending on what you do it may make sense to deal with + // the promise result in the container or the presentational component + }).then(({ data }) => { + console.log('got data', data); + }).catch((error) => { + console.log('there was an error sending the query', error); + }); + }, + }) +})(MyComponent); ``` -`refetch(variables: optional)` also supports passing variables to refetch the same query with different set of variables. This would be handy for cases, when you just want to modify the variables to get new data. +> Note that in general you shouldn't attempt to use the results from the mutation callback directly, but instead write a [`updateQueries`](../apollo-client/mutations.html#updating-query-results) callback to update the result of relevant queries with your mutation results. + +

The `withApollo` container

-**For example:** +`withApollo` is a simple higher order component which provides direct access to your `ApolloClient` instance as a prop to your wrapped component. This is useful if you want to do custom logic with apollo, without using the `graphql` container. ```js - this.props.categories.refetch({ id: 5 }); - this.props.posts.refetch({ first: 20, page: 2 }); +import React, { Component } from 'react'; +import { withApollo } from 'react-apollo'; +import { ApolloClient } from 'apollo-client'; + +const MyComponent = (props) => { + // this.props.client is the apollo client + return
+} +MyComponent.propTypes = { + client: React.PropTypes.instanceOf(ApolloClient).isRequired; +} +const MyComponentWithApollo = withApollo(MyComponent); + +// or, using ES2016 decorators: + +@withApollo +class MyComponent extends Component { + render() { + return
+ } +} ``` -Example use cases: `Infinite scroll`, `Data filtering` -*Note: If you just want to refresh the store with updated data, just `refetch()` without variables.* +

Server methods

+The `react-apollo` library supports integrated server side rendering for both store rehydration purposes, or fully rendered markup. -

Additional Props

+

Using `getDataFromTree`

-Redux's connect will pass `dispatch` as a prop unless action creators are passed using `mapDispatchToProps`. Likewise, the Apollo connect exposes part of the apollo-client api to props under the keys `query`, `watchQuery`, and `mutate`. These correspond to the Apollo methods and can be used for custom needs outside of the ability of the wrapper component. +The `getDataFromTree` function takes your $eact tree and returns the context of you React tree. This can be used to get the initialState via `context.store.getState()` + +```js +// server application code (custom usage) +import { getDataFromTree } from "react-apollo/server" + +// during request +getDataFromTree(app).then((context) => { + // markup with data from requests + const markup = ReactDOM.renderToString(app); + + // now send the markup to the client alongside context.store.getState() +}); +``` -

Using in concert with Redux

+

Using `renderToStringWithData`

+The `renderToStringWithData` function takes your react tree and returns the stringified tree with all data requirements. It also injects a script tag that includes `window. __APOLLO_STATE__ ` which equals the full redux store for hydration. This method returns a promise that eventually returns the markup ```js -// ... same as above +// server application code (integrated usage) +import { renderToStringWithData } from "react-apollo/server" + +// during request +renderToStringWithData(app).then(markup => { + // send markup to client +}); +``` + +> Server notes: + When creating the client on the server, it is best to use `ssrMode: true`. This prevents unneeded force refetching in the tree walking. + +> Client notes: + When creating new client, you can pass `initialState: __APOLLO_STATE__ ` to rehydrate which will stop the client from trying to requery data. -function mapStateToProps(state, ownProps) { - return { - selectedCategory: state.selectedCategory, - } -} -const CategoryWithData = connect({ - mapQueriesToProps, - mapMutationsToProps, - mapStateToProps, -})(Category); +

Using in concert with Redux

+ +If you are using a custom redux store, you can pass it into the `ApolloProvider`: + +```js +import { createStore, combineReducers, applyMiddleware } from 'redux'; +import ApolloClient from 'apollo-client'; +import { ApolloProvider } from 'react-apollo'; + +import { todoReducer, userReducer } from './reducers'; + +const client = new ApolloClient(); + +const store = createStore( + combineReducers({ + todos: todoReducer, + users: userReducer, + apollo: client.reducer(), + }), + applyMiddleware(client.middleware()) +); -export default CategoryWithData; +ReactDOM.render( + + + , + rootEl +) ``` -In this case, `CategoryWithData` gets two props: `category` and `selectedCategory`. +XXX: do we want the example with a `` as well? I'm not sure how it's different to the above (in practice)? + +You can continue to use `react-redux`'s `connect` higher order component to wire state into and out of your components. You can connect before or after (or both!) attaching GraphQL data to your component with `graphql`: + +```js +import React, { Component } from 'react'; +import { graphql } from 'react-apollo'; +import { connect } from 'react-redux'; + +import { CLONE_LIST } from './mutations'; +import { viewList } from './actions'; + +class List extends Component { ... } +List.propTypes = { + listId: React.PropType.string.isRequired, + cloneList: React.PropType.function.isRequired, +}; + +const ListWithData = graphql(CLONE_LIST, { + props: ({ ownProps, mutate }) => ({ + cloneList() { + return mutate() + .then(result => { + ownProps.viewList(result.id); + }); + }, + }), +})(List); + +const ListWithDataAndState = connect( + (state) => ({ listId: state.list.id }), + (dispatch) => ({ + viewList(id) { + dispatch(viewList(id)); + } + }), +)(ListWithData); +```

Usage with React Router

From c1ab3447c62ca2d893114c00af2bb170602b5b9b Mon Sep 17 00:00:00 2001 From: James Baxley Date: Fri, 12 Aug 2016 08:29:37 -0400 Subject: [PATCH 241/409] cleaned up XXXs, added info about custom options (ssr: Boolean and skip: Boolean), added react-native blurb, and added mobx --- docs/source/apollo-client/react.md | 62 ++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 13ef08dca89..32a250047f6 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -4,7 +4,7 @@ order: 150 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- -The `react-apollo` package gives a higher-order-component style interface to Apollo Client to allow you to easily integrated GraphQL data with your React components. +The `react-apollo` package gives a higher-order-component style interface to Apollo Client to allow you to easily integrated GraphQL data with your React components. This works for react applications using ReactDOM (web applications), and react-native applications. ```txt npm install react-apollo --save @@ -131,9 +131,7 @@ Using `graphql` with queries makes it easy to bind data to components. As seen a - [`...QuerySubscription`](../apollo-client/queries.html#QuerySubscription) - The subscription created on this query will be merged into the passed props so you can dynamically refetch, change polling settings, or even unsubscribe to this query. - - XXX: what does this end up getting called? + The subscription created on this query will be merged into the passed props so you can dynamically refetch, change polling settings, or even unsubscribe to this query. The methods include `stopPolling`, `startPolling`, `refetch`, and `fetchMore`. - [`query`](../apollo-client/queries.html#query) @@ -183,7 +181,9 @@ In general, you will probably want to be explicit about where the variables come ```js // If we'd prefer to call `` const MyComponentWithData = graphql(GET_USER_WITH_ID, { - options: (ownProps) => ({ id: ownProps.userId }) + options: (ownProps) => ({ + variables: { id: ownProps.userId } + }) })(MyComponent); ``` @@ -195,6 +195,16 @@ const MyComponentWithData = graphql(GET_USER_WITH_ID, { })(MyComponent); ``` +Sometimes you may want to skip a query based on the available information, to do this, you can pass `skip: true` as part of the options. This is useful if you want to ignore a query if a user isn't authenticated: + +```js +const MyComponentWithData = graphql(GET_USER_DATA, { + options: (ownProps) => ({ skip: !ownProps.authenticated }) +})(MyComponent); +``` + +When the props change (a user logs in for instance), the query options will be rerun and `react-apollo` will start the watchQuery on the operation. +

Controlling child props

As [we've seen](#default-result-props), by default, `graphql` will provide a `data` prop to the wrapped component with various information about the state of the query. We'll also see that [mutations](#graphql-mutations) provide a callback on the `mutate` prop. @@ -263,9 +273,7 @@ const MyComponentWithData = graphql(GET_USER_WITH_ID, { }); ``` -This style of usage leads to the greatest decoupling between your presentational component (`MyComponent`) and Apollo, and is recommended. - -XXX: do we want to say that? +This style of usage leads to the greatest decoupling between your presentational component (`MyComponent`) and Apollo.

For Mutations

@@ -407,7 +415,14 @@ class MyComponent extends Component {

Server methods

-The `react-apollo` library supports integrated server side rendering for both store rehydration purposes, or fully rendered markup. +The `react-apollo` library supports integrated server side rendering for both store rehydration purposes, or fully rendered markup. No changes are required to client queries to support this, however, queries can be ignored during server rendering by passing `ssr: false` in the query options. For example: + +```js +const MyComponentWithData = graphql(GET_USER_WITH_ID, { + options: () => ({ ssr: false }) // won't be called during SSR +})(MyComponent); +``` +

Using `getDataFromTree`

@@ -477,8 +492,6 @@ ReactDOM.render( ) ``` -XXX: do we want the example with a `` as well? I'm not sure how it's different to the above (in practice)? - You can continue to use `react-redux`'s `connect` higher order component to wire state into and out of your components. You can connect before or after (or both!) attaching GraphQL data to your component with `graphql`: ```js @@ -516,6 +529,33 @@ const ListWithDataAndState = connect( )(ListWithData); ``` +

Usage with MobX

+ +```txt +npm install mobx mobx-react --save +``` + +In order to use [MobX](https://mobxjs.github.io/mobx/) with Apollo, you will need to place the `@observer` after the `@graphql` decoration. Then within your component, use `componentWillReact` to call `refetch` on the query when data changes. + +```js +import React from 'react'; +import ApolloClient from 'apollo-client'; +import { observer } from 'mobx-react'; + +@graphql(query, { + options: (props) => ({ variables: { first: props.appState.first } }), +}) +@observer +class Container extends React.Component { + componentWillReact() { + this.props.data.refetch({ first: this.props.appState.first }); + } + render() { + return
{this.props.appState.first}
; + } +}; +``` +

Usage with React Router

```txt From f65f64c06c12fbf104751e68683eb695b15f9a0d Mon Sep 17 00:00:00 2001 From: James Baxley Date: Fri, 12 Aug 2016 08:42:01 -0400 Subject: [PATCH 242/409] fix a couple formatting things --- docs/source/apollo-client/react.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 32a250047f6..d950990eb0e 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -4,15 +4,16 @@ order: 150 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- -The `react-apollo` package gives a higher-order-component style interface to Apollo Client to allow you to easily integrated GraphQL data with your React components. This works for react applications using ReactDOM (web applications), and react-native applications. +The `react-apollo` package gives a higher-order-component style interface to Apollo Client to allow you to easily integrated GraphQL data with your React components. ```txt npm install react-apollo --save ``` -[Follow apollostack/react-apollo on GitHub.](https://github.com/apollostack/react-apollo) +> Note: You don't have to do anything special to get Apollo Client to work in React Native, just install and import it as usual. + -Note: You don't have to do anything special to get Apollo Client to work in React Native, just install and import it as usual. +[Follow apollostack/react-apollo on GitHub.](https://github.com/apollostack/react-apollo)

ApolloProvider

@@ -195,7 +196,7 @@ const MyComponentWithData = graphql(GET_USER_WITH_ID, { })(MyComponent); ``` -Sometimes you may want to skip a query based on the available information, to do this, you can pass `skip: true` as part of the options. This is useful if you want to ignore a query if a user isn't authenticated: +Sometimes you may want to skip a query based on the available information, to do this you can pass `skip: true` as part of the options. This is useful if you want to ignore a query if a user isn't authenticated: ```js const MyComponentWithData = graphql(GET_USER_DATA, { @@ -426,7 +427,7 @@ const MyComponentWithData = graphql(GET_USER_WITH_ID, {

Using `getDataFromTree`

-The `getDataFromTree` function takes your $eact tree and returns the context of you React tree. This can be used to get the initialState via `context.store.getState()` +The `getDataFromTree` function takes your React tree and returns the context of you React tree. This can be used to get the initialState via `context.store.getState()` ```js // server application code (custom usage) @@ -538,15 +539,15 @@ npm install mobx mobx-react --save In order to use [MobX](https://mobxjs.github.io/mobx/) with Apollo, you will need to place the `@observer` after the `@graphql` decoration. Then within your component, use `componentWillReact` to call `refetch` on the query when data changes. ```js -import React from 'react'; +import { Component } from 'react'; import ApolloClient from 'apollo-client'; import { observer } from 'mobx-react'; -@graphql(query, { +@graphql(MY_QUERY, { options: (props) => ({ variables: { first: props.appState.first } }), }) @observer -class Container extends React.Component { +class Container extends Component { componentWillReact() { this.props.data.refetch({ first: this.props.appState.first }); } From 80d00b43564a7f8c140add64efc79062ee35bb89 Mon Sep 17 00:00:00 2001 From: James Baxley Date: Fri, 12 Aug 2016 08:47:37 -0400 Subject: [PATCH 243/409] ready for deploy :rocket: --- docs/package.json | 2 +- {docs/source => source}/apollo-client/angular2.md | 0 {docs/source => source}/apollo-client/devtools.md | 0 {docs/source => source}/apollo-client/fragments.md | 0 .../source => source}/apollo-client/how-it-works.md | 0 {docs/source => source}/apollo-client/index.md | 0 {docs/source => source}/apollo-client/meteor.md | 0 {docs/source => source}/apollo-client/mutations.md | 0 {docs/source => source}/apollo-client/network.md | 0 {docs/source => source}/apollo-client/pagination.md | 0 {docs/source => source}/apollo-client/queries.md | 0 {docs/source => source}/apollo-client/react.md | 0 {docs/source => source}/apollo-client/redux.md | 0 .../apollo-server/graphiql-casual-mocks.png | Bin {docs/source => source}/apollo-server/graphiql.md | 0 {docs/source => source}/apollo-server/index.md | 0 {docs/source => source}/apollo-server/migration.md | 0 {docs/source => source}/apollo-server/requests.md | 0 {docs/source => source}/apollo-server/setup.md | 0 .../assets/client-diagrams/1-overview.png | Bin .../assets/client-diagrams/2-map.png | Bin .../assets/client-diagrams/3-minimize.png | Bin .../assets/client-diagrams/4-normalize.png | Bin .../source => source}/assets/devtools/devtools.png | Bin .../assets/devtools/mutation-init.png | Bin .../assets/devtools/mutation-result-data.png | Bin .../assets/devtools/mutation-result.png | Bin .../assets/devtools/query-init-data.png | Bin .../assets/devtools/query-init.png | Bin .../assets/devtools/query-result.png | Bin {docs/source => source}/graphql-tools/connectors.md | 0 {docs/source => source}/graphql-tools/errors.md | 0 .../graphql-tools/generate-schema.md | 0 .../graphql-tools/graphiql-test.png | Bin {docs/source => source}/graphql-tools/guide.md | 0 {docs/source => source}/graphql-tools/index.md | 0 {docs/source => source}/graphql-tools/mocking.md | 0 {docs/source => source}/graphql-tools/resolvers.md | 0 {docs/source => source}/graphql-tools/scalars.md | 0 {docs/source => source}/graphql-tools/tools.md | 0 {docs/source => source}/index.md | 0 {docs/source => source}/logo/large.png | Bin {docs/source => source}/logo/square.png | Bin 43 files changed, 1 insertion(+), 1 deletion(-) rename {docs/source => source}/apollo-client/angular2.md (100%) rename {docs/source => source}/apollo-client/devtools.md (100%) rename {docs/source => source}/apollo-client/fragments.md (100%) rename {docs/source => source}/apollo-client/how-it-works.md (100%) rename {docs/source => source}/apollo-client/index.md (100%) rename {docs/source => source}/apollo-client/meteor.md (100%) rename {docs/source => source}/apollo-client/mutations.md (100%) rename {docs/source => source}/apollo-client/network.md (100%) rename {docs/source => source}/apollo-client/pagination.md (100%) rename {docs/source => source}/apollo-client/queries.md (100%) rename {docs/source => source}/apollo-client/react.md (100%) rename {docs/source => source}/apollo-client/redux.md (100%) rename {docs/source => source}/apollo-server/graphiql-casual-mocks.png (100%) rename {docs/source => source}/apollo-server/graphiql.md (100%) rename {docs/source => source}/apollo-server/index.md (100%) rename {docs/source => source}/apollo-server/migration.md (100%) rename {docs/source => source}/apollo-server/requests.md (100%) rename {docs/source => source}/apollo-server/setup.md (100%) rename {docs/source => source}/assets/client-diagrams/1-overview.png (100%) rename {docs/source => source}/assets/client-diagrams/2-map.png (100%) rename {docs/source => source}/assets/client-diagrams/3-minimize.png (100%) rename {docs/source => source}/assets/client-diagrams/4-normalize.png (100%) rename {docs/source => source}/assets/devtools/devtools.png (100%) rename {docs/source => source}/assets/devtools/mutation-init.png (100%) rename {docs/source => source}/assets/devtools/mutation-result-data.png (100%) rename {docs/source => source}/assets/devtools/mutation-result.png (100%) rename {docs/source => source}/assets/devtools/query-init-data.png (100%) rename {docs/source => source}/assets/devtools/query-init.png (100%) rename {docs/source => source}/assets/devtools/query-result.png (100%) rename {docs/source => source}/graphql-tools/connectors.md (100%) rename {docs/source => source}/graphql-tools/errors.md (100%) rename {docs/source => source}/graphql-tools/generate-schema.md (100%) rename {docs/source => source}/graphql-tools/graphiql-test.png (100%) rename {docs/source => source}/graphql-tools/guide.md (100%) rename {docs/source => source}/graphql-tools/index.md (100%) rename {docs/source => source}/graphql-tools/mocking.md (100%) rename {docs/source => source}/graphql-tools/resolvers.md (100%) rename {docs/source => source}/graphql-tools/scalars.md (100%) rename {docs/source => source}/graphql-tools/tools.md (100%) rename {docs/source => source}/index.md (100%) rename {docs/source => source}/logo/large.png (100%) rename {docs/source => source}/logo/square.png (100%) diff --git a/docs/package.json b/docs/package.json index f68d52545c0..9e9cf5f4acf 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "hexo": { - "version": "3.2.0" + "version": "3.2.2" }, "dependencies": { "hexo": "^3.2.0", diff --git a/docs/source/apollo-client/angular2.md b/source/apollo-client/angular2.md similarity index 100% rename from docs/source/apollo-client/angular2.md rename to source/apollo-client/angular2.md diff --git a/docs/source/apollo-client/devtools.md b/source/apollo-client/devtools.md similarity index 100% rename from docs/source/apollo-client/devtools.md rename to source/apollo-client/devtools.md diff --git a/docs/source/apollo-client/fragments.md b/source/apollo-client/fragments.md similarity index 100% rename from docs/source/apollo-client/fragments.md rename to source/apollo-client/fragments.md diff --git a/docs/source/apollo-client/how-it-works.md b/source/apollo-client/how-it-works.md similarity index 100% rename from docs/source/apollo-client/how-it-works.md rename to source/apollo-client/how-it-works.md diff --git a/docs/source/apollo-client/index.md b/source/apollo-client/index.md similarity index 100% rename from docs/source/apollo-client/index.md rename to source/apollo-client/index.md diff --git a/docs/source/apollo-client/meteor.md b/source/apollo-client/meteor.md similarity index 100% rename from docs/source/apollo-client/meteor.md rename to source/apollo-client/meteor.md diff --git a/docs/source/apollo-client/mutations.md b/source/apollo-client/mutations.md similarity index 100% rename from docs/source/apollo-client/mutations.md rename to source/apollo-client/mutations.md diff --git a/docs/source/apollo-client/network.md b/source/apollo-client/network.md similarity index 100% rename from docs/source/apollo-client/network.md rename to source/apollo-client/network.md diff --git a/docs/source/apollo-client/pagination.md b/source/apollo-client/pagination.md similarity index 100% rename from docs/source/apollo-client/pagination.md rename to source/apollo-client/pagination.md diff --git a/docs/source/apollo-client/queries.md b/source/apollo-client/queries.md similarity index 100% rename from docs/source/apollo-client/queries.md rename to source/apollo-client/queries.md diff --git a/docs/source/apollo-client/react.md b/source/apollo-client/react.md similarity index 100% rename from docs/source/apollo-client/react.md rename to source/apollo-client/react.md diff --git a/docs/source/apollo-client/redux.md b/source/apollo-client/redux.md similarity index 100% rename from docs/source/apollo-client/redux.md rename to source/apollo-client/redux.md diff --git a/docs/source/apollo-server/graphiql-casual-mocks.png b/source/apollo-server/graphiql-casual-mocks.png similarity index 100% rename from docs/source/apollo-server/graphiql-casual-mocks.png rename to source/apollo-server/graphiql-casual-mocks.png diff --git a/docs/source/apollo-server/graphiql.md b/source/apollo-server/graphiql.md similarity index 100% rename from docs/source/apollo-server/graphiql.md rename to source/apollo-server/graphiql.md diff --git a/docs/source/apollo-server/index.md b/source/apollo-server/index.md similarity index 100% rename from docs/source/apollo-server/index.md rename to source/apollo-server/index.md diff --git a/docs/source/apollo-server/migration.md b/source/apollo-server/migration.md similarity index 100% rename from docs/source/apollo-server/migration.md rename to source/apollo-server/migration.md diff --git a/docs/source/apollo-server/requests.md b/source/apollo-server/requests.md similarity index 100% rename from docs/source/apollo-server/requests.md rename to source/apollo-server/requests.md diff --git a/docs/source/apollo-server/setup.md b/source/apollo-server/setup.md similarity index 100% rename from docs/source/apollo-server/setup.md rename to source/apollo-server/setup.md diff --git a/docs/source/assets/client-diagrams/1-overview.png b/source/assets/client-diagrams/1-overview.png similarity index 100% rename from docs/source/assets/client-diagrams/1-overview.png rename to source/assets/client-diagrams/1-overview.png diff --git a/docs/source/assets/client-diagrams/2-map.png b/source/assets/client-diagrams/2-map.png similarity index 100% rename from docs/source/assets/client-diagrams/2-map.png rename to source/assets/client-diagrams/2-map.png diff --git a/docs/source/assets/client-diagrams/3-minimize.png b/source/assets/client-diagrams/3-minimize.png similarity index 100% rename from docs/source/assets/client-diagrams/3-minimize.png rename to source/assets/client-diagrams/3-minimize.png diff --git a/docs/source/assets/client-diagrams/4-normalize.png b/source/assets/client-diagrams/4-normalize.png similarity index 100% rename from docs/source/assets/client-diagrams/4-normalize.png rename to source/assets/client-diagrams/4-normalize.png diff --git a/docs/source/assets/devtools/devtools.png b/source/assets/devtools/devtools.png similarity index 100% rename from docs/source/assets/devtools/devtools.png rename to source/assets/devtools/devtools.png diff --git a/docs/source/assets/devtools/mutation-init.png b/source/assets/devtools/mutation-init.png similarity index 100% rename from docs/source/assets/devtools/mutation-init.png rename to source/assets/devtools/mutation-init.png diff --git a/docs/source/assets/devtools/mutation-result-data.png b/source/assets/devtools/mutation-result-data.png similarity index 100% rename from docs/source/assets/devtools/mutation-result-data.png rename to source/assets/devtools/mutation-result-data.png diff --git a/docs/source/assets/devtools/mutation-result.png b/source/assets/devtools/mutation-result.png similarity index 100% rename from docs/source/assets/devtools/mutation-result.png rename to source/assets/devtools/mutation-result.png diff --git a/docs/source/assets/devtools/query-init-data.png b/source/assets/devtools/query-init-data.png similarity index 100% rename from docs/source/assets/devtools/query-init-data.png rename to source/assets/devtools/query-init-data.png diff --git a/docs/source/assets/devtools/query-init.png b/source/assets/devtools/query-init.png similarity index 100% rename from docs/source/assets/devtools/query-init.png rename to source/assets/devtools/query-init.png diff --git a/docs/source/assets/devtools/query-result.png b/source/assets/devtools/query-result.png similarity index 100% rename from docs/source/assets/devtools/query-result.png rename to source/assets/devtools/query-result.png diff --git a/docs/source/graphql-tools/connectors.md b/source/graphql-tools/connectors.md similarity index 100% rename from docs/source/graphql-tools/connectors.md rename to source/graphql-tools/connectors.md diff --git a/docs/source/graphql-tools/errors.md b/source/graphql-tools/errors.md similarity index 100% rename from docs/source/graphql-tools/errors.md rename to source/graphql-tools/errors.md diff --git a/docs/source/graphql-tools/generate-schema.md b/source/graphql-tools/generate-schema.md similarity index 100% rename from docs/source/graphql-tools/generate-schema.md rename to source/graphql-tools/generate-schema.md diff --git a/docs/source/graphql-tools/graphiql-test.png b/source/graphql-tools/graphiql-test.png similarity index 100% rename from docs/source/graphql-tools/graphiql-test.png rename to source/graphql-tools/graphiql-test.png diff --git a/docs/source/graphql-tools/guide.md b/source/graphql-tools/guide.md similarity index 100% rename from docs/source/graphql-tools/guide.md rename to source/graphql-tools/guide.md diff --git a/docs/source/graphql-tools/index.md b/source/graphql-tools/index.md similarity index 100% rename from docs/source/graphql-tools/index.md rename to source/graphql-tools/index.md diff --git a/docs/source/graphql-tools/mocking.md b/source/graphql-tools/mocking.md similarity index 100% rename from docs/source/graphql-tools/mocking.md rename to source/graphql-tools/mocking.md diff --git a/docs/source/graphql-tools/resolvers.md b/source/graphql-tools/resolvers.md similarity index 100% rename from docs/source/graphql-tools/resolvers.md rename to source/graphql-tools/resolvers.md diff --git a/docs/source/graphql-tools/scalars.md b/source/graphql-tools/scalars.md similarity index 100% rename from docs/source/graphql-tools/scalars.md rename to source/graphql-tools/scalars.md diff --git a/docs/source/graphql-tools/tools.md b/source/graphql-tools/tools.md similarity index 100% rename from docs/source/graphql-tools/tools.md rename to source/graphql-tools/tools.md diff --git a/docs/source/index.md b/source/index.md similarity index 100% rename from docs/source/index.md rename to source/index.md diff --git a/docs/source/logo/large.png b/source/logo/large.png similarity index 100% rename from docs/source/logo/large.png rename to source/logo/large.png diff --git a/docs/source/logo/square.png b/source/logo/square.png similarity index 100% rename from docs/source/logo/square.png rename to source/logo/square.png From 0937a50303fc8bce1c9189acb9362967f7fb9d49 Mon Sep 17 00:00:00 2001 From: James Baxley Date: Fri, 12 Aug 2016 08:48:13 -0400 Subject: [PATCH 244/409] downgrade hexo --- docs/package.json | 4 ++-- {source => docs/source}/apollo-client/angular2.md | 0 {source => docs/source}/apollo-client/devtools.md | 0 {source => docs/source}/apollo-client/fragments.md | 0 .../source}/apollo-client/how-it-works.md | 0 {source => docs/source}/apollo-client/index.md | 0 {source => docs/source}/apollo-client/meteor.md | 0 {source => docs/source}/apollo-client/mutations.md | 0 {source => docs/source}/apollo-client/network.md | 0 {source => docs/source}/apollo-client/pagination.md | 0 {source => docs/source}/apollo-client/queries.md | 0 {source => docs/source}/apollo-client/react.md | 0 {source => docs/source}/apollo-client/redux.md | 0 .../source}/apollo-server/graphiql-casual-mocks.png | Bin {source => docs/source}/apollo-server/graphiql.md | 0 {source => docs/source}/apollo-server/index.md | 0 {source => docs/source}/apollo-server/migration.md | 0 {source => docs/source}/apollo-server/requests.md | 0 {source => docs/source}/apollo-server/setup.md | 0 .../source}/assets/client-diagrams/1-overview.png | Bin .../source}/assets/client-diagrams/2-map.png | Bin .../source}/assets/client-diagrams/3-minimize.png | Bin .../source}/assets/client-diagrams/4-normalize.png | Bin .../source}/assets/devtools/devtools.png | Bin .../source}/assets/devtools/mutation-init.png | Bin .../assets/devtools/mutation-result-data.png | Bin .../source}/assets/devtools/mutation-result.png | Bin .../source}/assets/devtools/query-init-data.png | Bin .../source}/assets/devtools/query-init.png | Bin .../source}/assets/devtools/query-result.png | Bin {source => docs/source}/graphql-tools/connectors.md | 0 {source => docs/source}/graphql-tools/errors.md | 0 .../source}/graphql-tools/generate-schema.md | 0 .../source}/graphql-tools/graphiql-test.png | Bin {source => docs/source}/graphql-tools/guide.md | 0 {source => docs/source}/graphql-tools/index.md | 0 {source => docs/source}/graphql-tools/mocking.md | 0 {source => docs/source}/graphql-tools/resolvers.md | 0 {source => docs/source}/graphql-tools/scalars.md | 0 {source => docs/source}/graphql-tools/tools.md | 0 {source => docs/source}/index.md | 0 {source => docs/source}/logo/large.png | Bin {source => docs/source}/logo/square.png | Bin 43 files changed, 2 insertions(+), 2 deletions(-) rename {source => docs/source}/apollo-client/angular2.md (100%) rename {source => docs/source}/apollo-client/devtools.md (100%) rename {source => docs/source}/apollo-client/fragments.md (100%) rename {source => docs/source}/apollo-client/how-it-works.md (100%) rename {source => docs/source}/apollo-client/index.md (100%) rename {source => docs/source}/apollo-client/meteor.md (100%) rename {source => docs/source}/apollo-client/mutations.md (100%) rename {source => docs/source}/apollo-client/network.md (100%) rename {source => docs/source}/apollo-client/pagination.md (100%) rename {source => docs/source}/apollo-client/queries.md (100%) rename {source => docs/source}/apollo-client/react.md (100%) rename {source => docs/source}/apollo-client/redux.md (100%) rename {source => docs/source}/apollo-server/graphiql-casual-mocks.png (100%) rename {source => docs/source}/apollo-server/graphiql.md (100%) rename {source => docs/source}/apollo-server/index.md (100%) rename {source => docs/source}/apollo-server/migration.md (100%) rename {source => docs/source}/apollo-server/requests.md (100%) rename {source => docs/source}/apollo-server/setup.md (100%) rename {source => docs/source}/assets/client-diagrams/1-overview.png (100%) rename {source => docs/source}/assets/client-diagrams/2-map.png (100%) rename {source => docs/source}/assets/client-diagrams/3-minimize.png (100%) rename {source => docs/source}/assets/client-diagrams/4-normalize.png (100%) rename {source => docs/source}/assets/devtools/devtools.png (100%) rename {source => docs/source}/assets/devtools/mutation-init.png (100%) rename {source => docs/source}/assets/devtools/mutation-result-data.png (100%) rename {source => docs/source}/assets/devtools/mutation-result.png (100%) rename {source => docs/source}/assets/devtools/query-init-data.png (100%) rename {source => docs/source}/assets/devtools/query-init.png (100%) rename {source => docs/source}/assets/devtools/query-result.png (100%) rename {source => docs/source}/graphql-tools/connectors.md (100%) rename {source => docs/source}/graphql-tools/errors.md (100%) rename {source => docs/source}/graphql-tools/generate-schema.md (100%) rename {source => docs/source}/graphql-tools/graphiql-test.png (100%) rename {source => docs/source}/graphql-tools/guide.md (100%) rename {source => docs/source}/graphql-tools/index.md (100%) rename {source => docs/source}/graphql-tools/mocking.md (100%) rename {source => docs/source}/graphql-tools/resolvers.md (100%) rename {source => docs/source}/graphql-tools/scalars.md (100%) rename {source => docs/source}/graphql-tools/tools.md (100%) rename {source => docs/source}/index.md (100%) rename {source => docs/source}/logo/large.png (100%) rename {source => docs/source}/logo/square.png (100%) diff --git a/docs/package.json b/docs/package.json index 9e9cf5f4acf..c94d3fdd666 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "hexo": { - "version": "3.2.2" + "version": "3.2.0" }, "dependencies": { "hexo": "^3.2.0", @@ -23,4 +23,4 @@ "start": "hexo serve", "deploy": "hexo-s3-deploy" } -} \ No newline at end of file +} diff --git a/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md similarity index 100% rename from source/apollo-client/angular2.md rename to docs/source/apollo-client/angular2.md diff --git a/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md similarity index 100% rename from source/apollo-client/devtools.md rename to docs/source/apollo-client/devtools.md diff --git a/source/apollo-client/fragments.md b/docs/source/apollo-client/fragments.md similarity index 100% rename from source/apollo-client/fragments.md rename to docs/source/apollo-client/fragments.md diff --git a/source/apollo-client/how-it-works.md b/docs/source/apollo-client/how-it-works.md similarity index 100% rename from source/apollo-client/how-it-works.md rename to docs/source/apollo-client/how-it-works.md diff --git a/source/apollo-client/index.md b/docs/source/apollo-client/index.md similarity index 100% rename from source/apollo-client/index.md rename to docs/source/apollo-client/index.md diff --git a/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md similarity index 100% rename from source/apollo-client/meteor.md rename to docs/source/apollo-client/meteor.md diff --git a/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md similarity index 100% rename from source/apollo-client/mutations.md rename to docs/source/apollo-client/mutations.md diff --git a/source/apollo-client/network.md b/docs/source/apollo-client/network.md similarity index 100% rename from source/apollo-client/network.md rename to docs/source/apollo-client/network.md diff --git a/source/apollo-client/pagination.md b/docs/source/apollo-client/pagination.md similarity index 100% rename from source/apollo-client/pagination.md rename to docs/source/apollo-client/pagination.md diff --git a/source/apollo-client/queries.md b/docs/source/apollo-client/queries.md similarity index 100% rename from source/apollo-client/queries.md rename to docs/source/apollo-client/queries.md diff --git a/source/apollo-client/react.md b/docs/source/apollo-client/react.md similarity index 100% rename from source/apollo-client/react.md rename to docs/source/apollo-client/react.md diff --git a/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md similarity index 100% rename from source/apollo-client/redux.md rename to docs/source/apollo-client/redux.md diff --git a/source/apollo-server/graphiql-casual-mocks.png b/docs/source/apollo-server/graphiql-casual-mocks.png similarity index 100% rename from source/apollo-server/graphiql-casual-mocks.png rename to docs/source/apollo-server/graphiql-casual-mocks.png diff --git a/source/apollo-server/graphiql.md b/docs/source/apollo-server/graphiql.md similarity index 100% rename from source/apollo-server/graphiql.md rename to docs/source/apollo-server/graphiql.md diff --git a/source/apollo-server/index.md b/docs/source/apollo-server/index.md similarity index 100% rename from source/apollo-server/index.md rename to docs/source/apollo-server/index.md diff --git a/source/apollo-server/migration.md b/docs/source/apollo-server/migration.md similarity index 100% rename from source/apollo-server/migration.md rename to docs/source/apollo-server/migration.md diff --git a/source/apollo-server/requests.md b/docs/source/apollo-server/requests.md similarity index 100% rename from source/apollo-server/requests.md rename to docs/source/apollo-server/requests.md diff --git a/source/apollo-server/setup.md b/docs/source/apollo-server/setup.md similarity index 100% rename from source/apollo-server/setup.md rename to docs/source/apollo-server/setup.md diff --git a/source/assets/client-diagrams/1-overview.png b/docs/source/assets/client-diagrams/1-overview.png similarity index 100% rename from source/assets/client-diagrams/1-overview.png rename to docs/source/assets/client-diagrams/1-overview.png diff --git a/source/assets/client-diagrams/2-map.png b/docs/source/assets/client-diagrams/2-map.png similarity index 100% rename from source/assets/client-diagrams/2-map.png rename to docs/source/assets/client-diagrams/2-map.png diff --git a/source/assets/client-diagrams/3-minimize.png b/docs/source/assets/client-diagrams/3-minimize.png similarity index 100% rename from source/assets/client-diagrams/3-minimize.png rename to docs/source/assets/client-diagrams/3-minimize.png diff --git a/source/assets/client-diagrams/4-normalize.png b/docs/source/assets/client-diagrams/4-normalize.png similarity index 100% rename from source/assets/client-diagrams/4-normalize.png rename to docs/source/assets/client-diagrams/4-normalize.png diff --git a/source/assets/devtools/devtools.png b/docs/source/assets/devtools/devtools.png similarity index 100% rename from source/assets/devtools/devtools.png rename to docs/source/assets/devtools/devtools.png diff --git a/source/assets/devtools/mutation-init.png b/docs/source/assets/devtools/mutation-init.png similarity index 100% rename from source/assets/devtools/mutation-init.png rename to docs/source/assets/devtools/mutation-init.png diff --git a/source/assets/devtools/mutation-result-data.png b/docs/source/assets/devtools/mutation-result-data.png similarity index 100% rename from source/assets/devtools/mutation-result-data.png rename to docs/source/assets/devtools/mutation-result-data.png diff --git a/source/assets/devtools/mutation-result.png b/docs/source/assets/devtools/mutation-result.png similarity index 100% rename from source/assets/devtools/mutation-result.png rename to docs/source/assets/devtools/mutation-result.png diff --git a/source/assets/devtools/query-init-data.png b/docs/source/assets/devtools/query-init-data.png similarity index 100% rename from source/assets/devtools/query-init-data.png rename to docs/source/assets/devtools/query-init-data.png diff --git a/source/assets/devtools/query-init.png b/docs/source/assets/devtools/query-init.png similarity index 100% rename from source/assets/devtools/query-init.png rename to docs/source/assets/devtools/query-init.png diff --git a/source/assets/devtools/query-result.png b/docs/source/assets/devtools/query-result.png similarity index 100% rename from source/assets/devtools/query-result.png rename to docs/source/assets/devtools/query-result.png diff --git a/source/graphql-tools/connectors.md b/docs/source/graphql-tools/connectors.md similarity index 100% rename from source/graphql-tools/connectors.md rename to docs/source/graphql-tools/connectors.md diff --git a/source/graphql-tools/errors.md b/docs/source/graphql-tools/errors.md similarity index 100% rename from source/graphql-tools/errors.md rename to docs/source/graphql-tools/errors.md diff --git a/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md similarity index 100% rename from source/graphql-tools/generate-schema.md rename to docs/source/graphql-tools/generate-schema.md diff --git a/source/graphql-tools/graphiql-test.png b/docs/source/graphql-tools/graphiql-test.png similarity index 100% rename from source/graphql-tools/graphiql-test.png rename to docs/source/graphql-tools/graphiql-test.png diff --git a/source/graphql-tools/guide.md b/docs/source/graphql-tools/guide.md similarity index 100% rename from source/graphql-tools/guide.md rename to docs/source/graphql-tools/guide.md diff --git a/source/graphql-tools/index.md b/docs/source/graphql-tools/index.md similarity index 100% rename from source/graphql-tools/index.md rename to docs/source/graphql-tools/index.md diff --git a/source/graphql-tools/mocking.md b/docs/source/graphql-tools/mocking.md similarity index 100% rename from source/graphql-tools/mocking.md rename to docs/source/graphql-tools/mocking.md diff --git a/source/graphql-tools/resolvers.md b/docs/source/graphql-tools/resolvers.md similarity index 100% rename from source/graphql-tools/resolvers.md rename to docs/source/graphql-tools/resolvers.md diff --git a/source/graphql-tools/scalars.md b/docs/source/graphql-tools/scalars.md similarity index 100% rename from source/graphql-tools/scalars.md rename to docs/source/graphql-tools/scalars.md diff --git a/source/graphql-tools/tools.md b/docs/source/graphql-tools/tools.md similarity index 100% rename from source/graphql-tools/tools.md rename to docs/source/graphql-tools/tools.md diff --git a/source/index.md b/docs/source/index.md similarity index 100% rename from source/index.md rename to docs/source/index.md diff --git a/source/logo/large.png b/docs/source/logo/large.png similarity index 100% rename from source/logo/large.png rename to docs/source/logo/large.png diff --git a/source/logo/square.png b/docs/source/logo/square.png similarity index 100% rename from source/logo/square.png rename to docs/source/logo/square.png From 8407952d472d2e8ac1dc67573f55427feb631678 Mon Sep 17 00:00:00 2001 From: James Baxley Date: Fri, 12 Aug 2016 09:24:26 -0400 Subject: [PATCH 245/409] added withRef to docs --- docs/source/apollo-client/react.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index d950990eb0e..052c2ff266b 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -236,6 +236,7 @@ const MyComponentWithUpvoteAndDownvote = graphql(DOWNVOTE, { })(MyComponentWithUpvote); ``` +

Using `props`

If you want a greater level of control, use the `props` to map the query results (or mutation, as we'll see [below](#graphql-mutations)) to the props to be passed to the child component: @@ -386,6 +387,25 @@ const MyComponentWithMutation = graphql(ADD_TASK, { > Note that in general you shouldn't attempt to use the results from the mutation callback directly, but instead write a [`updateQueries`](../apollo-client/mutations.html#updating-query-results) callback to update the result of relevant queries with your mutation results. + +

withRef

+ +If you need to get access to the instance of the wrapped component, you can use `withRef` in the options. +This will allow a `getWrappedInstance` method on the returned component which will return the wrapped instance. + +```js +import React, { Component } from 'react'; +import { graphql } from 'react-apollo'; + +class MyComponent extends Component { ... } + +const MyComponentWithUpvote = graphql(UPVOTE, { + withRef: 'true' +})(MyComponent); + +// MyComponentWithUpvote.getWrappedInstance() returns MyComponent instance +``` +

The `withApollo` container

`withApollo` is a simple higher order component which provides direct access to your `ApolloClient` instance as a prop to your wrapped component. This is useful if you want to do custom logic with apollo, without using the `graphql` container. From 7d6e33aabe9aaf281ebeac70f01bba35727cbb54 Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Fri, 12 Aug 2016 13:40:24 -0400 Subject: [PATCH 246/409] typo fix --- docs/source/apollo-client/react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 052c2ff266b..d8eb201e35c 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -4,7 +4,7 @@ order: 150 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- -The `react-apollo` package gives a higher-order-component style interface to Apollo Client to allow you to easily integrated GraphQL data with your React components. +The `react-apollo` package gives a higher-order-component style interface to Apollo Client to allow you to easily integrate GraphQL data with your React components. ```txt npm install react-apollo --save From d0c1ab286ecc74bdf06ec03d0bc3a0c4db40800c Mon Sep 17 00:00:00 2001 From: James Baxley Date: Fri, 12 Aug 2016 17:19:57 -0400 Subject: [PATCH 247/409] updated per comments --- docs/source/apollo-client/react.md | 82 +++++++++++++++--------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index d8eb201e35c..f9eff826600 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -60,7 +60,8 @@ const MyComponent = (props) =>
...
; // MyComponentWithData provides the query or mutation defined by // QUERY_OR_MUTATION to MyComponent. We'll see how below. -const MyComponentWithData = graphql(QUERY_OR_MUTATION, options)(MyComponent); +const withData = graphql(QUERY_OR_MUTATION, options); +const MyComponentWithData = withData(MyComponent); ``` If you are using [ES2016 decorators](https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841#.nn723s5u2), you may prefer the decorator syntax, although we'll use the older syntax in this guide: @@ -79,7 +80,7 @@ class MyComponent extends Component {

For Queries

-The first, and only required, argument of `graphql` is a [graphql](https://www.npmjs.com/package/graphql) document. You can compile such documents from query strings using the [graphql-tag](../apollo-client/index.html#gql) library. +The first, and only required, argument of `graphql` is a [graphql](https://www.npmjs.com/package/graphql) document. Use the `gql` template literal you can get from [graphql-tag](../apollo-client/index.html#gql) which parses the query string. ```js import React, { Component } from 'react'; @@ -104,7 +105,8 @@ const GET_USER = gql` } `; -const MyComponentWithData = graphql(GET_USER)(MyComponent); +const withUser = graphql(GET_USER); +const MyComponentWithData = withUser(MyComponent); ```

Default Result Props

@@ -134,20 +136,13 @@ Using `graphql` with queries makes it easy to bind data to components. As seen a The subscription created on this query will be merged into the passed props so you can dynamically refetch, change polling settings, or even unsubscribe to this query. The methods include `stopPolling`, `startPolling`, `refetch`, and `fetchMore`. -- [`query`](../apollo-client/queries.html#query) - - Sometimes you may want to call a custom query within a component. To make this possible, `graphql` passes the query method from ApolloClient as a prop - -- [`mutate`](../apollo-client/mutations.html#mutate) - - Sometimes you may want to call a custom mutation within a component. To make this possible, `graphql` passes the mutate method from ApolloClient as a prop

Providing `options`

If you want to configure the query (or the mutation, as we'll see below), you can provide an `options` function on the second argument to `graphql`: ```js -const MyComponentWithData = graphql(GET_USER, { +const withUser = graphql(GET_USER, { // Note ownProps here are the props that are passed into `MyComponentWithData` // when it is used options(ownProps) { @@ -155,7 +150,9 @@ const MyComponentWithData = graphql(GET_USER, { // options for ApolloClient.watchQuery } } -})(MyComponent); +}); + +const MyComponentWithData = withUser(MyComponent); ``` By default, `graphql` will attempt to pick up any missing variables from the query from `ownProps`. For example: @@ -174,34 +171,36 @@ const GET_USER_WITH_ID = gql` `; // Even though we haven't defined where `id` comes from, as long as we call // ``, the default options() will work. -const MyComponentWithData = graphql(GET_USER_WITH_ID)(MyComponent); +const withUserFromId = graphql(GET_USER_WITH_ID); +const MyComponentWithData = withUserFromId(MyComponent); ``` In general, you will probably want to be explicit about where the variables come from: ```js // If we'd prefer to call `` -const MyComponentWithData = graphql(GET_USER_WITH_ID, { - options: (ownProps) => ({ - variables: { id: ownProps.userId } - }) -})(MyComponent); +const withUserFromId = graphql(GET_USER_WITH_ID, { + options: (ownProps) => ({ variables: { id: ownProps.userId } }) +}); +const MyComponentWithData = withUserFromId(MyComponent); ``` Also, you may want to configure the [watchQuery](../apollo-client/queries.html#watchQuery) behaviour using `options`: ```js -const MyComponentWithData = graphql(GET_USER_WITH_ID, { +const withPollingQuery = graphql(GET_USER_WITH_ID, { options: () => ({ pollInterval: 1000 }) -})(MyComponent); +}); +const MyComponentWithData = withPollingQuery(MyComponent); ``` Sometimes you may want to skip a query based on the available information, to do this you can pass `skip: true` as part of the options. This is useful if you want to ignore a query if a user isn't authenticated: ```js -const MyComponentWithData = graphql(GET_USER_DATA, { +const withUser = graphql(GET_USER_DATA, { options: (ownProps) => ({ skip: !ownProps.authenticated }) -})(MyComponent); +}); +const MyComponentWithData = withUser(MyComponent); ``` When the props change (a user logs in for instance), the query options will be rerun and `react-apollo` will start the watchQuery on the operation. @@ -225,15 +224,13 @@ MyComponent.propTypes = { }; // This provides an `upvote` callback prop to `MyComponent` -const MyComponentWithUpvote = graphql(UPVOTE, { - name: 'upvote', -})(MyComponent); +const withUpVote = graphql(UPVOTE, { name: 'upvote' }); +const MyComponentWithUpvote = withUpVote(MyComponent); // This provides an `downvote` callback prop to `MyComponentWithUpvote`, // and subsequently `MyComponent` -const MyComponentWithUpvoteAndDownvote = graphql(DOWNVOTE, { - name: 'downvote', -})(MyComponentWithUpvote); +const withDownVote = graphql(DOWNVOTE, { name: 'downvote' }); +const MyComponentWithUpvoteAndDownvote = withDownVote(MyComponentWithUpvote); ``` @@ -261,7 +258,7 @@ const GET_USER_WITH_ID = gql` } `; -const MyComponentWithData = graphql(GET_USER_WITH_ID, { +const withUserFromId = graphql(GET_USER_WITH_ID, { // `ownProps` are the props passed into `MyComponentWithData` // `data` is the result data (see above) props: ({ ownProps, data }) => { @@ -273,6 +270,7 @@ const MyComponentWithData = graphql(GET_USER_WITH_ID, { }; } }); +const MyComponentWithData = withUserFromId(MyComponent); ``` This style of usage leads to the greatest decoupling between your presentational component (`MyComponent`) and Apollo. @@ -305,7 +303,8 @@ const ADD_TASK = gql` } `; -const MyComponentWithMutation = graphql(ADD_TASK)(MyComponent); +const withAddTask = graphql(ADD_TASK); +const MyComponentWithMutation = withAddTask(MyComponent); ```

Calling mutations

@@ -360,7 +359,7 @@ MyComponent.propTypes = { const ADD_TASK = ...; -const MyComponentWithMutation = graphql(ADD_TASK, { +const withAddTask = graphql(ADD_TASK, { props: ({ ownProps, mutate }) => ({ addTask(text) { return mutate({ @@ -382,7 +381,8 @@ const MyComponentWithMutation = graphql(ADD_TASK, { }); }, }) -})(MyComponent); +}); +const MyComponentWithMutation = withAddTask(MyComponent); ``` > Note that in general you shouldn't attempt to use the results from the mutation callback directly, but instead write a [`updateQueries`](../apollo-client/mutations.html#updating-query-results) callback to update the result of relevant queries with your mutation results. @@ -399,9 +399,8 @@ import { graphql } from 'react-apollo'; class MyComponent extends Component { ... } -const MyComponentWithUpvote = graphql(UPVOTE, { - withRef: 'true' -})(MyComponent); +const withUpvoteAndRef = graphql(UPVOTE, { withRef: 'true' }); +const MyComponentWithUpvote = withUpvoteAndRef(MyComponent); // MyComponentWithUpvote.getWrappedInstance() returns MyComponent instance ``` @@ -434,14 +433,16 @@ class MyComponent extends Component { } ``` -

Server methods

+

Server-side rendering and hydration

The `react-apollo` library supports integrated server side rendering for both store rehydration purposes, or fully rendered markup. No changes are required to client queries to support this, however, queries can be ignored during server rendering by passing `ssr: false` in the query options. For example: ```js -const MyComponentWithData = graphql(GET_USER_WITH_ID, { +const withClientOnlyUser = graphql(GET_USER_WITH_ID, { options: () => ({ ssr: false }) // won't be called during SSR -})(MyComponent); +}); + +const MyComponentWithData = withClientOnlyUser(MyComponent); ``` @@ -529,7 +530,7 @@ List.propTypes = { cloneList: React.PropType.function.isRequired, }; -const ListWithData = graphql(CLONE_LIST, { +const withCloneList = graphql(CLONE_LIST, { props: ({ ownProps, mutate }) => ({ cloneList() { return mutate() @@ -538,7 +539,8 @@ const ListWithData = graphql(CLONE_LIST, { }); }, }), -})(List); +}); +const ListWithData = withCloneList(List); const ListWithDataAndState = connect( (state) => ({ listId: state.list.id }), From 931fb1ce9a35e45a585fb364ad799ebf84f6fbd3 Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Mon, 15 Aug 2016 12:23:09 +1000 Subject: [PATCH 248/409] Added link to the old docs --- {source => docs/source}/apollo-client/angular2.md | 0 {source => docs/source}/apollo-client/devtools.md | 0 {source => docs/source}/apollo-client/fragments.md | 0 .../source}/apollo-client/how-it-works.md | 0 {source => docs/source}/apollo-client/index.md | 0 {source => docs/source}/apollo-client/meteor.md | 0 {source => docs/source}/apollo-client/mutations.md | 0 {source => docs/source}/apollo-client/network.md | 0 {source => docs/source}/apollo-client/pagination.md | 0 {source => docs/source}/apollo-client/queries.md | 0 {source => docs/source}/apollo-client/react.md | 2 ++ {source => docs/source}/apollo-client/redux.md | 0 .../source}/apollo-server/graphiql-casual-mocks.png | Bin {source => docs/source}/apollo-server/graphiql.md | 0 {source => docs/source}/apollo-server/index.md | 0 {source => docs/source}/apollo-server/migration.md | 0 {source => docs/source}/apollo-server/requests.md | 0 {source => docs/source}/apollo-server/setup.md | 0 .../source}/assets/client-diagrams/1-overview.png | Bin .../source}/assets/client-diagrams/2-map.png | Bin .../source}/assets/client-diagrams/3-minimize.png | Bin .../source}/assets/client-diagrams/4-normalize.png | Bin .../source}/assets/devtools/devtools.png | Bin .../source}/assets/devtools/mutation-init.png | Bin .../assets/devtools/mutation-result-data.png | Bin .../source}/assets/devtools/mutation-result.png | Bin .../source}/assets/devtools/query-init-data.png | Bin .../source}/assets/devtools/query-init.png | Bin .../source}/assets/devtools/query-result.png | Bin {source => docs/source}/graphql-tools/connectors.md | 0 {source => docs/source}/graphql-tools/errors.md | 0 .../source}/graphql-tools/generate-schema.md | 0 .../source}/graphql-tools/graphiql-test.png | Bin {source => docs/source}/graphql-tools/guide.md | 0 {source => docs/source}/graphql-tools/index.md | 0 {source => docs/source}/graphql-tools/mocking.md | 0 {source => docs/source}/graphql-tools/resolvers.md | 0 {source => docs/source}/graphql-tools/scalars.md | 0 {source => docs/source}/graphql-tools/tools.md | 0 {source => docs/source}/index.md | 0 {source => docs/source}/logo/large.png | Bin {source => docs/source}/logo/square.png | Bin 42 files changed, 2 insertions(+) rename {source => docs/source}/apollo-client/angular2.md (100%) rename {source => docs/source}/apollo-client/devtools.md (100%) rename {source => docs/source}/apollo-client/fragments.md (100%) rename {source => docs/source}/apollo-client/how-it-works.md (100%) rename {source => docs/source}/apollo-client/index.md (100%) rename {source => docs/source}/apollo-client/meteor.md (100%) rename {source => docs/source}/apollo-client/mutations.md (100%) rename {source => docs/source}/apollo-client/network.md (100%) rename {source => docs/source}/apollo-client/pagination.md (100%) rename {source => docs/source}/apollo-client/queries.md (100%) rename {source => docs/source}/apollo-client/react.md (98%) rename {source => docs/source}/apollo-client/redux.md (100%) rename {source => docs/source}/apollo-server/graphiql-casual-mocks.png (100%) rename {source => docs/source}/apollo-server/graphiql.md (100%) rename {source => docs/source}/apollo-server/index.md (100%) rename {source => docs/source}/apollo-server/migration.md (100%) rename {source => docs/source}/apollo-server/requests.md (100%) rename {source => docs/source}/apollo-server/setup.md (100%) rename {source => docs/source}/assets/client-diagrams/1-overview.png (100%) rename {source => docs/source}/assets/client-diagrams/2-map.png (100%) rename {source => docs/source}/assets/client-diagrams/3-minimize.png (100%) rename {source => docs/source}/assets/client-diagrams/4-normalize.png (100%) rename {source => docs/source}/assets/devtools/devtools.png (100%) rename {source => docs/source}/assets/devtools/mutation-init.png (100%) rename {source => docs/source}/assets/devtools/mutation-result-data.png (100%) rename {source => docs/source}/assets/devtools/mutation-result.png (100%) rename {source => docs/source}/assets/devtools/query-init-data.png (100%) rename {source => docs/source}/assets/devtools/query-init.png (100%) rename {source => docs/source}/assets/devtools/query-result.png (100%) rename {source => docs/source}/graphql-tools/connectors.md (100%) rename {source => docs/source}/graphql-tools/errors.md (100%) rename {source => docs/source}/graphql-tools/generate-schema.md (100%) rename {source => docs/source}/graphql-tools/graphiql-test.png (100%) rename {source => docs/source}/graphql-tools/guide.md (100%) rename {source => docs/source}/graphql-tools/index.md (100%) rename {source => docs/source}/graphql-tools/mocking.md (100%) rename {source => docs/source}/graphql-tools/resolvers.md (100%) rename {source => docs/source}/graphql-tools/scalars.md (100%) rename {source => docs/source}/graphql-tools/tools.md (100%) rename {source => docs/source}/index.md (100%) rename {source => docs/source}/logo/large.png (100%) rename {source => docs/source}/logo/square.png (100%) diff --git a/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md similarity index 100% rename from source/apollo-client/angular2.md rename to docs/source/apollo-client/angular2.md diff --git a/source/apollo-client/devtools.md b/docs/source/apollo-client/devtools.md similarity index 100% rename from source/apollo-client/devtools.md rename to docs/source/apollo-client/devtools.md diff --git a/source/apollo-client/fragments.md b/docs/source/apollo-client/fragments.md similarity index 100% rename from source/apollo-client/fragments.md rename to docs/source/apollo-client/fragments.md diff --git a/source/apollo-client/how-it-works.md b/docs/source/apollo-client/how-it-works.md similarity index 100% rename from source/apollo-client/how-it-works.md rename to docs/source/apollo-client/how-it-works.md diff --git a/source/apollo-client/index.md b/docs/source/apollo-client/index.md similarity index 100% rename from source/apollo-client/index.md rename to docs/source/apollo-client/index.md diff --git a/source/apollo-client/meteor.md b/docs/source/apollo-client/meteor.md similarity index 100% rename from source/apollo-client/meteor.md rename to docs/source/apollo-client/meteor.md diff --git a/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md similarity index 100% rename from source/apollo-client/mutations.md rename to docs/source/apollo-client/mutations.md diff --git a/source/apollo-client/network.md b/docs/source/apollo-client/network.md similarity index 100% rename from source/apollo-client/network.md rename to docs/source/apollo-client/network.md diff --git a/source/apollo-client/pagination.md b/docs/source/apollo-client/pagination.md similarity index 100% rename from source/apollo-client/pagination.md rename to docs/source/apollo-client/pagination.md diff --git a/source/apollo-client/queries.md b/docs/source/apollo-client/queries.md similarity index 100% rename from source/apollo-client/queries.md rename to docs/source/apollo-client/queries.md diff --git a/source/apollo-client/react.md b/docs/source/apollo-client/react.md similarity index 98% rename from source/apollo-client/react.md rename to docs/source/apollo-client/react.md index f9eff826600..5bd67b9f5d9 100644 --- a/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -4,6 +4,8 @@ order: 150 description: How to use the Apollo Client to fetch GraphQL data in your React application. --- +> NOTE: this is the documentation for version 0.4 of the `react-apollo` package. The older version 0.3 documentation is available here: http://docs.apollostack.com/vreact-apollo-0.3/apollo-client/react.html + The `react-apollo` package gives a higher-order-component style interface to Apollo Client to allow you to easily integrate GraphQL data with your React components. ```txt diff --git a/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md similarity index 100% rename from source/apollo-client/redux.md rename to docs/source/apollo-client/redux.md diff --git a/source/apollo-server/graphiql-casual-mocks.png b/docs/source/apollo-server/graphiql-casual-mocks.png similarity index 100% rename from source/apollo-server/graphiql-casual-mocks.png rename to docs/source/apollo-server/graphiql-casual-mocks.png diff --git a/source/apollo-server/graphiql.md b/docs/source/apollo-server/graphiql.md similarity index 100% rename from source/apollo-server/graphiql.md rename to docs/source/apollo-server/graphiql.md diff --git a/source/apollo-server/index.md b/docs/source/apollo-server/index.md similarity index 100% rename from source/apollo-server/index.md rename to docs/source/apollo-server/index.md diff --git a/source/apollo-server/migration.md b/docs/source/apollo-server/migration.md similarity index 100% rename from source/apollo-server/migration.md rename to docs/source/apollo-server/migration.md diff --git a/source/apollo-server/requests.md b/docs/source/apollo-server/requests.md similarity index 100% rename from source/apollo-server/requests.md rename to docs/source/apollo-server/requests.md diff --git a/source/apollo-server/setup.md b/docs/source/apollo-server/setup.md similarity index 100% rename from source/apollo-server/setup.md rename to docs/source/apollo-server/setup.md diff --git a/source/assets/client-diagrams/1-overview.png b/docs/source/assets/client-diagrams/1-overview.png similarity index 100% rename from source/assets/client-diagrams/1-overview.png rename to docs/source/assets/client-diagrams/1-overview.png diff --git a/source/assets/client-diagrams/2-map.png b/docs/source/assets/client-diagrams/2-map.png similarity index 100% rename from source/assets/client-diagrams/2-map.png rename to docs/source/assets/client-diagrams/2-map.png diff --git a/source/assets/client-diagrams/3-minimize.png b/docs/source/assets/client-diagrams/3-minimize.png similarity index 100% rename from source/assets/client-diagrams/3-minimize.png rename to docs/source/assets/client-diagrams/3-minimize.png diff --git a/source/assets/client-diagrams/4-normalize.png b/docs/source/assets/client-diagrams/4-normalize.png similarity index 100% rename from source/assets/client-diagrams/4-normalize.png rename to docs/source/assets/client-diagrams/4-normalize.png diff --git a/source/assets/devtools/devtools.png b/docs/source/assets/devtools/devtools.png similarity index 100% rename from source/assets/devtools/devtools.png rename to docs/source/assets/devtools/devtools.png diff --git a/source/assets/devtools/mutation-init.png b/docs/source/assets/devtools/mutation-init.png similarity index 100% rename from source/assets/devtools/mutation-init.png rename to docs/source/assets/devtools/mutation-init.png diff --git a/source/assets/devtools/mutation-result-data.png b/docs/source/assets/devtools/mutation-result-data.png similarity index 100% rename from source/assets/devtools/mutation-result-data.png rename to docs/source/assets/devtools/mutation-result-data.png diff --git a/source/assets/devtools/mutation-result.png b/docs/source/assets/devtools/mutation-result.png similarity index 100% rename from source/assets/devtools/mutation-result.png rename to docs/source/assets/devtools/mutation-result.png diff --git a/source/assets/devtools/query-init-data.png b/docs/source/assets/devtools/query-init-data.png similarity index 100% rename from source/assets/devtools/query-init-data.png rename to docs/source/assets/devtools/query-init-data.png diff --git a/source/assets/devtools/query-init.png b/docs/source/assets/devtools/query-init.png similarity index 100% rename from source/assets/devtools/query-init.png rename to docs/source/assets/devtools/query-init.png diff --git a/source/assets/devtools/query-result.png b/docs/source/assets/devtools/query-result.png similarity index 100% rename from source/assets/devtools/query-result.png rename to docs/source/assets/devtools/query-result.png diff --git a/source/graphql-tools/connectors.md b/docs/source/graphql-tools/connectors.md similarity index 100% rename from source/graphql-tools/connectors.md rename to docs/source/graphql-tools/connectors.md diff --git a/source/graphql-tools/errors.md b/docs/source/graphql-tools/errors.md similarity index 100% rename from source/graphql-tools/errors.md rename to docs/source/graphql-tools/errors.md diff --git a/source/graphql-tools/generate-schema.md b/docs/source/graphql-tools/generate-schema.md similarity index 100% rename from source/graphql-tools/generate-schema.md rename to docs/source/graphql-tools/generate-schema.md diff --git a/source/graphql-tools/graphiql-test.png b/docs/source/graphql-tools/graphiql-test.png similarity index 100% rename from source/graphql-tools/graphiql-test.png rename to docs/source/graphql-tools/graphiql-test.png diff --git a/source/graphql-tools/guide.md b/docs/source/graphql-tools/guide.md similarity index 100% rename from source/graphql-tools/guide.md rename to docs/source/graphql-tools/guide.md diff --git a/source/graphql-tools/index.md b/docs/source/graphql-tools/index.md similarity index 100% rename from source/graphql-tools/index.md rename to docs/source/graphql-tools/index.md diff --git a/source/graphql-tools/mocking.md b/docs/source/graphql-tools/mocking.md similarity index 100% rename from source/graphql-tools/mocking.md rename to docs/source/graphql-tools/mocking.md diff --git a/source/graphql-tools/resolvers.md b/docs/source/graphql-tools/resolvers.md similarity index 100% rename from source/graphql-tools/resolvers.md rename to docs/source/graphql-tools/resolvers.md diff --git a/source/graphql-tools/scalars.md b/docs/source/graphql-tools/scalars.md similarity index 100% rename from source/graphql-tools/scalars.md rename to docs/source/graphql-tools/scalars.md diff --git a/source/graphql-tools/tools.md b/docs/source/graphql-tools/tools.md similarity index 100% rename from source/graphql-tools/tools.md rename to docs/source/graphql-tools/tools.md diff --git a/source/index.md b/docs/source/index.md similarity index 100% rename from source/index.md rename to docs/source/index.md diff --git a/source/logo/large.png b/docs/source/logo/large.png similarity index 100% rename from source/logo/large.png rename to docs/source/logo/large.png diff --git a/source/logo/square.png b/docs/source/logo/square.png similarity index 100% rename from source/logo/square.png rename to docs/source/logo/square.png From 5ad2589c836011e994662de2472392bc99466789 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Tue, 16 Aug 2016 05:56:09 +0200 Subject: [PATCH 249/409] Angular2: ApolloModule and cleanup (#173) * Angular2: ApolloModule and cleanup * Angular2: observable variables in watchQuery --- docs/source/apollo-client/angular2.md | 263 +++++++++++++++----------- 1 file changed, 148 insertions(+), 115 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index c49d41851f4..0c765e98fdd 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -14,34 +14,67 @@ npm install angular2-apollo --save

Bootstrap

+*Angular Modules*, also known as *NgModules*, are the powerful new way to organize and bootstrap your Angular application. + +

ApolloModule

+ If you want to define the default *ApolloClient* to be used by `Angular2Apollo` service, you can use `defaultApolloClient` provider. ```ts -import { - bootstrap -} from '@angular/platform-browser-dynamic'; +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { ApolloModule, defaultApolloClient } from 'angular2-apollo'; +import ApolloClient, { createNetworkInterface } from 'apollo-client'; + +import { AppComponent } from './app.component'; + +const client = new ApolloClient({ + networkInterface: createNetworkInterface('http://localhost:8080') +}); -import { - defaultApolloClient, - APOLLO_PROVIDERS -} from 'angular2-apollo'; +@NgModule({ + imports: [ + BrowserModule, + ApolloModule, + ], + declarations: [ AppComponent ], + providers: [ defaultApolloClient(client) ], + bootstrap: [ AppComponent ], +}) +class AppModule {} + +platformBrowserDynamic().bootstrapModule(AppModule); +``` -import ApolloClient, { - createNetworkInterface -} from 'apollo-client'; +

ApolloModule.withClient

-import { - MyAppClass -} from './app/'; +You can also define the default *ApolloClient* to be used by `Angular2Apollo` service, by using `ApolloModule.withClient`. + +```ts +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { ApolloModule } from 'angular2-apollo'; +import ApolloClient, { createNetworkInterface } from 'apollo-client'; + +import { AppComponent } from './app.component'; const client = new ApolloClient({ networkInterface: createNetworkInterface('http://localhost:8080') }); -bootstrap(, [ - APOLLO_PROVIDERS, - defaultApolloClient(client) - ]); +@NgModule({ + imports: [ + BrowserModule, + ApolloModule.withClient(client), + ], + declarations: [ AppComponent ], + bootstrap: [ AppComponent ], +}) +class AppModule {} + +platformBrowserDynamic().bootstrapModule(AppModule); ```

Angular2Apollo service

@@ -53,21 +86,14 @@ This service allows you to bind queries and call mutations. Since you previously used `APOLLO_PROVIDERS` to bootstrap you app, it is possible now just to define `Angular2Apollo` service inside the constructor. ```ts -import { - Component, - Injectable -} from '@angular/core'; - -import { - Angular2Apollo -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Angular2Apollo } from 'angular2-apollo'; @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -@Injectable() -class postsList { +class PostsListComponent { constructor(private angularApollo : Angular2Apollo) { } } @@ -82,22 +108,16 @@ Here's how you could run a query: ```ts import 'rxjs'; -import { - Component -} from '@angular/core'; - -import { - Angular2Apollo, - ApolloQueryObservable -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Angular2Apollo, ApolloQueryObservable } from 'angular2-apollo'; import gql from 'graphql-tag'; @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -class postsList { +class PostsListComponent { posts: ApolloQueryObservable; constructor(private angularApollo : Angular2Apollo) { @@ -126,21 +146,16 @@ If you just want to fetch a query you can use `query` method with the same argum Here's how you could run a query: ```ts -import { - Component -} from '@angular/core'; - -import { - Angular2Apollo -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Angular2Apollo } from 'angular2-apollo'; import gql from 'graphql-tag'; @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -class postsList { +class PostsListComponent { posts: any[] = []; constructor(private angularApollo : Angular2Apollo) { @@ -163,34 +178,82 @@ class postsList { } ``` +**Variables with observable values** + +You can specify variables values as observables. Every time those observables emit new values, the query is rebuild. + +```ts +import { Component, OnInit } from '@angular/core'; +import { FormControl } from '@angular/forms'; +import { Angular2Apollo, ApolloQueryObservable } from 'angular2-apollo'; +import { Subject } from 'rxjs/Subject'; + +import gql from 'graphql-tag'; + +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/debounceTime'; + +@Component({ + selector: 'search', + template: ` + + +
    +
  • + {{result.title}} +
  • +
+ ` +}) +class SearchComponent implements OnInit { + results: ApolloQueryObservable; + searchControl = new FormControl(); + search: Subject = new Subject(); + + constructor(private angularApollo : Angular2Apollo) {} + + ngOnInit() { + this.results = angularApollo.query({ + query: gql` + query getResults($search: String) { + results(title: $search) { + title + } + } + `, + variables: { + title: this.search + } + }).map(response => response.data.results); + + this.searchControl.valueChanges + .debounceTime(300) + .subscribe(search => { + this.search.next(search); + }); + } +} +``` + +It is important to know that it is possible to mix observable values with primitive values. +

Mutations

-To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](mutations.html#mutate). In this case as the result you will receive a promise that resolves to a GraphQLResult. +To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](mutations.html#mutate). In this case as the result you will receive a promise that resolves to a ApolloQueryResult. Here's how you would call a mutation and pass in arguments via variables: ```ts -import { - Component, - Injectable -} from '@angular/core'; - -import { - Angular2Apollo -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Angular2Apollo } from 'angular2-apollo'; import gql from 'graphql-tag'; -import { - graphQLResult -} from 'graphql'; - @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -@Injectable() -class postsList { +class PostsListComponent { constructor(private angularApollo : Angular2Apollo) { } @@ -226,16 +289,12 @@ class postsList { category_id: categoryId, raw: raw, } - }).then((graphQLResult) => { - const { errors, data } = graphQLResult; + }).then((result) => { + const { data } = result; if (data) { console.log('got data', data); } - - if (errors) { - console.log('got some GraphQL execution errors', errors); - } }).catch((error) => { console.log('there was an error sending the query', error); }); @@ -277,17 +336,9 @@ It is also reactive so your variables will be always up to date. Here's how you could run a query: ```ts -import { - Component, Injectable -} from '@angular/core'; - -import { - Apollo -} from 'angular2-apollo'; - -import ApolloClient, { - createNetworkInterface -} from 'apollo-client'; +import { Component } from '@angular/core'; +import { Apollo } from 'angular2-apollo'; +import ApolloClient, { createNetworkInterface } from 'apollo-client'; import gql from 'graphql-tag'; @@ -296,13 +347,12 @@ const client = new ApolloClient({ }); @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -@Injectable() @Apollo({ client, - queries(context) { + queries(context: PostsListComponent) { return { data: { query: gql` @@ -322,7 +372,7 @@ const client = new ApolloClient({ }; } }) -class postsList { +class PostsListComponent { public tag: string = '1234'; public data: any; } @@ -338,22 +388,10 @@ It is also reactive so your variables will be always up to date. Here's how you could run a mutation: ```ts -import { - Component, - Injectable -} from '@angular/core'; - -import { - Apollo -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Apollo } from 'angular2-apollo'; -import { - GraphQLResult -} from 'graphql'; - -import ApolloClient, { - createNetworkInterface -} from 'apollo-client'; +import ApolloClient, { createNetworkInterface, ApolloQueryResult } from 'apollo-client'; import gql from 'graphql-tag'; @@ -362,13 +400,12 @@ const client = new ApolloClient({ }); @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -@Injectable() @Apollo({ client, - mutations(context) { + mutations(context: PostsListComponent) { return { postReply: ({ token, @@ -404,21 +441,17 @@ const client = new ApolloClient({ }; } }) -class postsList { +class PostsListComponent { public token: string = 'random'; reply(reply) { this.postReply(reply) - .then((result: GraphQLResult) => { - const { errors, data } = result; + .then((result: ApolloQueryResult) => { + const { data } = result; if (data) { console.log('got data', data); } - - if (errors) { - console.log('got some GraphQL execution errors', errors); - } }).catch((error) => { console.log('there was an error sending the query', error); }); From ad14c5abee6a221152f556bebd741362d0661fae Mon Sep 17 00:00:00 2001 From: Sashko Stubailo Date: Mon, 15 Aug 2016 20:59:46 -0700 Subject: [PATCH 250/409] Revert "Angular2: observable variables in watchQuery" This reverts commit db97cc44bff18a6f8e6700198e0efc37caefad6b. --- docs/source/apollo-client/angular2.md | 101 ++++++-------------------- 1 file changed, 21 insertions(+), 80 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index 0c765e98fdd..b9e4b1eecaa 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -90,10 +90,10 @@ import { Component } from '@angular/core'; import { Angular2Apollo } from 'angular2-apollo'; @Component({ - selector: 'posts-list', - templateUrl: 'client/posts-list.component.html' + selector: 'postsList', + templateUrl: 'client/postsList.html' }) -class PostsListComponent { +class postsList { constructor(private angularApollo : Angular2Apollo) { } } @@ -114,10 +114,10 @@ import { Angular2Apollo, ApolloQueryObservable } from 'angular2-apollo'; import gql from 'graphql-tag'; @Component({ - selector: 'posts-list', - templateUrl: 'client/posts-list.component.html' + selector: 'postsList', + templateUrl: 'client/postsList.html' }) -class PostsListComponent { +class postsList { posts: ApolloQueryObservable; constructor(private angularApollo : Angular2Apollo) { @@ -152,10 +152,10 @@ import { Angular2Apollo } from 'angular2-apollo'; import gql from 'graphql-tag'; @Component({ - selector: 'posts-list', - templateUrl: 'client/posts-list.component.html' + selector: 'postsList', + templateUrl: 'client/postsList.html' }) -class PostsListComponent { +class postsList { posts: any[] = []; constructor(private angularApollo : Angular2Apollo) { @@ -178,65 +178,6 @@ class PostsListComponent { } ``` -**Variables with observable values** - -You can specify variables values as observables. Every time those observables emit new values, the query is rebuild. - -```ts -import { Component, OnInit } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { Angular2Apollo, ApolloQueryObservable } from 'angular2-apollo'; -import { Subject } from 'rxjs/Subject'; - -import gql from 'graphql-tag'; - -import 'rxjs/add/operator/map'; -import 'rxjs/add/operator/debounceTime'; - -@Component({ - selector: 'search', - template: ` - - -
    -
  • - {{result.title}} -
  • -
- ` -}) -class SearchComponent implements OnInit { - results: ApolloQueryObservable; - searchControl = new FormControl(); - search: Subject = new Subject(); - - constructor(private angularApollo : Angular2Apollo) {} - - ngOnInit() { - this.results = angularApollo.query({ - query: gql` - query getResults($search: String) { - results(title: $search) { - title - } - } - `, - variables: { - title: this.search - } - }).map(response => response.data.results); - - this.searchControl.valueChanges - .debounceTime(300) - .subscribe(search => { - this.search.next(search); - }); - } -} -``` - -It is important to know that it is possible to mix observable values with primitive values. -

Mutations

To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](mutations.html#mutate). In this case as the result you will receive a promise that resolves to a ApolloQueryResult. @@ -250,10 +191,10 @@ import { Angular2Apollo } from 'angular2-apollo'; import gql from 'graphql-tag'; @Component({ - selector: 'posts-list', - templateUrl: 'client/posts-list.component.html' + selector: 'postsList', + templateUrl: 'client/postsList.html' }) -class PostsListComponent { +class postsList { constructor(private angularApollo : Angular2Apollo) { } @@ -290,7 +231,7 @@ class PostsListComponent { raw: raw, } }).then((result) => { - const { data } = result; + const { errors, data } = result; if (data) { console.log('got data', data); @@ -347,12 +288,12 @@ const client = new ApolloClient({ }); @Component({ - selector: 'posts-list', - templateUrl: 'client/posts-list.component.html' + selector: 'postsList', + templateUrl: 'client/postsList.html' }) @Apollo({ client, - queries(context: PostsListComponent) { + queries(context) { return { data: { query: gql` @@ -372,7 +313,7 @@ const client = new ApolloClient({ }; } }) -class PostsListComponent { +class postsList { public tag: string = '1234'; public data: any; } @@ -400,12 +341,12 @@ const client = new ApolloClient({ }); @Component({ - selector: 'posts-list', - templateUrl: 'client/posts-list.component.html' + selector: 'postsList', + templateUrl: 'client/postsList.html' }) @Apollo({ client, - mutations(context: PostsListComponent) { + mutations(context) { return { postReply: ({ token, @@ -441,7 +382,7 @@ const client = new ApolloClient({ }; } }) -class PostsListComponent { +class postsList { public token: string = 'random'; reply(reply) { From bb2a6eafbb82fdeed71c2c026b856fac12c45e29 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Tue, 16 Aug 2016 09:11:49 +0200 Subject: [PATCH 251/409] Revert "Angular2: ApolloModule and cleanup (#173)" (#174) This reverts commit 80ebc5a2bf5aed0aac20cca5987381655379fc3b. --- docs/source/apollo-client/angular2.md | 164 +++++++++++++++----------- 1 file changed, 95 insertions(+), 69 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index b9e4b1eecaa..c49d41851f4 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -14,67 +14,34 @@ npm install angular2-apollo --save

Bootstrap

-*Angular Modules*, also known as *NgModules*, are the powerful new way to organize and bootstrap your Angular application. - -

ApolloModule

- If you want to define the default *ApolloClient* to be used by `Angular2Apollo` service, you can use `defaultApolloClient` provider. ```ts -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { ApolloModule, defaultApolloClient } from 'angular2-apollo'; -import ApolloClient, { createNetworkInterface } from 'apollo-client'; - -import { AppComponent } from './app.component'; - -const client = new ApolloClient({ - networkInterface: createNetworkInterface('http://localhost:8080') -}); +import { + bootstrap +} from '@angular/platform-browser-dynamic'; -@NgModule({ - imports: [ - BrowserModule, - ApolloModule, - ], - declarations: [ AppComponent ], - providers: [ defaultApolloClient(client) ], - bootstrap: [ AppComponent ], -}) -class AppModule {} - -platformBrowserDynamic().bootstrapModule(AppModule); -``` +import { + defaultApolloClient, + APOLLO_PROVIDERS +} from 'angular2-apollo'; -

ApolloModule.withClient

+import ApolloClient, { + createNetworkInterface +} from 'apollo-client'; -You can also define the default *ApolloClient* to be used by `Angular2Apollo` service, by using `ApolloModule.withClient`. - -```ts -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { ApolloModule } from 'angular2-apollo'; -import ApolloClient, { createNetworkInterface } from 'apollo-client'; - -import { AppComponent } from './app.component'; +import { + MyAppClass +} from './app/'; const client = new ApolloClient({ networkInterface: createNetworkInterface('http://localhost:8080') }); -@NgModule({ - imports: [ - BrowserModule, - ApolloModule.withClient(client), - ], - declarations: [ AppComponent ], - bootstrap: [ AppComponent ], -}) -class AppModule {} - -platformBrowserDynamic().bootstrapModule(AppModule); +bootstrap(, [ + APOLLO_PROVIDERS, + defaultApolloClient(client) + ]); ```

Angular2Apollo service

@@ -86,13 +53,20 @@ This service allows you to bind queries and call mutations. Since you previously used `APOLLO_PROVIDERS` to bootstrap you app, it is possible now just to define `Angular2Apollo` service inside the constructor. ```ts -import { Component } from '@angular/core'; -import { Angular2Apollo } from 'angular2-apollo'; +import { + Component, + Injectable +} from '@angular/core'; + +import { + Angular2Apollo +} from 'angular2-apollo'; @Component({ selector: 'postsList', templateUrl: 'client/postsList.html' }) +@Injectable() class postsList { constructor(private angularApollo : Angular2Apollo) { } @@ -108,8 +82,14 @@ Here's how you could run a query: ```ts import 'rxjs'; -import { Component } from '@angular/core'; -import { Angular2Apollo, ApolloQueryObservable } from 'angular2-apollo'; +import { + Component +} from '@angular/core'; + +import { + Angular2Apollo, + ApolloQueryObservable +} from 'angular2-apollo'; import gql from 'graphql-tag'; @@ -146,8 +126,13 @@ If you just want to fetch a query you can use `query` method with the same argum Here's how you could run a query: ```ts -import { Component } from '@angular/core'; -import { Angular2Apollo } from 'angular2-apollo'; +import { + Component +} from '@angular/core'; + +import { + Angular2Apollo +} from 'angular2-apollo'; import gql from 'graphql-tag'; @@ -180,20 +165,31 @@ class postsList {

Mutations

-To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](mutations.html#mutate). In this case as the result you will receive a promise that resolves to a ApolloQueryResult. +To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](mutations.html#mutate). In this case as the result you will receive a promise that resolves to a GraphQLResult. Here's how you would call a mutation and pass in arguments via variables: ```ts -import { Component } from '@angular/core'; -import { Angular2Apollo } from 'angular2-apollo'; +import { + Component, + Injectable +} from '@angular/core'; + +import { + Angular2Apollo +} from 'angular2-apollo'; import gql from 'graphql-tag'; +import { + graphQLResult +} from 'graphql'; + @Component({ selector: 'postsList', templateUrl: 'client/postsList.html' }) +@Injectable() class postsList { constructor(private angularApollo : Angular2Apollo) { @@ -230,12 +226,16 @@ class postsList { category_id: categoryId, raw: raw, } - }).then((result) => { - const { errors, data } = result; + }).then((graphQLResult) => { + const { errors, data } = graphQLResult; if (data) { console.log('got data', data); } + + if (errors) { + console.log('got some GraphQL execution errors', errors); + } }).catch((error) => { console.log('there was an error sending the query', error); }); @@ -277,9 +277,17 @@ It is also reactive so your variables will be always up to date. Here's how you could run a query: ```ts -import { Component } from '@angular/core'; -import { Apollo } from 'angular2-apollo'; -import ApolloClient, { createNetworkInterface } from 'apollo-client'; +import { + Component, Injectable +} from '@angular/core'; + +import { + Apollo +} from 'angular2-apollo'; + +import ApolloClient, { + createNetworkInterface +} from 'apollo-client'; import gql from 'graphql-tag'; @@ -291,6 +299,7 @@ const client = new ApolloClient({ selector: 'postsList', templateUrl: 'client/postsList.html' }) +@Injectable() @Apollo({ client, queries(context) { @@ -329,10 +338,22 @@ It is also reactive so your variables will be always up to date. Here's how you could run a mutation: ```ts -import { Component } from '@angular/core'; -import { Apollo } from 'angular2-apollo'; +import { + Component, + Injectable +} from '@angular/core'; + +import { + Apollo +} from 'angular2-apollo'; -import ApolloClient, { createNetworkInterface, ApolloQueryResult } from 'apollo-client'; +import { + GraphQLResult +} from 'graphql'; + +import ApolloClient, { + createNetworkInterface +} from 'apollo-client'; import gql from 'graphql-tag'; @@ -344,6 +365,7 @@ const client = new ApolloClient({ selector: 'postsList', templateUrl: 'client/postsList.html' }) +@Injectable() @Apollo({ client, mutations(context) { @@ -387,12 +409,16 @@ class postsList { reply(reply) { this.postReply(reply) - .then((result: ApolloQueryResult) => { - const { data } = result; + .then((result: GraphQLResult) => { + const { errors, data } = result; if (data) { console.log('got data', data); } + + if (errors) { + console.log('got some GraphQL execution errors', errors); + } }).catch((error) => { console.log('there was an error sending the query', error); }); From 05ebed4939c5770ae1a2db09a0262a5a6952fe01 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Tue, 16 Aug 2016 11:01:26 +0200 Subject: [PATCH 252/409] Angular2: Observale variables and NgModule (#175) --- docs/source/apollo-client/angular2.md | 263 +++++++++++++++----------- 1 file changed, 148 insertions(+), 115 deletions(-) diff --git a/docs/source/apollo-client/angular2.md b/docs/source/apollo-client/angular2.md index c49d41851f4..0c765e98fdd 100644 --- a/docs/source/apollo-client/angular2.md +++ b/docs/source/apollo-client/angular2.md @@ -14,34 +14,67 @@ npm install angular2-apollo --save

Bootstrap

+*Angular Modules*, also known as *NgModules*, are the powerful new way to organize and bootstrap your Angular application. + +

ApolloModule

+ If you want to define the default *ApolloClient* to be used by `Angular2Apollo` service, you can use `defaultApolloClient` provider. ```ts -import { - bootstrap -} from '@angular/platform-browser-dynamic'; +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { ApolloModule, defaultApolloClient } from 'angular2-apollo'; +import ApolloClient, { createNetworkInterface } from 'apollo-client'; + +import { AppComponent } from './app.component'; + +const client = new ApolloClient({ + networkInterface: createNetworkInterface('http://localhost:8080') +}); -import { - defaultApolloClient, - APOLLO_PROVIDERS -} from 'angular2-apollo'; +@NgModule({ + imports: [ + BrowserModule, + ApolloModule, + ], + declarations: [ AppComponent ], + providers: [ defaultApolloClient(client) ], + bootstrap: [ AppComponent ], +}) +class AppModule {} + +platformBrowserDynamic().bootstrapModule(AppModule); +``` -import ApolloClient, { - createNetworkInterface -} from 'apollo-client'; +

ApolloModule.withClient

-import { - MyAppClass -} from './app/'; +You can also define the default *ApolloClient* to be used by `Angular2Apollo` service, by using `ApolloModule.withClient`. + +```ts +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { ApolloModule } from 'angular2-apollo'; +import ApolloClient, { createNetworkInterface } from 'apollo-client'; + +import { AppComponent } from './app.component'; const client = new ApolloClient({ networkInterface: createNetworkInterface('http://localhost:8080') }); -bootstrap(, [ - APOLLO_PROVIDERS, - defaultApolloClient(client) - ]); +@NgModule({ + imports: [ + BrowserModule, + ApolloModule.withClient(client), + ], + declarations: [ AppComponent ], + bootstrap: [ AppComponent ], +}) +class AppModule {} + +platformBrowserDynamic().bootstrapModule(AppModule); ```

Angular2Apollo service

@@ -53,21 +86,14 @@ This service allows you to bind queries and call mutations. Since you previously used `APOLLO_PROVIDERS` to bootstrap you app, it is possible now just to define `Angular2Apollo` service inside the constructor. ```ts -import { - Component, - Injectable -} from '@angular/core'; - -import { - Angular2Apollo -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Angular2Apollo } from 'angular2-apollo'; @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -@Injectable() -class postsList { +class PostsListComponent { constructor(private angularApollo : Angular2Apollo) { } } @@ -82,22 +108,16 @@ Here's how you could run a query: ```ts import 'rxjs'; -import { - Component -} from '@angular/core'; - -import { - Angular2Apollo, - ApolloQueryObservable -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Angular2Apollo, ApolloQueryObservable } from 'angular2-apollo'; import gql from 'graphql-tag'; @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -class postsList { +class PostsListComponent { posts: ApolloQueryObservable; constructor(private angularApollo : Angular2Apollo) { @@ -126,21 +146,16 @@ If you just want to fetch a query you can use `query` method with the same argum Here's how you could run a query: ```ts -import { - Component -} from '@angular/core'; - -import { - Angular2Apollo -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Angular2Apollo } from 'angular2-apollo'; import gql from 'graphql-tag'; @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -class postsList { +class PostsListComponent { posts: any[] = []; constructor(private angularApollo : Angular2Apollo) { @@ -163,34 +178,82 @@ class postsList { } ``` +**Variables with observable values** + +You can specify variables values as observables. Every time those observables emit new values, the query is rebuild. + +```ts +import { Component, OnInit } from '@angular/core'; +import { FormControl } from '@angular/forms'; +import { Angular2Apollo, ApolloQueryObservable } from 'angular2-apollo'; +import { Subject } from 'rxjs/Subject'; + +import gql from 'graphql-tag'; + +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/debounceTime'; + +@Component({ + selector: 'search', + template: ` + + +
    +
  • + {{result.title}} +
  • +
+ ` +}) +class SearchComponent implements OnInit { + results: ApolloQueryObservable; + searchControl = new FormControl(); + search: Subject = new Subject(); + + constructor(private angularApollo : Angular2Apollo) {} + + ngOnInit() { + this.results = angularApollo.query({ + query: gql` + query getResults($search: String) { + results(title: $search) { + title + } + } + `, + variables: { + title: this.search + } + }).map(response => response.data.results); + + this.searchControl.valueChanges + .debounceTime(300) + .subscribe(search => { + this.search.next(search); + }); + } +} +``` + +It is important to know that it is possible to mix observable values with primitive values. +

Mutations

-To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](mutations.html#mutate). In this case as the result you will receive a promise that resolves to a GraphQLResult. +To call a mutation you can use `mutate` method with the same arguments as [`ApolloClient#mutate`](mutations.html#mutate). In this case as the result you will receive a promise that resolves to a ApolloQueryResult. Here's how you would call a mutation and pass in arguments via variables: ```ts -import { - Component, - Injectable -} from '@angular/core'; - -import { - Angular2Apollo -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Angular2Apollo } from 'angular2-apollo'; import gql from 'graphql-tag'; -import { - graphQLResult -} from 'graphql'; - @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -@Injectable() -class postsList { +class PostsListComponent { constructor(private angularApollo : Angular2Apollo) { } @@ -226,16 +289,12 @@ class postsList { category_id: categoryId, raw: raw, } - }).then((graphQLResult) => { - const { errors, data } = graphQLResult; + }).then((result) => { + const { data } = result; if (data) { console.log('got data', data); } - - if (errors) { - console.log('got some GraphQL execution errors', errors); - } }).catch((error) => { console.log('there was an error sending the query', error); }); @@ -277,17 +336,9 @@ It is also reactive so your variables will be always up to date. Here's how you could run a query: ```ts -import { - Component, Injectable -} from '@angular/core'; - -import { - Apollo -} from 'angular2-apollo'; - -import ApolloClient, { - createNetworkInterface -} from 'apollo-client'; +import { Component } from '@angular/core'; +import { Apollo } from 'angular2-apollo'; +import ApolloClient, { createNetworkInterface } from 'apollo-client'; import gql from 'graphql-tag'; @@ -296,13 +347,12 @@ const client = new ApolloClient({ }); @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -@Injectable() @Apollo({ client, - queries(context) { + queries(context: PostsListComponent) { return { data: { query: gql` @@ -322,7 +372,7 @@ const client = new ApolloClient({ }; } }) -class postsList { +class PostsListComponent { public tag: string = '1234'; public data: any; } @@ -338,22 +388,10 @@ It is also reactive so your variables will be always up to date. Here's how you could run a mutation: ```ts -import { - Component, - Injectable -} from '@angular/core'; - -import { - Apollo -} from 'angular2-apollo'; +import { Component } from '@angular/core'; +import { Apollo } from 'angular2-apollo'; -import { - GraphQLResult -} from 'graphql'; - -import ApolloClient, { - createNetworkInterface -} from 'apollo-client'; +import ApolloClient, { createNetworkInterface, ApolloQueryResult } from 'apollo-client'; import gql from 'graphql-tag'; @@ -362,13 +400,12 @@ const client = new ApolloClient({ }); @Component({ - selector: 'postsList', - templateUrl: 'client/postsList.html' + selector: 'posts-list', + templateUrl: 'client/posts-list.component.html' }) -@Injectable() @Apollo({ client, - mutations(context) { + mutations(context: PostsListComponent) { return { postReply: ({ token, @@ -404,21 +441,17 @@ const client = new ApolloClient({ }; } }) -class postsList { +class PostsListComponent { public token: string = 'random'; reply(reply) { this.postReply(reply) - .then((result: GraphQLResult) => { - const { errors, data } = result; + .then((result: ApolloQueryResult) => { + const { data } = result; if (data) { console.log('got data', data); } - - if (errors) { - console.log('got some GraphQL execution errors', errors); - } }).catch((error) => { console.log('there was an error sending the query', error); }); From 7df84992b5a7220afa942cacfbe24419d6314c05 Mon Sep 17 00:00:00 2001 From: Jason McIver Date: Wed, 17 Aug 2016 04:53:44 +1000 Subject: [PATCH 253/409] Update requests.md (#176) --- docs/source/apollo-server/requests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/apollo-server/requests.md b/docs/source/apollo-server/requests.md index 6ac4e928b5e..df6b47f2f82 100644 --- a/docs/source/apollo-server/requests.md +++ b/docs/source/apollo-server/requests.md @@ -4,7 +4,7 @@ order: 303 description: How to send requests to Apollo Server --- -Apollo Server accepts only JSON-encoded POST requests. A valid request must contain eiter a `query` or an `operationName` (or both, in case of a named query), and may include `variables.` For example: +Apollo Server accepts only JSON-encoded POST requests. A valid request must contain either a `query` or an `operationName` (or both, in case of a named query), and may include `variables.` For example: ```js { From 6c1c11fe2419a89f397ea72ebce40bd8bbb1f5b2 Mon Sep 17 00:00:00 2001 From: "Vedanta-krit das (Alex Vedmedenko)" Date: Thu, 18 Aug 2016 00:37:23 +0300 Subject: [PATCH 254/409] fixes #75: update docs to developer not forget setup empty object (#166) * setup default contect to empty object While moving from previous version don't forget to setup new context * Update migration.md * update comments --- docs/source/apollo-server/migration.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/source/apollo-server/migration.md b/docs/source/apollo-server/migration.md index 6548af2df67..66de891d0eb 100644 --- a/docs/source/apollo-server/migration.md +++ b/docs/source/apollo-server/migration.md @@ -11,6 +11,7 @@ The most notable changes are: - `apolloExpress` no longer accepts shorthand type definitions - `apolloExpress` doesn't have the `resolvers`, `mocks` and `connectors` options. - `apolloExpress` doesn't include GraphiQL any more +- `context` if you use connectors in your schema, don't forget to setup default `context` to at least an empty object, it can't be `undefined` in this case - Apollo Server no longer accepts GET requests or parameters in the URL - `apolloExpress` no longer parses the HTTP body automatically @@ -85,8 +86,10 @@ addMockFunctionsToSchema({ preserveResolvers: true, }); +// `context` must be an object and can't be undefined when using connectors graphQLServer.use('/graphql', bodyParser.json(), apolloExpress({ schema: executableSchema, + context: {}, //at least(!) an empty object })); graphQLServer.use('/graphiql', graphiqlExpress({ From 032e372d5854d4d1b08508e2c7ddae3cad393d70 Mon Sep 17 00:00:00 2001 From: Cristian Leyes Date: Wed, 17 Aug 2016 18:39:36 -0300 Subject: [PATCH 255/409] Update index.md (#177) --- docs/source/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/index.md b/docs/source/index.md index a4a764b8d1c..706e0543b03 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -42,3 +42,4 @@ We have put together some basic example apps using various parts of Apollo; chec - [Shopping Cart](https://github.com/abhiaiyer91/meteor-pg-apollo-shopping-cart) - [A Meteor Integration example that uses SQL, MongoDB + Rest](https://github.com/abhiaiyer91/sample-graphql-meteor-server) - [A full-stack app with a Material UI React frontend on top of Discourse](https://github.com/apollostack/apollo-demo) +- [Simple example using FlowRouter as a Routes manager](https://github.com/AYCRAL/meteor-apollo-flow) From 0fe32dce4767981c831f0f61f747a35cbee4605f Mon Sep 17 00:00:00 2001 From: James Baxley Date: Fri, 19 Aug 2016 17:58:24 -0400 Subject: [PATCH 256/409] added info about redux-form and immutablejs (#172) * added info about redux-form and immutablejs * fixed things from notes --- docs/source/apollo-client/react.md | 103 +++++++++++++++++++++++++++++ docs/source/apollo-client/redux.md | 4 -- 2 files changed, 103 insertions(+), 4 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 5bd67b9f5d9..6c01ca03329 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -554,6 +554,109 @@ const ListWithDataAndState = connect( )(ListWithData); ``` +

Usage with ImmutableJs for redux store

+ +```txt +npm install immutable redux-immutable --save +``` + +If you are using ImmutableJs or another form of immutable map as your redux store, `` allows you to pass `immutable={true}` alongside your store to separate the apollo-client store. For example: + +```js +import { Map } from 'immutable'; +import { combineReducers } from 'redux-immutable'; + +const initialState = Map(); +const store = createStore(combineReducers({ counter }), initialState); +const client = new ApolloClient(); + +// include the provider like so + + + +// then somewhere in your app +const withConnect = connect((state) => ({ first: state.get('counter') })); +const withQuery = graphql(query) + +class List extends Component { ... } +const ListWithDataAndImmutableState = withConnect(withQuery(List)); +``` + +

Usage with redux-form

+ +```txt +npm install redux-form --save +``` + +`graphql` can be used to prefill fields for a redux-form form, or use the values from the store to set variables in a query. Both methods are shown below for example: + +```js +import { reducer as formReducer, reduxForm } from 'redux-form'; + +// client and store setup +const client = new ApolloClient(); +const store = createStore( + combineReducers({ + apollo: client.reducer(), + form: formReducer, // from redux form + }), + applyMiddleware(client.middleware()) +); + +// generic form component +class Container extends Component { + render() { + const { fields: { firstName }, handleSubmit } = this.props; + return ( +
+
+ + +
+ +
+ ); + } +}; + +/* + + using the form to call a query + +*/ +const withForm = reduxForm({ form: 'contact', fields: ['firstName'] }) + +const withQuery = graphql(query, { + options: ({ fields }) => ({ + variables: { name: fields.firstName.value }, + skip: !fields.firstName.value, // until the field is filled in, the query won't be called + }), +}); + +const ContainerWithFormAndQuery = withForm(withQuery(Container)); + + +/* + + using the query to prefill the form + +*/ +const withQuery = graphql(query) + +const withForm = reduxForm({ + form: 'contact', + fields: ['firstName'], +}, (state, ownProps) => ({ + initialValues: { + // ownProps.data is the result of the query + firstName: ownProps.data.loading ? '' : ownProps.data.allPeople.people[0].name, + }, +})) + +const ContainerWithQueryAndForm = withQuery(withFrom(Container)); +``` + +

Usage with MobX

```txt diff --git a/docs/source/apollo-client/redux.md b/docs/source/apollo-client/redux.md index a0348a69c40..0f0632a7555 100644 --- a/docs/source/apollo-client/redux.md +++ b/docs/source/apollo-client/redux.md @@ -73,10 +73,6 @@ store.getState(); // } ``` -

react-redux

- -The `react-apollo` integration package is a drop-in replacement for `react-redux`, so if you are using Redux and Apollo together you don't need to have nested data containers. [Read the docs for `react-apollo` to see how to do this.](react.html) -

Async Actions with thunk

In Redux, we handle asynchronity via the `thunk` middleware. This allows you to dispatch a function, instead of an Action Object. To integrate `thunk` into your workflow, follow the steps below: From 74a028da78b7809225b4e9df5271f164eeb5ea8d Mon Sep 17 00:00:00 2001 From: Tom Coleman Date: Mon, 22 Aug 2016 11:07:31 +1000 Subject: [PATCH 257/409] Updated SSR notes to be accurate --- docs/source/apollo-client/react.md | 32 +++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md index 6c01ca03329..48f23b12753 100644 --- a/docs/source/apollo-client/react.md +++ b/docs/source/apollo-client/react.md @@ -465,6 +465,29 @@ getDataFromTree(app).then((context) => { }); ``` +Your markup in this case can look something like: + +```js +const dehydratedState = + `window.__APOLLO_STATE__=${JSON.stringify(context.store.getState())};`; + +ReactDOM.renderToStaticMarkup( + + +
+ - - -); - -const staticMarkup = renderToStaticMarkup(); -// Now return the static markup to the client... -``` -After using the above as the initial server-side rendered HTML, on the client you would will then rehydrate the client using the initial state passed from the server -```js -// on client -const client = new ApolloClient({ - initialState: window.__APOLLO_CONTEXT__, -}); -``` - -Then, when a client calls ApolloClient#query or ApolloClient#watchQuery, the data should be returned instantly because it is already in the store! This also makes full page server side rendering without a page rebuild (if using react for instance) possible because the server rendered template won't differ from the client) - -## Change log - -Upgrading to a new version? [Check out the change log on GitHub](https://github.com/apollostack/apollo-client/blob/master/CHANGELOG.md). diff --git a/docs/source/apollo-client/mutations.md b/docs/source/apollo-client/mutations.md deleted file mode 100644 index 43b4c0764aa..00000000000 --- a/docs/source/apollo-client/mutations.md +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: Mutations -order: 103 -description: How to run mutations to modify data with Apollo Client. ---- - -In addition to fetching data using queries, the Apollo Client also handles GraphQL mutations. Mutation strings are identical to query strings in syntax, the only difference is that you use the keyword `mutation` instead of `query` to indicate that the operation is used to change the dataset behind the schema. Basically, a query is the GraphQL equivalent of an HTTP GET and a mutation is the equivalent of an HTTP POST. - -```js -mutation { - createUser(name: "Jane Doe", email: "jane@apollostack.com") { - id - name - } -} -``` - -GraphQL mutations consist of two parts: - -1. The mutation name with arguments (`createUser`), which represents the actual operation to be done on the server -2. The fields you want back from the result of the mutation to update the client (`id` and `name`) - -The result of the above mutation would be: - -``` -{ - "data": { - "createUser": { - "id": "123", - "name": "Jane Doe" - } - } -} -``` - -

ApolloClient#mutate(options)

- -Send a mutation to the server and get the result. The result is also incorporated into the store, updating any queries registered with `watchQuery` that are interested in the changed objects. Returns a promise that resolves to a GraphQLResult, or throws an [`ApolloError`](queries.html#ApolloError). - -- `mutation: string` The mutation to send to the server. -- `variables: Object` The variables to send along with the mutation. -- `fragments: FragmentDefinition[]` An array of fragment definitions, as returned by `createFragment`. [Learn more on the fragments page.](fragments.html) - - -Here's how you would call a mutation and pass in arguments via variables: - -```js -import ApolloClient from 'apollo-client'; - -const client = new ApolloClient(); - -client.mutate({ - mutation: gql` - mutation ($text: String!, $list_id: ID!) { - addNewTask(text: $text, list_id: $list_id) { - id - text - completed - createdAt - } - } - `, - variables: { - text: 'walk the dog', - list_id: '123', - }, -}).then(({ data }) => { - console.log('got data', data); -}).catch((error) => { - console.log('there was an error sending the query', error); -}); -``` - -Mutations can get a bit verbose because you often need to pass in variables for a lot of different arguments, and those need to be declared in several places. This is inherent to the design of GraphQL itself, but future versions of Apollo Client may contain helpers to reduce the necessary boilerplate. In an ideal world, GraphQL itself would make variable type declarations optional. - - -

Updating Query results

- -In Apollo Client, there is a special system that allows mutations to update the results of the active queries. Active queries are bound to your UI components via `watchQuery` or any of the view integrations. These UI components will automatically re-render as updated queries are updated. - - -

Updated Fields

- -In cases when your mutation returns a new value for an existing object with some fields updated, you might avoid writing any queries updating code at all. As long as your instance of Apollo Client has [`dataIdFromObject`](/apollo-client/index.html#ApolloClient) option defined, the occurrences of the object (matching by the generated id) in the active queries will be updated automatically without any extra code. - -For example, say you have a query with a flat list of `TodoList`s. Later, after editing the name of one of lists, the mutation `changeTodoListName(list_id: ID!, name: String!)` was fired. If `changeTodoListName` mutation returns the `TodoList` object with the same id and updated fields, then it will be incorporated into store and updated in active queries automatically. - - -

Updating query results with `updateQueries`

- -Depending on how complicated are your queries, the logic incorporating the mutation result could be sophisticated. - -For example, let's say you have a mutation `addNewTask(text: String!, list_id: ID!)` that adds a new task of type `Task` to a `TodoList` currently displayed on the screen. In this example, to update a query with the new task returned by the mutation, it is required to insert the new task into the correct place in the list of tasks. - -For cases like these, use the special option `updateQueries`. `updateQueries` is a mapping from query name to a reducer function to update that query. The query name goes between the `query` keyword and the declaration of variables (in the example below it is `todos`). - ---- - -The `updateQueries` functions are similar to [Redux](http://redux.js.org/docs/basics/Reducers.html) reducers. This means that they: - -- must return an updated query result that incorporates the result of the mutation -- must avoid mutating the arguments and should return new objects instead -- should have no side effects -- should take the following form: - - -``` -(previousQueryResult, { mutationResult, queryVariables }) => updatedQueryResult -``` - -Each reducer function accepts the old result of the query, the `mutationResult`, and optionally a `queryVariables` object that contains the variables that were passed into the original query. `queryVariables` is useful when you have multiple queries of the same name but with different variables and you only want to update a certain one (i.e. fetching multiple todo lists with different id's). - -

Example

- -Let's say we have the following query that is fetching a list of `todos`: - -```js -client.watchQuery({ - query: gql` - query todos($id: ID!) { - todo_list(id: $id) { - id - title - tasks { - id - text - completed - createdAt - } - } - } - `, - variables: { - id: '123', - }, -}); -``` - -We can then call the following mutation to add an item to the list and update the query result: - -```js -client.mutate({ - mutation: gql` - mutation ($text: String!, $list_id: ID!) { - addNewTask(text: $text, list_id: $list_id) { - id - text - completed - createdAt - } - } - `, - variables: { - text: 'walk the dog', - list_id: '123', - }, - updateQueries: { - todos: (previousQueryResult, { mutationResult, queryVariables }) => { - if (queryVariables.id !== '123') { - // this isn't the query we updated, so just return the previous result - return previousQueryResult - } - // otherwise, create a new object with the same shape as the - // previous result with the mutationResult incorporated - const originalList = previousQueryResult.todo_list; - const newTask = mutationResult.data.addNewTask - return { - todo_list: { - ...originalList, - tasks: [...originalList.tasks, newTask] - } - }; - }, - }, -}); -``` - -If there are multiple active queries of the same name, the reducer function will be run for each one of them. In the example above, you can see how we used the `queryVariables` to check the id passed into the original query and update the correct list. Alternatively, if the field you want to check isn't a part of the `queryVariables`, you can also check the previous result itself: - -```js -(previousQueryResult, { mutationResult }) => { - if (previousQueryResult.todo_list.id !== '123') { - return previousQueryResult - } - ... -} -``` - -

Optimistic Results

- -Sometimes your client code can easily predict the result of the mutation, if it succeeds, even before the server responds with the result. When a user clicks a button "add new task", you want to add the new task to the list immediately, without waiting on the latency of a round trip to the server, giving the users the feeling of a snappy UI. This is what we call [Optimistic UI](http://info.meteor.com/blog/optimistic-ui-with-meteor-latency-compensation). This is possible if the client can predict an *Optimistic Response* for the mutation. - -Apollo Client gives you a way to specify the `optimisticResponse` option, that will be used to update active queries immediately. Once the actual mutation response returns, the optimistic part will be thrown away and replaced with the real result. - -For the example above, it is easy to construct an optimistic response, since we know the text field of the new task, we know that it is created not completed, and can approximately predict the created date. The optimistic response doesn't have to be exactly correct because it will always will be replaced with the real result from the server. But it should be close enough to make users feel like there is no delay. - -```js -client.mutate({ - mutation: ..., - variables: ..., - updateQueries: ..., - optimisticResponse: { - id: generatedId, - text: text, - createdAt: +(new Date), - completed: false, - }, -}); -``` - - -

Designing mutation results

- -When people talk about GraphQL, they often focus on the data fetching side of things, because that's where GraphQL brings the most value. Mutations can be pretty nice if done well, but the principles of designing good mutations, and especially good mutation result types, are not yet well-understood in the open source community. So when you are working with mutations it might often feel like you need to make a lot of application-specific decisions. - -In GraphQL, mutations can return any type, and that type can be queried just like a regular GraphQL query. So the question is - what type should a particular mutation return? - -In GraphQL itself, there isn't any specification about how this is supposed to work. In most cases, the data available from a mutation result should be the server developer's best guess of the data a client would need to understand what happened on the server. For example, a mutation that creates a new comment on a blog post might return the comment itself. A mutation that reorders an array might need to return the new array. - -In many cases, it's beneficial to have the mutation result return the _parent_ of the new object, so that the client developer can decide what data they need to update. For example, if a todo list has a computed field for the number of tasks, inserting a new task might update that as well, meaning it might be good to have the mutation return a `TodoList` type rather than a `Task` type. - -Sometimes, you might need to define a new type just for the result of a specific mutation. For example, in the todo list case, it might make sense for the result of the mutation to have two fields, and include _both_ the inserted task and the associated todo list. That way, the client can more easily refetch related data. diff --git a/docs/source/apollo-client/pagination.md b/docs/source/apollo-client/pagination.md deleted file mode 100644 index 3e23e5d9066..00000000000 --- a/docs/source/apollo-client/pagination.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: Pagination -order: 105 -description: How to continuously fetch more data for a paginated query. ---- - -Sometimes you need to fetch a rather long list of items from the server but for the performance and user experience sake you want to fetch only 10 items at a time. Later, when the user scrolls through the list, you might want to fetch 10 more, but for the initial request it is paramount to load and display the first 10 items as fast as possible. - -Apollo Client has a built in functionality for this behavior, widely known as "infinite scroll", that allows you to load more items as you go. - -

Watch Query

- -Start by watching a query with the initial variables set. In our example, we will fetch a list of comments for an entry in the paginated fashion: - -```js -const query = client.watchQuery({ - query: gql` - query Comments($id: Int!, $start: Int, $limit: Int) { - entry(id: $id) { - title - author { - name - } - - # this is where the start and limit arguments are used - comments(start: $start, limit: $limit) { - author { - name - } - text - } - } - } - `, - // only fetch first 10 items - variables: { start: 0, limit: 10, id: '1' }, -}); - -query.subscribe({ - next(queryResult) { - // do something with the results of the query - console.log('result of the query is now:', queryResult); - } -}); -``` - -Now, since we subscribed to the query's observable, we will receive the initial result of the query. - -

Fetch more

- -Later, let's say the user scrolled past the end of the list and you want to fetch more comments. You can do it using the `fetchMore` method on the query observable and either pass new variables or an entirely new query. - -Here is an example of calling `fetchMore` with new variables. The results of the subsequent query would need to be incorporated back into Apollo Store, this can be done by supplying an `updateQuery` function that will merge the previous results and the new data: - -```js -query.fetchMore({ - // fetch 10 more items starting from new offset - // limit and id variables are the same - variables: { start: 10 }, - // tell Apollo Client how to merge the new results of the query - updateQuery: (previousResult, { fetchMoreResult, queryVariables }) => { - const prevEntry = previousResult.entry; - const newComments = fetchMoreResult.data.entry.comments; - return { - title: prevEntry.title, - author: prevEntry.author, - comments: [...prevEntry.comments, ...newComments], - }; - } -}); -``` - -Now, the cached value in the store will contain both old and new comments and the observable subscription will emit a new query result. - -

Fetch more with a different query

- -You might have noticed that in the previous example we fetched new comments with the same query. Sometimes, you might want to use an entirely different query with a different shape, or a similar query with a smaller payload size. You can do it in Apollo Client using the same `fetchMore` API: - -```js -query.fetchMore({ - query: gql` - query PromotedComments($id: Int!) { - promotedComments(id: $id) { - author - text - } - } - `, - variables: { id: '1' }, - updateQuery: (previousResult, { fetchMoreResult, queryVariables }) => { - const prevEntry = previousResult.entry; - const newComments = fetchMoreResult.data.promotedComments; - return { - title: prevEntry.title, - author: prevEntry.author, - // put promoted comments in front - comments: [...newComments, ...prevEntry.comments], - }; - } -}); -``` - -Again, the result of the watched query will be updated in the store, even when updated with a completely differently shaped query. - - -

Cursor-based pagination

- -A different common server-side implementation for the "infinite scroll" feature is a cursor-based approach. Every time the clients want to fetch more data, they can optionally pass an id of a cursor they got from the last fetch. If cursor is passed as an argument, it is simple to use with `fetchMore`: - -```js -query.fetchMore({ - query: gql` - query nextComments($cursor_id: String!) { - nextComments(cursor_id: $cursor_id) { - cursor - comments { - author - text - } - } - } - `, - variables: { cursor_id: cursor }, - updateQuery: (previousResult, { fetchMoreResult, queryVariables }) => { - const prevEntry = previousResult.entry; - const newComments = fetchMoreResult.data.comments.nextComments; - - // update cursor - cursor = fetchMoreResult.data.cursor; - - return { - title: prevEntry.title, - author: prevEntry.author, - // put promoted comments in front - comments: [...newComments, ...prevEntry.comments], - }; - } -}); -``` - -

Merge Function

- -The merge function used in the example is acting as a reducer, similar to the reducers in [Redux](http://redux.js.org/docs/basics/Reducers.html). - -You don't have to use Redux to understand reducers. All you need to know is that reducer never mutates the arguments and acts as a pure function: -- must return an updated query result that incorporates `fetchMoreResult` -- must avoid mutating the arguments, such that previous query result, and prefer cloning -- should have no side effects - -

Options passed to the merge function

- -Merge function `updateQuery` takes two arguments: previous result of the query from store and options. Here is a list of options: - -- `fetchMoreResult` - result of the `fetchMore` query -- `queryVariables` - variables used on the original query diff --git a/docs/source/apollo-client/queries.md b/docs/source/apollo-client/queries.md deleted file mode 100644 index bcfe8127094..00000000000 --- a/docs/source/apollo-client/queries.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Queries -order: 102 -description: How to run queries to fetch data with Apollo Client. ---- - -The primary function of the Apollo Client is running GraphQL queries to retrieve data from the server. There are two ways to get data: running a query once and getting a single result, and running a query then watching the result via a callback. - -

`query` vs. `watchQuery`

- -If you want to fetch some data to perform a one-time operation, then `query` is the right way to go. If you are using the query result to render some UI, it's advantageous to use `watchQuery`, since that will automatically update whenever any of the following things happen: - -1. A different query or mutation updates the data in the store -2. A mutation performs an optimistic update -3. Data is re-fetched because of a reactive update - -This means that using `watchQuery` will keep your UI consistent, so that every query being displayed on the screen shows the exact same data for the same objects. - -Currently `watchQuery` allows reactivity via the optional `pollInterval` argument. In the future, `watchQuery` will also have more options for reactivity, like connecting to a source of invalidations for reactive re-fetching, or accepting pushed data from the server for low-latency updates. Using it now will allow you to easily switch those options on when they become available. - -

Query result caching

- -The Apollo Client doesn't just directly send your GraphQL queries to the server. It does a lot of pre-and-post processing of the data. One of the main things it does is _query diffing_, which means comparing a query you're about to fetch with the data the client fetched previously, and sending a new query that fetches only the necessary data. - -For example, let's say you do two queries, one after the other: - -``` -// First query fetched -{ - todoList(id: 5) { - title - createdAt - tasks { - name - completed - } - } -} - -// Second query, after the user clicks a button -{ - todoList(id: 5) { - title - createdAt - tasks { - name - completed - } - } - user(id: 8) { - name - username - } -} -``` - -The Apollo Client is smart enough to realize that it already has the `todoList` data for the second query, and sends only the `user` part: - -``` -// Actual second query sent -{ - user(id: 8) { - name - username - } -} -``` - -You can take advantage of this feature to reduce the amount of data your app is loading, without putting in any extra work. For example, if someone navigates to a different page of your app, then comes back immediately, if you try to load the same query again the Apollo Client will just use the existing data. This is the default behavior. - -We are always going to be improving the efficiency of the query diffing algorithm. Right now, it just does basic operations, but in the future it will be able to fetch single missing objects, and diff deeply nested queries. Follow along on the GitHub repository to find out when these features are coming. - -

Using forceFetch

- -Of course, you don't always want to use the existing data in the store - sometimes you want to get the new data directly from the server even though you already have it on the client. In this case, you should pass the `forceFetch` option to `query` or `watchQuery`, as documented below. - -

ApolloClient#query(options)

- -Run a GraphQL query and return a promise that resolves to a [`GraphQLResult`](./network.html#GraphQLResult), or throws an [`ApolloError`](#ApolloError). - -- `query: string` A GraphQL query string to fetch. -- `variables: Object` The variables to pass along with the query. -- `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. -- `fragments: FragmentDefinition[]` An array of fragment definitions, as returned by `createFragment`. [Learn more on the fragments page.](fragments.html) - -Here's how you would run a single query and get the result: - -```js -import ApolloClient from 'apollo-client'; - -// Polyfill fetch into the namespace if required. -// import fetch from 'isomorphic-fetch'; - -const client = new ApolloClient(); - -client.query({ - query: gql` - query getCategory($categoryId: Int!) { - category(id: $categoryId) { - name - color - } - } - `, - variables: { - categoryId: 5, - }, - forceFetch: false, -}).then(({ data }) => { - console.log('got data', data); -}).catch((error) => { - console.log('there was an error sending the query', error); -}); -``` - -

ApolloClient#watchQuery(options)

- -Run a GraphQL query and return a QueryObservable that is updated as the query result in the store changes, or throws an [`ApolloError`](#ApolloError). - -- `query: string` A GraphQL query string to fetch. -- `variables: Object` The variables to pass along with the query. -- `forceFetch: boolean` (Optional, default is `false`) If true, send the query to the server directly without any pre-processing. If false, check if we have some of the data for the query on the client already, and send a minimized query to the server to refetch only the objects we don't have already. -- `returnPartialData: boolean` (Optional, default is `false`) If false, wait until the query has finished the initial load from the server to return any data. If true, return any data we might happen to already have in the store immediately. If you pass true for this option, your UI should be ready to deal with the possibility that it will get a partial result at first. -- `pollInterval: number` (Optional, default is no polling). Setting a polling interval (in ms) will refetch your query from the server (forceFetch) on the interval rate provided by the key. -- `fragments: FragmentDefinition[]` An array of fragment definitions, as returned by `createFragment`. [Learn more on the fragments page.](fragments.html) - - -

QueryObservable

- -This is the object you get when you call `watchQuery`. The most important method is `subscribe`, which lets you get query results. There are also some Apollo-Client-specific methods to refetch and poll query results: - -- `subscribe(observer: QueryObserver)` Pass an observer object which gets called when there is new data. Returns a `QuerySubscription` object which you can use to unsubscribe or refetch. -- `refetch(variables: Object)` Refetch this query from the server. Think of it like a refresh button. This can take an object of new variables -- `fetchMore(options)` update results of the query by fetching a new query and combining the results. See [pagination](./pagination.html) for more info. -- `stopPolling()` Stop an actively polling query. -- `startPolling(pollInterval: number)` Start polling a query -- `updateQuery(transformFn: function)` Updates results of the query in store, by transforming its previous result. The transform function takes the previous result and options containing information about the original query. The function must return a new value of the query result. - -

interface QueryObserver

- -The object you pass into `QueryObservable#subscribe`. It should include optional callbacks to get results or errors from the query: - -- `next(result: GraphQLResult)` Called when there is a new result for the query. -- `error(error: ApolloError)` Called when there is any error for the query. Read more [in the `ApolloError` section below](queries.html#ApolloError). - -

QuerySubscription

- -The object returned from `QueryObservable#subscribe`. Includes just one method: - -- `unsubscribe()` Notify the client to no longer care about this query. After this is called, none of the callbacks on the observer will be fired anymore. It's very important to call this when you are done with the query, because that is what lets the client know that it can clean up the data associated with this subscription. The view integrations will do this for you. - -#### Code sample - -All of the concepts above seem a bit complicated, but it's not hard to use in practice. Here's how you could run a query and then watch the result: - -```js -const queryObservable = client.watchQuery({ - query: gql` - query getCategory($categoryId: Int!) { - category(id: $categoryId) { - name - color - } - } - `, - variables: { - categoryId: 5, - }, - forceFetch: false, - returnPartialData: true, - pollInterval: 50, -}); - -const subscription = queryObservable.subscribe({ - next: ({ data }) => { - console.log('got data', data); - }, - error: (error) => { - console.log('there was an error sending the query', error); - } -}); - -// Refetch the query if we want an updated result -queryObservable.refetch(); - -// Stop polling this query -queryObservable.stopPolling(); - -// Start polling this query -queryObservable.startPolling(100); - -// Call when we're done watching this query -subscription.unsubscribe(); -``` - -

ApolloError

- -Apollo uses the custom error type `ApolloError` as the standard way to communicate GraphQL-related errors to your application. - -`ApolloError` extends the standard Javascript `Error` type, meaning that you can treat it as a standard `Error` and expect it to work correctly, but it also includes some extra fields that will help you write code that handles different types of errors. As a rule of thumb, you should not use the error message string to determine the type of error that has occurred. Instead, you should use the information that `ApolloError` provides: - -- `graphQLErrors: GraphQLError[]`: Array containing the errors returned by the server on a specific GraphQL query. When Apollo Client sends a query to the GraphQL server, these errors are contained within the errors key of the response returned by the server. -- `networkError: Error`: Error that has occurred in fetching the query from the server (e.g. Apollo Client is unable to reach the server). -- `message: string`: The error message that describes what went wrong. If there were multiple errors, this error message includes the error messages (separated by newlines) for each element in `graphQLErrors` and the `networkError`, if they are defined. diff --git a/docs/source/apollo-client/react.md b/docs/source/apollo-client/react.md deleted file mode 100644 index 48f23b12753..00000000000 --- a/docs/source/apollo-client/react.md +++ /dev/null @@ -1,740 +0,0 @@ ---- -title: React and React Native -order: 150 -description: How to use the Apollo Client to fetch GraphQL data in your React application. ---- - -> NOTE: this is the documentation for version 0.4 of the `react-apollo` package. The older version 0.3 documentation is available here: http://docs.apollostack.com/vreact-apollo-0.3/apollo-client/react.html - -The `react-apollo` package gives a higher-order-component style interface to Apollo Client to allow you to easily integrate GraphQL data with your React components. - -```txt -npm install react-apollo --save -``` - -> Note: You don't have to do anything special to get Apollo Client to work in React Native, just install and import it as usual. - - -[Follow apollostack/react-apollo on GitHub.](https://github.com/apollostack/react-apollo) - -

ApolloProvider

- -To get started, you should use an `ApolloProvider` to inject an [ApolloClient instance](../apollo-client/index.html#Initializing) into your React view heirarchy, *above* the point where you need GraphQL data. - -```js -import ApolloClient from 'apollo-client'; -import { ApolloProvider } from 'react-apollo'; - -// you can provide whichever options you require to the apollo client here. -const client = new ApolloClient(); - -ReactDOM.render( - - - , - rootEl -) -``` - -To fetch data using the client, or send mutations, use the [`graphql`](#graphql) or [`withApollo`](#withApollo) higher order components. - -

The `graphql` container

- -The `graphql` container is the recommended approach for fetching data or making mutations. It is a [Higher Order Component](https://facebook.github.io/react/blog/2016/07/13/mixins-considered-harmful.html#subscriptions-and-side-effects) for providing Apollo data to a component. - -For queries, this means `graphql` handles the fetching and updating of information from the query using Apollo's [watchQuery method](../apollo-client/queries.html#watchQuery). For mutations, `graphql` binds the intended mutation to be called using Apollo. - -The basic usage of `graphql` is as follows: - -```js -import React, { Component } from 'react'; -import { graphql } from 'react-apollo'; - -// MyComponent is a "presentational" or apollo-unaware component, -// It could be a simple React class -class MyComponent extends Component { - render() { - return
...
; - } -} -// Or a stateless functional component: -const MyComponent = (props) =>
...
; - -// MyComponentWithData provides the query or mutation defined by -// QUERY_OR_MUTATION to MyComponent. We'll see how below. -const withData = graphql(QUERY_OR_MUTATION, options); -const MyComponentWithData = withData(MyComponent); -``` - -If you are using [ES2016 decorators](https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841#.nn723s5u2), you may prefer the decorator syntax, although we'll use the older syntax in this guide: - -```js -import React, { Component } from 'react'; -import { graphql } from 'react-apollo'; - -@graphql(QUERY_OR_MUTATION, settings) -class MyComponent extends Component { - render() { - return
...
; - } -} -``` - -

For Queries

- -The first, and only required, argument of `graphql` is a [graphql](https://www.npmjs.com/package/graphql) document. Use the `gql` template literal you can get from [graphql-tag](../apollo-client/index.html#gql) which parses the query string. - -```js -import React, { Component } from 'react'; -import { graphql } from 'react-apollo'; -import gql from 'graphql-tag'; - -class MyComponent extends Component { - render() { - // By default the result of the query will be available at `props.data` - const { loading, user } = this.props.data; - } -} - -MyComponent.propTypes = { - // We'll see the precise shape of this object below - data: React.PropTypes.object.isRequired, -}; - -const GET_USER = gql` - query getUser { - user { name } - } -`; - -const withUser = graphql(GET_USER); -const MyComponentWithData = withUser(MyComponent); -``` - -

Default Result Props

- -Using `graphql` with queries makes it easy to bind data to components. As seen above, `graphql` will add the result of the query as `data` to the props passed to the wrapped component (it will also pass all of the props of the parent container). The shape of the `data` prop will be the following: - -- `loading: Boolean` - Loading will be true if a query is in flight (including when calling refetch) - -- [`error: ApolloError`](http://docs.apollostack.com/apollo-client/queries.html#ApolloError) - The error key will be `null` if no errors were created during the query - -- `...fields` - - One key for each field selected on the root query, so: - - ```graphql - query getUserAndLikes(id: $ID!) { - user(userId: $id) { name } - likes(userId: $id) { count } - } - ``` - - could return a result object that includes `{ user: { name: "James" }, likes: { count: 10 } }`. - -- [`...QuerySubscription`](../apollo-client/queries.html#QuerySubscription) - - The subscription created on this query will be merged into the passed props so you can dynamically refetch, change polling settings, or even unsubscribe to this query. The methods include `stopPolling`, `startPolling`, `refetch`, and `fetchMore`. - - -

Providing `options`

- -If you want to configure the query (or the mutation, as we'll see below), you can provide an `options` function on the second argument to `graphql`: - -```js -const withUser = graphql(GET_USER, { - // Note ownProps here are the props that are passed into `MyComponentWithData` - // when it is used - options(ownProps) { - return { - // options for ApolloClient.watchQuery - } - } -}); - -const MyComponentWithData = withUser(MyComponent); -``` - -By default, `graphql` will attempt to pick up any missing variables from the query from `ownProps`. For example: - -```js -import { Component } from 'react'; -import { graphql } from 'react-apollo'; -import gql from 'graphql-tag'; - -class MyComponent extends Component { ... } - -const GET_USER_WITH_ID = gql` - query getUser(id: $ID!) { - user { name } - } -`; -// Even though we haven't defined where `id` comes from, as long as we call -// ``, the default options() will work. -const withUserFromId = graphql(GET_USER_WITH_ID); -const MyComponentWithData = withUserFromId(MyComponent); -``` - -In general, you will probably want to be explicit about where the variables come from: - -```js -// If we'd prefer to call `` -const withUserFromId = graphql(GET_USER_WITH_ID, { - options: (ownProps) => ({ variables: { id: ownProps.userId } }) -}); -const MyComponentWithData = withUserFromId(MyComponent); -``` - -Also, you may want to configure the [watchQuery](../apollo-client/queries.html#watchQuery) behaviour using `options`: - -```js -const withPollingQuery = graphql(GET_USER_WITH_ID, { - options: () => ({ pollInterval: 1000 }) -}); -const MyComponentWithData = withPollingQuery(MyComponent); -``` - -Sometimes you may want to skip a query based on the available information, to do this you can pass `skip: true` as part of the options. This is useful if you want to ignore a query if a user isn't authenticated: - -```js -const withUser = graphql(GET_USER_DATA, { - options: (ownProps) => ({ skip: !ownProps.authenticated }) -}); -const MyComponentWithData = withUser(MyComponent); -``` - -When the props change (a user logs in for instance), the query options will be rerun and `react-apollo` will start the watchQuery on the operation. - -

Controlling child props

- -As [we've seen](#default-result-props), by default, `graphql` will provide a `data` prop to the wrapped component with various information about the state of the query. We'll also see that [mutations](#graphql-mutations) provide a callback on the `mutate` prop. - -

Using `name`

- -If you want to change the name of this default property, you can use `name` field. In particular this is useful for nested `graphql` containers: - -```js -import React, { Component } from 'react'; -import { graphql } from 'react-apollo'; - -class MyComponent extends Component { ... } -MyComponent.propTypes = { - upvote: React.PropTypes.func.isRequired, - downvote: React.PropTypes.func.isRequired, -}; - -// This provides an `upvote` callback prop to `MyComponent` -const withUpVote = graphql(UPVOTE, { name: 'upvote' }); -const MyComponentWithUpvote = withUpVote(MyComponent); - -// This provides an `downvote` callback prop to `MyComponentWithUpvote`, -// and subsequently `MyComponent` -const withDownVote = graphql(DOWNVOTE, { name: 'downvote' }); -const MyComponentWithUpvoteAndDownvote = withDownVote(MyComponentWithUpvote); -``` - - -

Using `props`

- -If you want a greater level of control, use the `props` to map the query results (or mutation, as we'll see [below](#graphql-mutations)) to the props to be passed to the child component: - -```js -import React, { Component } from 'react'; -import { graphql } from 'react-apollo'; -import gql from 'graphql-tag'; - -class MyComponent extends Component { ... } - -MyComponent.propTypes = { - loading: React.PropTypes.boolean, - hasErrors: React.PropTypes.boolean, - currentUser: React.PropTypes.object, - refetchUser: React.PropTypes.func, -}; - -const GET_USER_WITH_ID = gql` - query getUser(id: $ID!) { - user { name } - } -`; - -const withUserFromId = graphql(GET_USER_WITH_ID, { - // `ownProps` are the props passed into `MyComponentWithData` - // `data` is the result data (see above) - props: ({ ownProps, data }) => { - if (data.loading) return { userLoading: true }; - if (data.error) return { hasErrors: true }; - return { - currentUser: data.user, - refetchUser: data.refetch, - }; - } -}); -const MyComponentWithData = withUserFromId(MyComponent); -``` - -This style of usage leads to the greatest decoupling between your presentational component (`MyComponent`) and Apollo. - -

For Mutations

- -Using `graphql` with mutations makes it easy to bind actions to components. Unlike queries, mutations provide only a simple prop (the `mutate` function) to the wrapped component. When calling a mutation, you can pass an options that can be passed to the Apollo Client [`mutate` method](../apollo-client/mutations.html#mutate). - -Mutations will be passed to the child as `props.mutate`: - -```js -import React, { Component } from 'react'; -import { graphql } from 'react-apollo'; -import gql from 'graphql-tag'; - -class MyComponent extends Component { ... } - -MyComponent.propTypes = { - mutate: React.PropTypes.func.isRequired, -}; - -const ADD_TASK = gql` - mutation addTask($text: String!, $list_id: ID!) { - addNewTask(text: $text, list_id: $list_id) { - id - text - completed - createdAt - } - } -`; - -const withAddTask = graphql(ADD_TASK); -const MyComponentWithMutation = withAddTask(MyComponent); -``` - -

Calling mutations

- -Most mutations will require arguments in the form of query variables, and you may wish to provide other options to [ApolloClient#mutate](../apollo-client/mutations.html#mutate), such as `optimisticResponse` or `updateQueries`. - -You can directly pass options to `mutate` when you call it in the wrapped component: - -```js -import React, { Component } from 'react'; - -class MyComponent extends Component { - render() { - const onClick = () => { - // pass in extra / changed variables - this.props.mutate({ variables: { text: "task", list_id: 1 } }) - .then(({ data }) => { - console.log('got data', data); - }).catch((error) => { - console.log('there was an error sending the query', error); - }); - } - - return
Click me
; - } -} - -MyComponent.propTypes = { - mutate: React.PropTypes.func.isRequired, -}; -``` - -However, typically you'd want to keep the concern of understanding the query out of your presentational component. The best way to do this is to use the [`props`](#graphql-props) argument to bind your mutate function: - -```js -import React, { Component } from 'react'; -import { graphql } from 'react-apollo'; - -class MyComponent extends Component { - render() { - const onClick = () => { - this.props.addTask("text"); - } - - return
Click me
; - } -} - -MyComponent.propTypes = { - addTask: React.PropTypes.func.isRequired, -}; - -const ADD_TASK = ...; - -const withAddTask = graphql(ADD_TASK, { - props: ({ ownProps, mutate }) => ({ - addTask(text) { - return mutate({ - variables: { text, list_id: 1 }, - optimisticResponse: { - id: '123', - text, - completed: - true, - createdAt: new Date(), - }, - - // Depending on what you do it may make sense to deal with - // the promise result in the container or the presentational component - }).then(({ data }) => { - console.log('got data', data); - }).catch((error) => { - console.log('there was an error sending the query', error); - }); - }, - }) -}); -const MyComponentWithMutation = withAddTask(MyComponent); -``` - -> Note that in general you shouldn't attempt to use the results from the mutation callback directly, but instead write a [`updateQueries`](../apollo-client/mutations.html#updating-query-results) callback to update the result of relevant queries with your mutation results. - - -

withRef

- -If you need to get access to the instance of the wrapped component, you can use `withRef` in the options. -This will allow a `getWrappedInstance` method on the returned component which will return the wrapped instance. - -```js -import React, { Component } from 'react'; -import { graphql } from 'react-apollo'; - -class MyComponent extends Component { ... } - -const withUpvoteAndRef = graphql(UPVOTE, { withRef: 'true' }); -const MyComponentWithUpvote = withUpvoteAndRef(MyComponent); - -// MyComponentWithUpvote.getWrappedInstance() returns MyComponent instance -``` - -

The `withApollo` container

- -`withApollo` is a simple higher order component which provides direct access to your `ApolloClient` instance as a prop to your wrapped component. This is useful if you want to do custom logic with apollo, without using the `graphql` container. - -```js -import React, { Component } from 'react'; -import { withApollo } from 'react-apollo'; -import { ApolloClient } from 'apollo-client'; - -const MyComponent = (props) => { - // this.props.client is the apollo client - return
-} -MyComponent.propTypes = { - client: React.PropTypes.instanceOf(ApolloClient).isRequired; -} -const MyComponentWithApollo = withApollo(MyComponent); - -// or, using ES2016 decorators: - -@withApollo -class MyComponent extends Component { - render() { - return
- } -} -``` - -

Server-side rendering and hydration

- -The `react-apollo` library supports integrated server side rendering for both store rehydration purposes, or fully rendered markup. No changes are required to client queries to support this, however, queries can be ignored during server rendering by passing `ssr: false` in the query options. For example: - -```js -const withClientOnlyUser = graphql(GET_USER_WITH_ID, { - options: () => ({ ssr: false }) // won't be called during SSR -}); - -const MyComponentWithData = withClientOnlyUser(MyComponent); -``` - - -

Using `getDataFromTree`

- -The `getDataFromTree` function takes your React tree and returns the context of you React tree. This can be used to get the initialState via `context.store.getState()` - -```js -// server application code (custom usage) -import { getDataFromTree } from "react-apollo/server" - -// during request -getDataFromTree(app).then((context) => { - // markup with data from requests - const markup = ReactDOM.renderToString(app); - - // now send the markup to the client alongside context.store.getState() -}); -``` - -Your markup in this case can look something like: - -```js -const dehydratedState = - `window.__APOLLO_STATE__=${JSON.stringify(context.store.getState())};`; - -ReactDOM.renderToStaticMarkup( - - -
-