From 33945de854848afeeb476604cad236464f3d11d8 Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Tue, 26 May 2026 18:46:08 +0530 Subject: [PATCH] fix(blog): remove windows-invalid asset filenames --- .../index.mdx | 2 +- .../index.mdx | 6 +++--- .../index.mdx | 16 ++++++++-------- .../blog/graphql-eu-18-eiw8bishe2di/index.mdx | 10 +++++----- .../index.mdx | 2 +- .../index.mdx | 8 ++++---- .../index.mdx | 2 +- .../index.mdx | 10 +++++----- .../index.mdx | 2 +- .../index.mdx | 8 ++++---- .../index.mdx | 8 ++++---- .../index.mdx | 4 ++-- .../index.mdx | 2 +- .../index.mdx | 2 +- .../index.mdx | 10 +++++----- .../index.mdx | 16 ++++++++-------- .../index.mdx | 2 +- ...fc6eXHJvRSJhZ.png => 0-sPafc6eXHJvRSJhZ.png} | Bin ...m6DfO5g.png => 1-LnVsDQuQtSl-Wt-m6DfO5g.png} | Bin ...504VP2A.png => 1-ZbsVGATAeIp5iU2504VP2A.png} | Bin ...pNCpBEw.png => 1-m6QGz5tXtLt7uVapNCpBEw.png} | Bin ...lc0WjBQD120DC.png => 0-A92lc0WjBQD120DC.png} | Bin ...RnImerQRjALS5.png => 0-KQLRnImerQRjALS5.png} | Bin ...KIjXtM12d3kAe.png => 0-QelKIjXtM12d3kAe.png} | Bin ...XfmCfcMYpbO__.png => 0-h_JXfmCfcMYpbO__.png} | Bin ...eJCV7B-ri4upn.png => 0-iPceJCV7B-ri4upn.png} | Bin ...TpLYdMBLe7BvS.png => 0-lWBTpLYdMBLe7BvS.png} | Bin ...SrJU2L90IXDSi.jpg => 0-p_mSrJU2L90IXDSi.jpg} | Bin ...1tsH07bEQHbrB.png => 0-t5Y1tsH07bEQHbrB.png} | Bin ...lkNU6ZA.png => 1--iELVZWzvAgEaKZlkNU6ZA.png} | Bin ...OEGbCJA.png => 1-AN2VR8MNLpLeNzUOEGbCJA.png} | Bin ...Q@2x.png => 1-_QMKg1HIi96OtzMMOtoajQ@2x.png} | Bin ...P5lvQ.jpeg => 1-f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg} | Bin ...ZK8OX8w.png => 1-kKq-QXjiDhsDi82ZK8OX8w.png} | Bin ...cLsBtYA.png => 1-2UStyS7v3NIZKl2cLsBtYA.png} | Bin ...SNeT5Ew.png => 1-0ZgAAtT0Zm-Kc63SNeT5Ew.png} | Bin ...pNUutRA.png => 1-6ERw4Znf6UYou_epNUutRA.png} | Bin ...cgSqenQ.png => 1-dMyX0jnoKvhYAa0cgSqenQ.png} | Bin ...uzFVJDQ.png => 1-yIYI_iNabiNS_7uuzFVJDQ.png} | Bin ...FbMnWcw.png => 1-_fQh0zWBlDG1OJ-FbMnWcw.png} | Bin ...YyqkWOA.png => 1-KQ620d8vVrnl4vCYyqkWOA.png} | Bin ...0lKoXjw.png => 1-SwVWiWOCRnyCCP80lKoXjw.png} | Bin ...Ifc_XWw.png => 1-bz9k7dsElF5x_eqIfc_XWw.png} | Bin ...8z-GLQA.png => 1-nmcFbnUg7ooxjlZ8z-GLQA.png} | Bin ...FhR8QTA.png => 1-o57PeaoF5PVrON-FhR8QTA.png} | Bin ...p4O86JEoMbtpi.png => 0-MZcp4O86JEoMbtpi.png} | Bin ...aJb0gOQ.png => 1-0mbKo-p6qfrBKgAaJb0gOQ.png} | Bin ...oj7GQ8A.png => 1-UF5m7oNBcs1LKPboj7GQ8A.png} | Bin ...KwMyd3Q.png => 1-m5LM8FgXa0VEMz-KwMyd3Q.png} | Bin ...Nb3jfBw.png => 1-sGvSvA1yKloKDpXNb3jfBw.png} | Bin ...XwUanLrNSYjJk.png => 0--h6XwUanLrNSYjJk.png} | Bin ...u8GPtx3kpYcX9.png => 0-5vAu8GPtx3kpYcX9.png} | Bin ...u9eJJgj8vIqck.png => 0-eqlu9eJJgj8vIqck.png} | Bin ...z4N7_OSza7_2h.png => 0-mv6z4N7_OSza7_2h.png} | Bin ...E4V22_pl88Si4.gif => 0-c56E4V22_pl88Si4.gif} | Bin ...sNGj9yqANZhrw.png => 0-zy8sNGj9yqANZhrw.png} | Bin ...g@2x.png => 1-MmTqUD1_jQtNRxsMhyQyDg@2x.png} | Bin ...ay-_nEQ.png => 1-OPs5D2XrAcFI1hDay-_nEQ.png} | Bin ...VSR0UjQ.png => 1-1vMUL8w54yIAxOPVSR0UjQ.png} | Bin ...B3HmLeQ.png => 1-9fDpnhWdRrgN-vxB3HmLeQ.png} | Bin ...bnKbDZA.png => 1-GoxKn35GhQpmHZ6bnKbDZA.png} | Bin ...__dDE-w.png => 1-TisP6j41cu4itqI__dDE-w.png} | Bin ...ioGjl_A.png => 1-c6bexq2J0bTeT5UioGjl_A.png} | Bin ...7CN_FIQ.png => 1-3fi7Zud_T3VeocM7CN_FIQ.png} | Bin ...f5MA7tQ.png => 1-_EjTITNbwXGCVc7f5MA7tQ.png} | Bin ...dNM0Kug.png => 1-dgGQ6f1SZcJH7nddNM0Kug.png} | Bin ...igPtvGA.png => 1-iNK392MZ7rLIemoigPtvGA.png} | Bin ...Exvz61A.png => 1-idRITgkP04XGflQExvz61A.png} | Bin ...0X9LT3Q.png => 1-ifNy0EWA5EdrqkU0X9LT3Q.png} | Bin ...xoSiboQ.png => 1-rzI7PLKuJuRjjBIxoSiboQ.png} | Bin ...GUg-1.png => 1-wBWEMQXeDUu6JZBN44ZGUg-1.png} | Bin ...N44ZGUg.png => 1-wBWEMQXeDUu6JZBN44ZGUg.png} | Bin ...tztGpco-x9gTF.png => 0-A9dtztGpco-x9gTF.png} | Bin 73 files changed, 55 insertions(+), 55 deletions(-) rename apps/blog/public/connections-edges-nodes-in-relay-758d358aa4c7/imgs/{0*sPafc6eXHJvRSJhZ.png => 0-sPafc6eXHJvRSJhZ.png} (100%) rename apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/{1*LnVsDQuQtSl-Wt-m6DfO5g.png => 1-LnVsDQuQtSl-Wt-m6DfO5g.png} (100%) rename apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/{1*ZbsVGATAeIp5iU2504VP2A.png => 1-ZbsVGATAeIp5iU2504VP2A.png} (100%) rename apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/{1*m6QGz5tXtLt7uVapNCpBEw.png => 1-m6QGz5tXtLt7uVapNCpBEw.png} (100%) rename apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/{0*A92lc0WjBQD120DC.png => 0-A92lc0WjBQD120DC.png} (100%) rename apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/{0*KQLRnImerQRjALS5.png => 0-KQLRnImerQRjALS5.png} (100%) rename apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/{0*QelKIjXtM12d3kAe.png => 0-QelKIjXtM12d3kAe.png} (100%) rename apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/{0*h_JXfmCfcMYpbO__.png => 0-h_JXfmCfcMYpbO__.png} (100%) rename apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/{0*iPceJCV7B-ri4upn.png => 0-iPceJCV7B-ri4upn.png} (100%) rename apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/{0*lWBTpLYdMBLe7BvS.png => 0-lWBTpLYdMBLe7BvS.png} (100%) rename apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/{0*p_mSrJU2L90IXDSi.jpg => 0-p_mSrJU2L90IXDSi.jpg} (100%) rename apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/{0*t5Y1tsH07bEQHbrB.png => 0-t5Y1tsH07bEQHbrB.png} (100%) rename apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/{1*-iELVZWzvAgEaKZlkNU6ZA.png => 1--iELVZWzvAgEaKZlkNU6ZA.png} (100%) rename apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/{1*AN2VR8MNLpLeNzUOEGbCJA.png => 1-AN2VR8MNLpLeNzUOEGbCJA.png} (100%) rename apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/{1*_QMKg1HIi96OtzMMOtoajQ@2x.png => 1-_QMKg1HIi96OtzMMOtoajQ@2x.png} (100%) rename apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/{1*f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg => 1-f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg} (100%) rename apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/{1*kKq-QXjiDhsDi82ZK8OX8w.png => 1-kKq-QXjiDhsDi82ZK8OX8w.png} (100%) rename apps/blog/public/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/{1*2UStyS7v3NIZKl2cLsBtYA.png => 1-2UStyS7v3NIZKl2cLsBtYA.png} (100%) rename apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/{1*0ZgAAtT0Zm-Kc63SNeT5Ew.png => 1-0ZgAAtT0Zm-Kc63SNeT5Ew.png} (100%) rename apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/{1*6ERw4Znf6UYou_epNUutRA.png => 1-6ERw4Znf6UYou_epNUutRA.png} (100%) rename apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/{1*dMyX0jnoKvhYAa0cgSqenQ.png => 1-dMyX0jnoKvhYAa0cgSqenQ.png} (100%) rename apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/{1*yIYI_iNabiNS_7uuzFVJDQ.png => 1-yIYI_iNabiNS_7uuzFVJDQ.png} (100%) rename apps/blog/public/graphql-server-basics-the-schema-ac5e2950214e/imgs/{1*_fQh0zWBlDG1OJ-FbMnWcw.png => 1-_fQh0zWBlDG1OJ-FbMnWcw.png} (100%) rename apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/{1*KQ620d8vVrnl4vCYyqkWOA.png => 1-KQ620d8vVrnl4vCYyqkWOA.png} (100%) rename apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/{1*SwVWiWOCRnyCCP80lKoXjw.png => 1-SwVWiWOCRnyCCP80lKoXjw.png} (100%) rename apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/{1*bz9k7dsElF5x_eqIfc_XWw.png => 1-bz9k7dsElF5x_eqIfc_XWw.png} (100%) rename apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/{1*nmcFbnUg7ooxjlZ8z-GLQA.png => 1-nmcFbnUg7ooxjlZ8z-GLQA.png} (100%) rename apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/{1*o57PeaoF5PVrON-FhR8QTA.png => 1-o57PeaoF5PVrON-FhR8QTA.png} (100%) rename apps/blog/public/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/{0*MZcp4O86JEoMbtpi.png => 0-MZcp4O86JEoMbtpi.png} (100%) rename apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/{1*0mbKo-p6qfrBKgAaJb0gOQ.png => 1-0mbKo-p6qfrBKgAaJb0gOQ.png} (100%) rename apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/{1*UF5m7oNBcs1LKPboj7GQ8A.png => 1-UF5m7oNBcs1LKPboj7GQ8A.png} (100%) rename apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/{1*m5LM8FgXa0VEMz-KwMyd3Q.png => 1-m5LM8FgXa0VEMz-KwMyd3Q.png} (100%) rename apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/{1*sGvSvA1yKloKDpXNb3jfBw.png => 1-sGvSvA1yKloKDpXNb3jfBw.png} (100%) rename apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/{0*-h6XwUanLrNSYjJk.png => 0--h6XwUanLrNSYjJk.png} (100%) rename apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/{0*5vAu8GPtx3kpYcX9.png => 0-5vAu8GPtx3kpYcX9.png} (100%) rename apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/{0*eqlu9eJJgj8vIqck.png => 0-eqlu9eJJgj8vIqck.png} (100%) rename apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/{0*mv6z4N7_OSza7_2h.png => 0-mv6z4N7_OSza7_2h.png} (100%) rename apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/{0*c56E4V22_pl88Si4.gif => 0-c56E4V22_pl88Si4.gif} (100%) rename apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/{0*zy8sNGj9yqANZhrw.png => 0-zy8sNGj9yqANZhrw.png} (100%) rename apps/blog/public/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/{1*MmTqUD1_jQtNRxsMhyQyDg@2x.png => 1-MmTqUD1_jQtNRxsMhyQyDg@2x.png} (100%) rename apps/blog/public/top-5-reasons-to-use-graphql-b60cfa683511/imgs/{1*OPs5D2XrAcFI1hDay-_nEQ.png => 1-OPs5D2XrAcFI1hDay-_nEQ.png} (100%) rename apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/{1*1vMUL8w54yIAxOPVSR0UjQ.png => 1-1vMUL8w54yIAxOPVSR0UjQ.png} (100%) rename apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/{1*9fDpnhWdRrgN-vxB3HmLeQ.png => 1-9fDpnhWdRrgN-vxB3HmLeQ.png} (100%) rename apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/{1*GoxKn35GhQpmHZ6bnKbDZA.png => 1-GoxKn35GhQpmHZ6bnKbDZA.png} (100%) rename apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/{1*TisP6j41cu4itqI__dDE-w.png => 1-TisP6j41cu4itqI__dDE-w.png} (100%) rename apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/{1*c6bexq2J0bTeT5UioGjl_A.png => 1-c6bexq2J0bTeT5UioGjl_A.png} (100%) rename apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/{1*3fi7Zud_T3VeocM7CN_FIQ.png => 1-3fi7Zud_T3VeocM7CN_FIQ.png} (100%) rename apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/{1*_EjTITNbwXGCVc7f5MA7tQ.png => 1-_EjTITNbwXGCVc7f5MA7tQ.png} (100%) rename apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/{1*dgGQ6f1SZcJH7nddNM0Kug.png => 1-dgGQ6f1SZcJH7nddNM0Kug.png} (100%) rename apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/{1*iNK392MZ7rLIemoigPtvGA.png => 1-iNK392MZ7rLIemoigPtvGA.png} (100%) rename apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/{1*idRITgkP04XGflQExvz61A.png => 1-idRITgkP04XGflQExvz61A.png} (100%) rename apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/{1*ifNy0EWA5EdrqkU0X9LT3Q.png => 1-ifNy0EWA5EdrqkU0X9LT3Q.png} (100%) rename apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/{1*rzI7PLKuJuRjjBIxoSiboQ.png => 1-rzI7PLKuJuRjjBIxoSiboQ.png} (100%) rename apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/{1*wBWEMQXeDUu6JZBN44ZGUg-1.png => 1-wBWEMQXeDUu6JZBN44ZGUg-1.png} (100%) rename apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/{1*wBWEMQXeDUu6JZBN44ZGUg.png => 1-wBWEMQXeDUu6JZBN44ZGUg.png} (100%) rename apps/blog/public/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/imgs/{0*A9dtztGpco-x9gTF.png => 0-A9dtztGpco-x9gTF.png} (100%) diff --git a/apps/blog/content/blog/connections-edges-nodes-in-relay-758d358aa4c7/index.mdx b/apps/blog/content/blog/connections-edges-nodes-in-relay-758d358aa4c7/index.mdx index 9aba9c2ebe..1c6c76fd5e 100644 --- a/apps/blog/content/blog/connections-edges-nodes-in-relay-758d358aa4c7/index.mdx +++ b/apps/blog/content/blog/connections-edges-nodes-in-relay-758d358aa4c7/index.mdx @@ -51,7 +51,7 @@ Okay, let’s see what’s going on here. The `actors` connection now has a more Don’t worry. In order to use Relay, you don’t have to understand the reasons why the structure is designed this way but rest assured that [it makes a lot of sense](https://relay.dev/graphql/connections.htm). -![](/connections-edges-nodes-in-relay-758d358aa4c7/imgs/0*sPafc6eXHJvRSJhZ.png) +![](/connections-edges-nodes-in-relay-758d358aa4c7/imgs/0-sPafc6eXHJvRSJhZ.png) Lastly, we also notice the first: 10 parameter on the actors field. This gives us a way to [paginate](https://en.wikipedia.org/wiki/Pagination) over the entire list of related actors. In this case we’re taking the first 10 actors (nodes). In the same way we could additionally specify the after parameter which allows us to skip a certain amount of nodes. diff --git a/apps/blog/content/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/index.mdx b/apps/blog/content/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/index.mdx index a990c7da52..2184020700 100644 --- a/apps/blog/content/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/index.mdx +++ b/apps/blog/content/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/index.mdx @@ -127,11 +127,11 @@ export default graphql( In your local development setup, where the React app is loaded from [`http://localhost:3000`](http://localhost:3000) and the GraphQL server is serving at [`http://localhost:4000`](http://localhost:4000)/graphql, you’ll now get an access control error if you’re trying to run the app: -![](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*ZbsVGATAeIp5iU2504VP2A.png) +![](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1-ZbsVGATAeIp5iU2504VP2A.png) What exactly is the issue when CORS is not enabled? Well, CORS is in fact a _specification_ for a communication flow between client (a browser) and server. In some situations, this flow requires the server to process HTTP [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS) requests as can be seen from this flowchart: -![The CORS flow might required additional HTTP requests with the [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS) method ([source](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#/media/File:Flowchart_showing_Simple_and_Preflight_XHR.svg))](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*m6QGz5tXtLt7uVapNCpBEw.png)_The CORS flow might required additional HTTP requests with the [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS.png) method ([source](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#/media/File:Flowchart_showing_Simple_and_Preflight_XHR.svg))_ +![The CORS flow might required additional HTTP requests with the [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS) method ([source](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#/media/File:Flowchart_showing_Simple_and_Preflight_XHR.svg))](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1-m6QGz5tXtLt7uVapNCpBEw.png)_The CORS flow might required additional HTTP requests with the [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS.png) method ([source](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#/media/File:Flowchart_showing_Simple_and_Preflight_XHR.svg))_ The problem is that neither `express-graphql` nor `apollo-server` accept HTTP requests other than GET and POST — which is why the request fails in our scenario. This is also indicated by the error message we saw in the console: `OPTIONS [http://localhost:4000](http://localhost:4000) 405 (Method not allowed)`. @@ -141,7 +141,7 @@ Luckily, the solution is very simple. As `express-graphql` and `apollo-server` a Uncommenting [line 23](https://github.com/nikolasburk/graphql-cors-example/blob/master/server/index.js#L23) in `server.js` will enable the cors middleware for your express server: `app.use(cors())`. Having the middleware enabled ensures your express server sets the proper HTTP header, enabling your React app to load data from it: -![Using the [cors](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/cors) middleware, the server sets the correct HTTP header enabling cross-origin resource sharing](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*LnVsDQuQtSl-Wt-m6DfO5g.png)_Using the [cors](https://github.com/expressjs/cors) middleware, the server sets the correct HTTP header enabling cross-origin resource sharing_ +![Using the [cors](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/cors) middleware, the server sets the correct HTTP header enabling cross-origin resource sharing](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1-LnVsDQuQtSl-Wt-m6DfO5g.png)_Using the [cors](https://github.com/expressjs/cors) middleware, the server sets the correct HTTP header enabling cross-origin resource sharing_ ## Summary diff --git a/apps/blog/content/blog/getting-started-with-relay-modern-46f8de6bd6ec/index.mdx b/apps/blog/content/blog/getting-started-with-relay-modern-46f8de6bd6ec/index.mdx index 7bb008ee38..b664d195b6 100644 --- a/apps/blog/content/blog/getting-started-with-relay-modern-46f8de6bd6ec/index.mdx +++ b/apps/blog/content/blog/getting-started-with-relay-modern-46f8de6bd6ec/index.mdx @@ -75,7 +75,7 @@ type Post { ``` This is what it should look like in your terminal: -![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*t5Y1tsH07bEQHbrB.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-t5Y1tsH07bEQHbrB.png) Note that you can now manage this project in the Graphcool Console. If you want to manage it locally, you can use the project file `project.graphcool` to make local changes to the schema and then apply them by calling `graphcool push`. @@ -220,7 +220,7 @@ Awesome, you’re now ready to use Relay in your app 🚀 > **Note**: If you lose the endpoint for your GraphQL API, you can always find it in the Graphcool Console (by clicking in _ENDPOINTS_-button on the bottom-left) or use the graphcool endpoints command in the same directory where the project file project.graphcool is located: -![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*KQLRnImerQRjALS5.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-KQLRnImerQRjALS5.png) ## 3. Displaying all Posts @@ -333,7 +333,7 @@ yarn start ``` This will open up a browser and load the app from `http://localhost:3000` where you'll now see two lovely pigs: -![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*QelKIjXtM12d3kAe.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-QelKIjXtM12d3kAe.png) ### Load Data from Server @@ -616,7 +616,7 @@ Notice that you’ll have to switch the Playground mode from **Simple** to **Rel Then click the _Play_-button and select each of these mutations exactly once: -![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*iPceJCV7B-ri4upn.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-iPceJCV7B-ri4upn.png) > **Note**: You can also use the Data Browser to add some post items. @@ -626,7 +626,7 @@ Go ahead and run `yarn start` to see what the app currently looks like - you sho By the way, if you’re curios to see what the actual query looked like that the `QueryRenderer` composed for you and that was sent over to the server, you can inspect the _Networking_-tab of your browser's dev tools: -![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*A92lc0WjBQD120DC.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-A92lc0WjBQD120DC.png) ## 4. Adding and Deleting Posts @@ -734,7 +734,7 @@ import { Link } from 'react-router' ``` Pressing the `Link` element in the app will now trigger the `CreatePage` to appear on the screen. You can run the app again and you should see everything as before, plus the **+ New Post**-button on the top right. Press it to convince yourself that it actually displays the `CreatePage` component: -![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*h_JXfmCfcMYpbO__.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-h_JXfmCfcMYpbO__.png) ### Creating new Posts @@ -848,7 +848,7 @@ So, in `optimisticUpdater`, you're simply creating the `newPost` yourself based For the `updater` you can make use of the actual server response to update the cache. With `getRootField` and `getLinkedRecord` you get access to the payload of the mutation that you specified on top of the file: -![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*lWBTpLYdMBLe7BvS.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-lWBTpLYdMBLe7BvS.png) Next you need to actually use this mutation in `CreatePage.js`. The only problem left right now is that in `CreatePage`, you don't have access to the `viewerId` at the moment - but it's a required argument for the mutation. At this point, you _could_ use `react-router` and simply pass the `viewerId` from the `ListPage` on to the `CreatePage` component. However, we want to make proper use of Relay and each component should be responsible for its own data dependencies. @@ -938,7 +938,7 @@ relay-compiler --src ./src --schema ./schema.graphql ``` That’s it, you can now go ahead and add a new post through the UI of your app! How about these musical fellahs right here? -![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*p_mSrJU2L90IXDSi.jpg) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-p_mSrJU2L90IXDSi.jpg) ### Deleting Posts diff --git a/apps/blog/content/blog/graphql-eu-18-eiw8bishe2di/index.mdx b/apps/blog/content/blog/graphql-eu-18-eiw8bishe2di/index.mdx index bd504bfda5..a3e8acc527 100644 --- a/apps/blog/content/blog/graphql-eu-18-eiw8bishe2di/index.mdx +++ b/apps/blog/content/blog/graphql-eu-18-eiw8bishe2di/index.mdx @@ -31,7 +31,7 @@ In the past 12 months, we have organized two major GraphQL conferences: GraphQL At last year's GraphQL Europe conference, 300 GraphQL enthusiasts came together to discuss the latest topics of the GraphQL ecosystem and share their own experiences with other attendees. We were especially excited to welcome many community members that flew over to Europe from the US and from Australia. -![](/graphql-eu-18-eiw8bishe2di/imgs/1*f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg) +![](/graphql-eu-18-eiw8bishe2di/imgs/1-f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg) Next to fruitful discussions with other developers, the conference offered a broad range of talks from various GraphQL experts. @@ -67,7 +67,7 @@ The range of topics to be presented at the conference will be extremely diverse. Here's a quick selection of a few talks to be presented at the conference, you can find the entire schedule on the [website](https://www.graphql-europe.org#schedule). -![](/graphql-eu-18-eiw8bishe2di/imgs/1*-iELVZWzvAgEaKZlkNU6ZA.png) +![](/graphql-eu-18-eiw8bishe2di/imgs/1--iELVZWzvAgEaKZlkNU6ZA.png) ### Transpiling GraphQL instead of writing customized server code @@ -83,7 +83,7 @@ by **[Jon Wong](https://twitter.com/jnwng)** (Frontend Infrastructure Engineer @ Supercharge your GraphQL development with the linting, formatting, and static analysis tools you need to write cleaner and more reliable GraphQL. -![](/graphql-eu-18-eiw8bishe2di/imgs/1*AN2VR8MNLpLeNzUOEGbCJA.png) +![](/graphql-eu-18-eiw8bishe2di/imgs/1-AN2VR8MNLpLeNzUOEGbCJA.png) ### Fundamental Properties of the GraphQL Language @@ -91,7 +91,7 @@ by **[Olaf Hartig](https://twitter.com/olafhartig)** (Assistant Professor for CS This talk presents a formal study of the GraphQL language. After a gentle introduction to the typical problems considered in such studies, I highlight our findings regarding these problems for the case of GraphQL. As a bonus, I present a solution to avoid producing overly large query results. -![](/graphql-eu-18-eiw8bishe2di/imgs/1*_QMKg1HIi96OtzMMOtoajQ@2x.png) +![](/graphql-eu-18-eiw8bishe2di/imgs/1-_QMKg1HIi96OtzMMOtoajQ@2x.png) ### 2 Fast 2 Furious: migrating Medium’s codebase without slowing down @@ -99,7 +99,7 @@ by **[Sasha Solomon](https://twitter.com/sachee)** (Tech Lead @ Medium) After 5 years, we’re building the next generation infrastructure at Medium with GraphQL and we’re doing it without slowing product development and we’re incrementally gaining benefits from the new system. See how we take advantage of GraphQL to enable widespread yet gradual architectural change! -![](/graphql-eu-18-eiw8bishe2di/imgs/1*kKq-QXjiDhsDi82ZK8OX8w.png) +![](/graphql-eu-18-eiw8bishe2di/imgs/1-kKq-QXjiDhsDi82ZK8OX8w.png) ### Teaching GraphQL diff --git a/apps/blog/content/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/index.mdx b/apps/blog/content/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/index.mdx index 31103c5491..abb0634afc 100644 --- a/apps/blog/content/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/index.mdx +++ b/apps/blog/content/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/index.mdx @@ -39,7 +39,7 @@ A resolver function takes four arguments (in that order): Here is an overview of the execution process of a simple GraphQL query and the invocations of the belonging resolvers. Because the resolution of the _2nd resolver level_ is trivial, there is no need to actually implement these resolvers — their return values are automatically inferred by GraphQL.js: -![](/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/1*2UStyS7v3NIZKl2cLsBtYA.png) +![](/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/1-2UStyS7v3NIZKl2cLsBtYA.png) _Overview of the `parent` and `args` argument in the GraphQL resolver chain_ diff --git a/apps/blog/content/blog/graphql-server-basics-the-network-layer-51d97d21861/index.mdx b/apps/blog/content/blog/graphql-server-basics-the-network-layer-51d97d21861/index.mdx index 1572476287..7ba388905f 100644 --- a/apps/blog/content/blog/graphql-server-basics-the-network-layer-51d97d21861/index.mdx +++ b/apps/blog/content/blog/graphql-server-basics-the-network-layer-51d97d21861/index.mdx @@ -29,7 +29,7 @@ A key thing to understand about GraphQL is that it’s actually agnostic to the > The following section is mainly about Express.js and its concept of middleware that’s used for GraphQL libraries like `express-graphql` and `apollo-server`. **If you’re already familiar with Express, you can skip ahead to the next section.** -![Comparison of [express](https://expressjs.com), [hapi](https://hapijs.com/), [koa](http://koajs.com/) and [sail](https://sailsjs.com/) on [npm trends](http://www.npmtrends.com/)](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*6ERw4Znf6UYou_epNUutRA.png)_Comparison of [express](https://expressjs.com), [hapi](https://hapijs.com/), [koa](http://koajs.com/) and [sail](https://sailsjs.com/) on [npm trends](http://www.npmtrends.com/)_ +![Comparison of [express](https://expressjs.com), [hapi](https://hapijs.com/), [koa](http://koajs.com/) and [sail](https://sailsjs.com/) on [npm trends](http://www.npmtrends.com/)](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-6ERw4Znf6UYou_epNUutRA.png)_Comparison of [express](https://expressjs.com), [hapi](https://hapijs.com/), [koa](http://koajs.com/) and [sail](https://sailsjs.com/) on [npm trends](http://www.npmtrends.com/)_ [Express.js](https://expressjs.com/) is by far the [most popular](http://www.npmtrends.com/express-vs-hapi-vs-koa-vs-sails) JavaScript web framework. It shines thanks to its simplicity, flexibility and performance. @@ -47,7 +47,7 @@ app.listen(3000) ``` After executing this script with [Node.js](https://nodejs.org/en/), you can access the website on `http://localhost:3000` in your browser: -![](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*0ZgAAtT0Zm-Kc63SNeT5Ew.png) +![](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-0ZgAAtT0Zm-Kc63SNeT5Ew.png) You can easily add more _endpoints_ (also called [_routes_](https://expressjs.com/en/guide/routing.html)) to your server’s API: @@ -184,7 +184,7 @@ app.listen(4000) ``` ## `graphql-yoga`: The easiest way to build a GraphQL server -![](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*yIYI_iNabiNS_7uuzFVJDQ.png) +![](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-yIYI_iNabiNS_7uuzFVJDQ.png) ### Removing friction when building GraphQL servers @@ -222,7 +222,7 @@ Note that a `GraphQLServer` can either be instantiated using a ready instance of Note that `graphql-yoga` also has built-in support for [`graphql-playground`](https://github.com/graphcool/graphql-playground). With the code above you can open the Playground at `http://localhost:4000`: -![](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*dMyX0jnoKvhYAa0cgSqenQ.png) +![](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-dMyX0jnoKvhYAa0cgSqenQ.png) `graphql-yoga` also features a simple API for GraphQL subscriptions out-of-the-box, built on top of the [`graphql-subscriptions`](https://github.com/apollographql/graphql-subscriptions) and [`ws-subscriptions-transport`](https://github.com/apollographql/subscriptions-transport-ws) package. You can check out how it works in this [straightforward example](https://github.com/graphcool/graphql-yoga/tree/master/examples/subscriptions). diff --git a/apps/blog/content/blog/graphql-server-basics-the-schema-ac5e2950214e/index.mdx b/apps/blog/content/blog/graphql-server-basics-the-schema-ac5e2950214e/index.mdx index ab87676663..1cd6237016 100644 --- a/apps/blog/content/blog/graphql-server-basics-the-schema-ac5e2950214e/index.mdx +++ b/apps/blog/content/blog/graphql-server-basics-the-schema-ac5e2950214e/index.mdx @@ -155,7 +155,7 @@ const UserType = new GraphQLObjectType({ Considering our query from above, let’s understand how it’s executed and data is collected. The query in total contains three fields: `user` (the _root field_), `id` and `name`. This means that when the query arrives at the server, the server needs to call three resolver functions — one per field. Let’s walk through the execution flow: -![](/graphql-server-basics-the-schema-ac5e2950214e/imgs/1*_fQh0zWBlDG1OJ-FbMnWcw.png) +![](/graphql-server-basics-the-schema-ac5e2950214e/imgs/1-_fQh0zWBlDG1OJ-FbMnWcw.png) 1. The query arrives at the server. 1. The server invokes the resolver for the root field `user` — let’s assume `fetchUserById` returns this object: `{ "id": "abc", "name": "Sarah" }` diff --git a/apps/blog/content/blog/how-do-graphql-remote-schemas-work-7118237c89d7/index.mdx b/apps/blog/content/blog/how-do-graphql-remote-schemas-work-7118237c89d7/index.mdx index 84519b4c77..d041904bda 100644 --- a/apps/blog/content/blog/how-do-graphql-remote-schemas-work-7118237c89d7/index.mdx +++ b/apps/blog/content/blog/how-do-graphql-remote-schemas-work-7118237c89d7/index.mdx @@ -143,7 +143,7 @@ As you can see, the information in this JSON object is equivalent to our SDL-bas With the ability to introspect the schema of an existing GraphQL API, we can now simply create a new `GraphQLSchema` instance whose schema definition is identical to the existing one. That’s exactly the idea of [`makeRemoteExecutableSchema`](https://www.apollographql.com/docs/graphql-tools/remote-schemas.html#makeRemoteExecutableSchema) from `graphql-tools`. -![](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*nmcFbnUg7ooxjlZ8z-GLQA.png) +![](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-nmcFbnUg7ooxjlZ8z-GLQA.png) `makeRemoteExecutableSchema` receives two arguments: @@ -219,13 +219,13 @@ The first thing to note is that both of them are instances of `GraphQLSchema`. H Using the chrome debugger, we can reveal the databaseServiceSchemaDefinition is a JavaScript object looking as follows: -![A non-executable instance of GraphQLSchema](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*o57PeaoF5PVrON-FhR8QTA.png)_A non-executable instance of GraphQLSchema_ +![A non-executable instance of GraphQLSchema](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-o57PeaoF5PVrON-FhR8QTA.png)_A non-executable instance of GraphQLSchema_ The blue rectangle shows the [`Query`](https://github.com/nikolasburk/graphcool-remote-schema/blob/master/user-db/database.graphql#L29) type with its properties. As expected, it has a field called `allUsers` (among others). However, in this schema instance there are no resolvers attached to the `Query`'s fields— so it’s not executable. Let’s also take a look at the `databaseServiceExecutableSchema`: -![Executable Schema = Schema definition + Resolvers](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*KQ620d8vVrnl4vCYyqkWOA.png)_Executable Schema = Schema definition + Resolvers_ +![Executable Schema = Schema definition + Resolvers](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-KQ620d8vVrnl4vCYyqkWOA.png)_Executable Schema = Schema definition + Resolvers_ This screenshot looks very similar to the one we just saw — except that the `allUsers` field now has this `resolve` function attached to it. (This is also the case for the other fields on the [`Query`](https://github.com/nikolasburk/graphcool-remote-schema/blob/master/user-db/database.graphql#L29) type (`User`, `node`, `user` and `_allUsersMeta`), but not visible in the screenshot.) @@ -262,7 +262,7 @@ Line 12–16 is what’s interesting to us: a function called `fetcher` is invok In the same way that we explored the resolver function for the `allUsers` root field above, we can also investigate what the resolvers for the fields on the `User` type look like. We therefore need to navigate into the `_typeMaps` property of the `databaseServiceExecutableSchema` where we find the `User` type with its fields: -![The User type has two fields: id and name (both have an attached resolver function)](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*bz9k7dsElF5x_eqIfc_XWw.png)_The User type has two fields: id and name (both have an attached resolver function)_ +![The User type has two fields: id and name (both have an attached resolver function)](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-bz9k7dsElF5x_eqIfc_XWw.png)_The User type has two fields: id and name (both have an attached resolver function)_ Both fields (`id` and `name`) have a `resolve` function attached to them, here is their implementation that was generated by `makeRemoteExecutableSchema` (note that it’s identical for both fields): @@ -297,7 +297,7 @@ Interestingly, this time the generated resolver does not use a `fetcher` functio The [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers of remote executable schemas also confirm this finding. In the following screenshot, we extended the previous schema definition with an `Article` and `Comment` type (each also connected to the `existingUser`) so we can send a more deeply nested query. -![[GraphQL Playgrounds](https://github.com/graphql/graphql-playground) support displaying [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers out-of-the-box (bottom right)](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*SwVWiWOCRnyCCP80lKoXjw.png)_[GraphQL Playgrounds](https://github.com/graphql/graphql-playground) support displaying [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers out-of-the-box (bottom right)_ +![[GraphQL Playgrounds](https://github.com/graphql/graphql-playground) support displaying [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers out-of-the-box (bottom right)](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-SwVWiWOCRnyCCP80lKoXjw.png)_[GraphQL Playgrounds](https://github.com/graphql/graphql-playground) support displaying [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers out-of-the-box (bottom right)_ It’s very apparent from the tracing data that only the root resolver (for the allUsers field) takes notable time (167 milliseconds). All remaining resolvers responsible for returning data for non-root fields only take a few microseconds to be executed. This can be explained with the observation we made earlier that root resolvers use the `fetcher` to forward the received query while all non-root resolvers simple return their data based on the incoming `parent` argument. diff --git a/apps/blog/content/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/index.mdx b/apps/blog/content/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/index.mdx index c999fa84b0..3ad9d37503 100644 --- a/apps/blog/content/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/index.mdx +++ b/apps/blog/content/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/index.mdx @@ -61,7 +61,7 @@ create-react-app react-apollo-instagram-example cd react-apollo-instagram-example npm start # open http://localhost:3000 ``` -![This is what you should see when opening [localhost:3000](http://localhost:3000)](/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/0*MZcp4O86JEoMbtpi.png)_This is what you should see when opening [localhost:3000](http://localhost:3000)_ +![This is what you should see when opening [localhost:3000](http://localhost:3000)](/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/0-MZcp4O86JEoMbtpi.png)_This is what you should see when opening [localhost:3000](http://localhost:3000)_ Hot-reloading and linting is included as well, the terminal window keeps us updated about errors and linter problems. diff --git a/apps/blog/content/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/index.mdx b/apps/blog/content/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/index.mdx index 8d406e1907..c0b11fc007 100644 --- a/apps/blog/content/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/index.mdx +++ b/apps/blog/content/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/index.mdx @@ -409,19 +409,19 @@ server.start(() => console.log(`Server is running on http://localhost:4000`)) ``` If you want to follow along, you can copy the code from the above `index.js` and `schema.graphql` snippets into corresponding files inside a `src` directory in a Node project, add `graphql-yoga` as a dependency and then run `node src/index.js`. If you do so and then open your browser at [http://localhost:4000](http://localhost:4000), you’ll see the following [GraphQL Playground](https://github.com/graphcool/graphql-playground): -![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*sGvSvA1yKloKDpXNb3jfBw.png) +![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-sGvSvA1yKloKDpXNb3jfBw.png) A GraphQL Playground is a GraphQL IDE that let’s you explore the capabilities of a GraphQL API in an interactive manner. Similar to [Postman](https://www.getpostman.com/), but with many additional GraphQL-specific features. In there, you can now send the queries we saw above. The query will be resolved by the GraphQL engine of the `GraphQLServer`. All it needs to do is invoking the resolvers for the fields in the query and thus calling out to the appropriate REST endpoints. This is the `user(id: ID)` query for example: -![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*m5LM8FgXa0VEMz-KwMyd3Q.png) +![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-m5LM8FgXa0VEMz-KwMyd3Q.png) Awesome! You can now add fields of the `User` type to the query as you like. However, when also asking for the related `Post` items of a user, you’ll be disappointed that you’re getting an error: -![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*UF5m7oNBcs1LKPboj7GQ8A.png) +![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-UF5m7oNBcs1LKPboj7GQ8A.png) So, something doesn’t quite work yet! Let’s take a look at the resolver implementation for the `user(id: ID)` field again: @@ -456,7 +456,7 @@ const resolvers = { ``` The implementation of the resolver is bug free and you can nest your queries as you wish. Pleasing! -![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*0mbKo-p6qfrBKgAaJb0gOQ.png) +![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-0mbKo-p6qfrBKgAaJb0gOQ.png) > Explaining the underlying mechanics of why these additional resolvers fix the bug from before are beyond the scope of this article. If you’re curios, check out the following article: [Demystifying the info Argument in GraphQL Resolvers](https://www.prisma.io/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a) diff --git a/apps/blog/content/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/index.mdx b/apps/blog/content/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/index.mdx index ef364afa13..5a2f6e00da 100644 --- a/apps/blog/content/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/index.mdx +++ b/apps/blog/content/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/index.mdx @@ -25,7 +25,7 @@ In this article we will dive into transport-level query batching, an advanced Ap We will use an extended version of the [Learn Apollo](https://learnapollo.com/) Pokedex app to explore the performance gains query batching can provide. The original Pokedex app lists all Pokemon for a single trainer. We make the app multi-tenant by rendering the Pokedex component for each trainer. This is how the app looks like with 6 trainers -![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*eqlu9eJJgj8vIqck.png) +![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0-eqlu9eJJgj8vIqck.png) To really stress test Apollo, we’ll load each trainer twice! @@ -33,13 +33,13 @@ To really stress test Apollo, we’ll load each trainer twice! Chrome DevTools has a very detailed network traffic inspection feature. If you are serious about app performance take a look at the [documentation](https://developers.google.com/web/tools/chrome-devtools/network-performance/resource-loading?utm_source=dcc&utm_medium=redirect&utm_campaign=2016q3). When you load the extended pokedex and filter for requests to the GraphQL backend it looks like this -![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*-h6XwUanLrNSYjJk.png) +![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0--h6XwUanLrNSYjJk.png) The first thing you notice is that Apollo is generating 12 requests. This makes sense as we are rendering 12 Pokedex components. Each request takes around 100 ms and the first 6 requests completes within 126 ms. But now something interesting happens. The following 6 requests are stalled for up to 126 ms while the first requests complete. All browsers have a limit on [concurrent connections](http://www.browserscope.org/?category=network). For Chrome the limit is currently 6 concurrent requests to the same hostname, so 7 requests will take roughly double the amount of time to complete as 6 requests. This is where Apollos Query Batching comes into play. If Query Batching is enabled, Apollo will not issue requests immediately. Instead it will wait for up to 10 ms to see if more requests come in from other components. After the 10 ms, Apollo will issue 1 request containing all the queries. This eliminates the issue with stalled connections and delivers significantly better performance -![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*mv6z4N7_OSza7_2h.png) +![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0-mv6z4N7_OSza7_2h.png) The performance of this combined query is almost as good as a single query from the first test. @@ -175,7 +175,7 @@ batched response: Enabling Query Batching already provided a significant boost to performance. Can we do even better? Remember how the BatchingNetworkInterface queues up all requests for a predetermined amount of time before sending them all in one batch. Query deduplication takes this a step further by inspecting all queries in the batch to find and remove duplicates. Let's see how this affects our performance: -![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*5vAu8GPtx3kpYcX9.png) +![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0-5vAu8GPtx3kpYcX9.png) As you can see the request size is slightly smaller and the request is now just as fast as a single unbatched request. diff --git a/apps/blog/content/blog/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/index.mdx b/apps/blog/content/blog/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/index.mdx index db0804bc16..7c921c86f7 100644 --- a/apps/blog/content/blog/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/index.mdx +++ b/apps/blog/content/blog/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/index.mdx @@ -34,7 +34,7 @@ With the growing number of tools relying on the schema, more and more different The solution? There needs to be a standard for how to configure GraphQL projects. -![](/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0*zy8sNGj9yqANZhrw.png) +![](/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0-zy8sNGj9yqANZhrw.png) ## .graphqlconfig - One Config to Rule Them All @@ -78,7 +78,7 @@ Along with the unified way to write configuration files, we’re also introducin You can use it to quickly download the schema from a specific endpoint, open a GraphQL playground or show the schema diff between two different environments. Here is the CLI in action: -![](/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0*c56E4V22_pl88Si4.gif) +![](/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0-c56E4V22_pl88Si4.gif) You can simply install the CLI using npm: diff --git a/apps/blog/content/blog/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/index.mdx b/apps/blog/content/blog/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/index.mdx index e9cfb0c190..66595b015f 100644 --- a/apps/blog/content/blog/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/index.mdx +++ b/apps/blog/content/blog/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/index.mdx @@ -28,7 +28,7 @@ GraphQL is becoming the new standard for API development and is used in producti The first version of Prisma was developed in early 2016, shortly after GraphQL was first released. Originally conceived as the query engine powering the [Graphcool BaaS](https://www.graph.cool/), it has gained widespread use in large and small companies adopting GraphQL. In January 2018, we released Prisma 1.0 as a standalone infrastructure component under the Apache 2 license. -![](/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/1*MmTqUD1_jQtNRxsMhyQyDg@2x.png) +![](/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/1-MmTqUD1_jQtNRxsMhyQyDg@2x.png) With close to 10.000 developers in [our Slack](https://slack.prisma.io/), we’re now home to the biggest GraphQL community and run multiple GraphQL conferences and meetups. diff --git a/apps/blog/content/blog/top-5-reasons-to-use-graphql-b60cfa683511/index.mdx b/apps/blog/content/blog/top-5-reasons-to-use-graphql-b60cfa683511/index.mdx index 0ecc829706..94151d762e 100644 --- a/apps/blog/content/blog/top-5-reasons-to-use-graphql-b60cfa683511/index.mdx +++ b/apps/blog/content/blog/top-5-reasons-to-use-graphql-b60cfa683511/index.mdx @@ -87,7 +87,7 @@ When it came out, the only tooling available for developers to use GraphQL was t Today, reference implementations of the GraphQL specification are available in [various languages](http://graphql.org/code/#server-libraries) and there’s a [plethora of GraphQL clients](https://itnext.io/exploring-different-graphql-clients-d1bc69de305f). In addition, lots of tooling (like [Prisma](https://www.prisma.io/), [GraphQL Faker](https://github.com/APIs-guru/graphql-faker), [GraphQL Playground](https://github.com/graphcool/graphql-playground), [graphql-config](https://github.com/graphcool/graphql-config),…) provide seamless workflows and make for an amazing developer experience when building GraphQL APIs. -![GraphQL is used in production by many big tech companies](/top-5-reasons-to-use-graphql-b60cfa683511/imgs/1*OPs5D2XrAcFI1hDay-_nEQ.png)_GraphQL is used in production by many big tech companies_ +![GraphQL is used in production by many big tech companies](/top-5-reasons-to-use-graphql-b60cfa683511/imgs/1-OPs5D2XrAcFI1hDay-_nEQ.png)_GraphQL is used in production by many big tech companies_ The GraphQL community is also growing rapidly. [Many small and big companies have started using it in production](http://graphql.org/users/) and more and more [GraphQL Meetups](http://graphql.org/community/upcoming-events/#meetups) are being founded all over the world. There even are entire conferences that are exclusively dedicated to GraphQL: diff --git a/apps/blog/content/blog/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/index.mdx b/apps/blog/content/blog/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/index.mdx index d2cd15f868..f087094e6a 100644 --- a/apps/blog/content/blog/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/index.mdx +++ b/apps/blog/content/blog/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/index.mdx @@ -137,7 +137,7 @@ const server = new GraphQLServer({ You can now start the server and open up a [GraphQL Playground](https://github.com/prismagraphql/graphql-playground) by running the `yarn dev` command: -![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*GoxKn35GhQpmHZ6bnKbDZA.png) +![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-GoxKn35GhQpmHZ6bnKbDZA.png) Feel free to explore the project and send a few queries and mutations. @@ -415,7 +415,7 @@ subscription { Once the subscription is running, you'll see a loading indicator in the response pane and the **Play**-button turns into a red **Stop**-button for you to stop the subscription. -![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*9fDpnhWdRrgN-vxB3HmLeQ.png) +![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-9fDpnhWdRrgN-vxB3HmLeQ.png) You can now open another tab and send a mutation to trigger the subscription: @@ -428,7 +428,7 @@ mutation { ``` Navigating back to the initial tab, you’ll see that the subscription data now appeared in the response pane 🙌 -![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*c6bexq2J0bTeT5UioGjl_A.png) +![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-c6bexq2J0bTeT5UioGjl_A.png) Feel free to play around with the `updateTitle` mutation as well. @@ -531,7 +531,7 @@ That’s why inside `resolve` you can simply return `payload.post.previousValues Before testing the new subscription, you need to restart the server to ensure your changes get applied to the API. You can kill the server by pressing **CTRL+C** and then restart it using the `yarn dev` command. -![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*TisP6j41cu4itqI__dDE-w.png) +![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-TisP6j41cu4itqI__dDE-w.png) Once the subscription is running, you can send the following mutation (you need to replace the `__POST_ID__` placeholder with the `id` of an actual `Post` from your database): @@ -544,7 +544,7 @@ mutation { ``` Navigating back to the subscription tab, you’ll see that the `id` and `title` have been pushed in the response pane, as requested by the active subscription. -![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*1vMUL8w54yIAxOPVSR0UjQ.png) +![](/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-1vMUL8w54yIAxOPVSR0UjQ.png) ## Summary diff --git a/apps/blog/content/blog/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/index.mdx b/apps/blog/content/blog/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/index.mdx index 6558681b7d..a033934abb 100644 --- a/apps/blog/content/blog/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/index.mdx +++ b/apps/blog/content/blog/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/index.mdx @@ -76,7 +76,7 @@ This downloads the code from the starter branch of [this](http://github.com/niko Feel free to make yourself familiar with the codebase. You can start the app by running yarn start inside the react-apollo-tutorial-starter directory. Don’t forget to install the dependencies before by running yarn install. -![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*_EjTITNbwXGCVc7f5MA7tQ.png) +![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-_EjTITNbwXGCVc7f5MA7tQ.png) The directory you downloaded already contains the entire UI for the app, but there’s no actual _functionality_ because that all depends on the backend. @@ -89,7 +89,7 @@ You can start the server by running yarn start inside the server directory (agai If you’ve opened a Playground right now, you’ll see an error though: -![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*wBWEMQXeDUu6JZBN44ZGUg.png) +![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-wBWEMQXeDUu6JZBN44ZGUg.png) This is because the GraphQL server depends on a Prisma service as its database layer, but you haven’t deployed that Prisma service yet. So, that’s what you’ll do next. @@ -130,7 +130,7 @@ That’s it! Your GraphQL server is now backed by a database and fully functiona Here is a quick overview of the architecture that’s used for this app: -![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*rzI7PLKuJuRjjBIxoSiboQ.png) +![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-rzI7PLKuJuRjjBIxoSiboQ.png) ### 1.5. Install React Apollo dependencies in the frontend app @@ -276,7 +276,7 @@ If you run the app now, the DraftsPage will already load the data from the serve Right now, the drafts page only displays the draft that was seeded initially: -![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*dgGQ6f1SZcJH7nddNM0Kug.png) +![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-dgGQ6f1SZcJH7nddNM0Kug.png) ### 2.3. Accounting for loading and error states @@ -474,7 +474,7 @@ import gql from 'graphql-tag' ``` Now, when running the app and navigating to the /create route, you can submit new drafts that are stored in the database on the server-side: -![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*iNK392MZ7rLIemoigPtvGA.png) +![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-iNK392MZ7rLIemoigPtvGA.png) However, after you clicked the **Create**-button and the app automatically navigated back to the /drafts route, you’ll notice that the page actually hasn’t updated. Only after refreshing the page, the newly created draft will appear 🤔 @@ -506,7 +506,7 @@ Inside update, you first extract the previous results of the DRAFTS_QUERY from t Great, when you’re testing the app again, you’ll see that the /drafts page is now updated directly after the mutation was performed. -![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*idRITgkP04XGflQExvz61A.png) +![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-idRITgkP04XGflQExvz61A.png) Note that we’re omitting accounting for error and loading states here for the sake of brevity. @@ -579,7 +579,7 @@ import gql from 'graphql-tag' ``` Now, you can select a draft from the /drafts route and the app will display the corresponding DetailPage for it, including the **Publish**- and **Delete**-buttons: -![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*ifNy0EWA5EdrqkU0X9LT3Q.png) +![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-ifNy0EWA5EdrqkU0X9LT3Q.png) These currently don’t work, so let’s implement for them next! @@ -663,7 +663,7 @@ import { FEED_QUERY } from './FeedPage' ``` Go ahead and test the new functionality! You’ll see that a draft that is published through the UI will now indeed appear in the _feed_: -![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*3fi7Zud_T3VeocM7CN_FIQ.png) +![](/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-3fi7Zud_T3VeocM7CN_FIQ.png) ### 5.3. Deleting posts diff --git a/apps/blog/content/blog/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/index.mdx b/apps/blog/content/blog/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/index.mdx index 45efb4465e..a3a05cf643 100644 --- a/apps/blog/content/blog/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/index.mdx +++ b/apps/blog/content/blog/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/index.mdx @@ -62,7 +62,7 @@ After installing, we can easily create and run a new project from the command li Here is what the initial screen looks like in the iOS simulator: -![](/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/imgs/0*A9dtztGpco-x9gTF.png) +![](/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/imgs/0-A9dtztGpco-x9gTF.png) Hot-reloading is already setup as well, so any changes you make in the JavaScript code will immediately appear on the screen! diff --git a/apps/blog/public/connections-edges-nodes-in-relay-758d358aa4c7/imgs/0*sPafc6eXHJvRSJhZ.png b/apps/blog/public/connections-edges-nodes-in-relay-758d358aa4c7/imgs/0-sPafc6eXHJvRSJhZ.png similarity index 100% rename from apps/blog/public/connections-edges-nodes-in-relay-758d358aa4c7/imgs/0*sPafc6eXHJvRSJhZ.png rename to apps/blog/public/connections-edges-nodes-in-relay-758d358aa4c7/imgs/0-sPafc6eXHJvRSJhZ.png diff --git a/apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*LnVsDQuQtSl-Wt-m6DfO5g.png b/apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1-LnVsDQuQtSl-Wt-m6DfO5g.png similarity index 100% rename from apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*LnVsDQuQtSl-Wt-m6DfO5g.png rename to apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1-LnVsDQuQtSl-Wt-m6DfO5g.png diff --git a/apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*ZbsVGATAeIp5iU2504VP2A.png b/apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1-ZbsVGATAeIp5iU2504VP2A.png similarity index 100% rename from apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*ZbsVGATAeIp5iU2504VP2A.png rename to apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1-ZbsVGATAeIp5iU2504VP2A.png diff --git a/apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*m6QGz5tXtLt7uVapNCpBEw.png b/apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1-m6QGz5tXtLt7uVapNCpBEw.png similarity index 100% rename from apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*m6QGz5tXtLt7uVapNCpBEw.png rename to apps/blog/public/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1-m6QGz5tXtLt7uVapNCpBEw.png diff --git a/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*A92lc0WjBQD120DC.png b/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-A92lc0WjBQD120DC.png similarity index 100% rename from apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*A92lc0WjBQD120DC.png rename to apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-A92lc0WjBQD120DC.png diff --git a/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*KQLRnImerQRjALS5.png b/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-KQLRnImerQRjALS5.png similarity index 100% rename from apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*KQLRnImerQRjALS5.png rename to apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-KQLRnImerQRjALS5.png diff --git a/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*QelKIjXtM12d3kAe.png b/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-QelKIjXtM12d3kAe.png similarity index 100% rename from apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*QelKIjXtM12d3kAe.png rename to apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-QelKIjXtM12d3kAe.png diff --git a/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*h_JXfmCfcMYpbO__.png b/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-h_JXfmCfcMYpbO__.png similarity index 100% rename from apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*h_JXfmCfcMYpbO__.png rename to apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-h_JXfmCfcMYpbO__.png diff --git a/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*iPceJCV7B-ri4upn.png b/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-iPceJCV7B-ri4upn.png similarity index 100% rename from apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*iPceJCV7B-ri4upn.png rename to apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-iPceJCV7B-ri4upn.png diff --git a/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*lWBTpLYdMBLe7BvS.png b/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-lWBTpLYdMBLe7BvS.png similarity index 100% rename from apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*lWBTpLYdMBLe7BvS.png rename to apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-lWBTpLYdMBLe7BvS.png diff --git a/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*p_mSrJU2L90IXDSi.jpg b/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-p_mSrJU2L90IXDSi.jpg similarity index 100% rename from apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*p_mSrJU2L90IXDSi.jpg rename to apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-p_mSrJU2L90IXDSi.jpg diff --git a/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*t5Y1tsH07bEQHbrB.png b/apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-t5Y1tsH07bEQHbrB.png similarity index 100% rename from apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*t5Y1tsH07bEQHbrB.png rename to apps/blog/public/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0-t5Y1tsH07bEQHbrB.png diff --git a/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*-iELVZWzvAgEaKZlkNU6ZA.png b/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1--iELVZWzvAgEaKZlkNU6ZA.png similarity index 100% rename from apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*-iELVZWzvAgEaKZlkNU6ZA.png rename to apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1--iELVZWzvAgEaKZlkNU6ZA.png diff --git a/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*AN2VR8MNLpLeNzUOEGbCJA.png b/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1-AN2VR8MNLpLeNzUOEGbCJA.png similarity index 100% rename from apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*AN2VR8MNLpLeNzUOEGbCJA.png rename to apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1-AN2VR8MNLpLeNzUOEGbCJA.png diff --git a/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*_QMKg1HIi96OtzMMOtoajQ@2x.png b/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1-_QMKg1HIi96OtzMMOtoajQ@2x.png similarity index 100% rename from apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*_QMKg1HIi96OtzMMOtoajQ@2x.png rename to apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1-_QMKg1HIi96OtzMMOtoajQ@2x.png diff --git a/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg b/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1-f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg similarity index 100% rename from apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg rename to apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1-f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg diff --git a/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*kKq-QXjiDhsDi82ZK8OX8w.png b/apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1-kKq-QXjiDhsDi82ZK8OX8w.png similarity index 100% rename from apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1*kKq-QXjiDhsDi82ZK8OX8w.png rename to apps/blog/public/graphql-eu-18-eiw8bishe2di/imgs/1-kKq-QXjiDhsDi82ZK8OX8w.png diff --git a/apps/blog/public/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/1*2UStyS7v3NIZKl2cLsBtYA.png b/apps/blog/public/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/1-2UStyS7v3NIZKl2cLsBtYA.png similarity index 100% rename from apps/blog/public/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/1*2UStyS7v3NIZKl2cLsBtYA.png rename to apps/blog/public/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/1-2UStyS7v3NIZKl2cLsBtYA.png diff --git a/apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*0ZgAAtT0Zm-Kc63SNeT5Ew.png b/apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-0ZgAAtT0Zm-Kc63SNeT5Ew.png similarity index 100% rename from apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*0ZgAAtT0Zm-Kc63SNeT5Ew.png rename to apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-0ZgAAtT0Zm-Kc63SNeT5Ew.png diff --git a/apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*6ERw4Znf6UYou_epNUutRA.png b/apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-6ERw4Znf6UYou_epNUutRA.png similarity index 100% rename from apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*6ERw4Znf6UYou_epNUutRA.png rename to apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-6ERw4Znf6UYou_epNUutRA.png diff --git a/apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*dMyX0jnoKvhYAa0cgSqenQ.png b/apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-dMyX0jnoKvhYAa0cgSqenQ.png similarity index 100% rename from apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*dMyX0jnoKvhYAa0cgSqenQ.png rename to apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-dMyX0jnoKvhYAa0cgSqenQ.png diff --git a/apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*yIYI_iNabiNS_7uuzFVJDQ.png b/apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-yIYI_iNabiNS_7uuzFVJDQ.png similarity index 100% rename from apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*yIYI_iNabiNS_7uuzFVJDQ.png rename to apps/blog/public/graphql-server-basics-the-network-layer-51d97d21861/imgs/1-yIYI_iNabiNS_7uuzFVJDQ.png diff --git a/apps/blog/public/graphql-server-basics-the-schema-ac5e2950214e/imgs/1*_fQh0zWBlDG1OJ-FbMnWcw.png b/apps/blog/public/graphql-server-basics-the-schema-ac5e2950214e/imgs/1-_fQh0zWBlDG1OJ-FbMnWcw.png similarity index 100% rename from apps/blog/public/graphql-server-basics-the-schema-ac5e2950214e/imgs/1*_fQh0zWBlDG1OJ-FbMnWcw.png rename to apps/blog/public/graphql-server-basics-the-schema-ac5e2950214e/imgs/1-_fQh0zWBlDG1OJ-FbMnWcw.png diff --git a/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*KQ620d8vVrnl4vCYyqkWOA.png b/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-KQ620d8vVrnl4vCYyqkWOA.png similarity index 100% rename from apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*KQ620d8vVrnl4vCYyqkWOA.png rename to apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-KQ620d8vVrnl4vCYyqkWOA.png diff --git a/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*SwVWiWOCRnyCCP80lKoXjw.png b/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-SwVWiWOCRnyCCP80lKoXjw.png similarity index 100% rename from apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*SwVWiWOCRnyCCP80lKoXjw.png rename to apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-SwVWiWOCRnyCCP80lKoXjw.png diff --git a/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*bz9k7dsElF5x_eqIfc_XWw.png b/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-bz9k7dsElF5x_eqIfc_XWw.png similarity index 100% rename from apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*bz9k7dsElF5x_eqIfc_XWw.png rename to apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-bz9k7dsElF5x_eqIfc_XWw.png diff --git a/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*nmcFbnUg7ooxjlZ8z-GLQA.png b/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-nmcFbnUg7ooxjlZ8z-GLQA.png similarity index 100% rename from apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*nmcFbnUg7ooxjlZ8z-GLQA.png rename to apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-nmcFbnUg7ooxjlZ8z-GLQA.png diff --git a/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*o57PeaoF5PVrON-FhR8QTA.png b/apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-o57PeaoF5PVrON-FhR8QTA.png similarity index 100% rename from apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*o57PeaoF5PVrON-FhR8QTA.png rename to apps/blog/public/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1-o57PeaoF5PVrON-FhR8QTA.png diff --git a/apps/blog/public/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/0*MZcp4O86JEoMbtpi.png b/apps/blog/public/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/0-MZcp4O86JEoMbtpi.png similarity index 100% rename from apps/blog/public/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/0*MZcp4O86JEoMbtpi.png rename to apps/blog/public/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/0-MZcp4O86JEoMbtpi.png diff --git a/apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*0mbKo-p6qfrBKgAaJb0gOQ.png b/apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-0mbKo-p6qfrBKgAaJb0gOQ.png similarity index 100% rename from apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*0mbKo-p6qfrBKgAaJb0gOQ.png rename to apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-0mbKo-p6qfrBKgAaJb0gOQ.png diff --git a/apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*UF5m7oNBcs1LKPboj7GQ8A.png b/apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-UF5m7oNBcs1LKPboj7GQ8A.png similarity index 100% rename from apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*UF5m7oNBcs1LKPboj7GQ8A.png rename to apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-UF5m7oNBcs1LKPboj7GQ8A.png diff --git a/apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*m5LM8FgXa0VEMz-KwMyd3Q.png b/apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-m5LM8FgXa0VEMz-KwMyd3Q.png similarity index 100% rename from apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*m5LM8FgXa0VEMz-KwMyd3Q.png rename to apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-m5LM8FgXa0VEMz-KwMyd3Q.png diff --git a/apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*sGvSvA1yKloKDpXNb3jfBw.png b/apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-sGvSvA1yKloKDpXNb3jfBw.png similarity index 100% rename from apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*sGvSvA1yKloKDpXNb3jfBw.png rename to apps/blog/public/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1-sGvSvA1yKloKDpXNb3jfBw.png diff --git a/apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*-h6XwUanLrNSYjJk.png b/apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0--h6XwUanLrNSYjJk.png similarity index 100% rename from apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*-h6XwUanLrNSYjJk.png rename to apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0--h6XwUanLrNSYjJk.png diff --git a/apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*5vAu8GPtx3kpYcX9.png b/apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0-5vAu8GPtx3kpYcX9.png similarity index 100% rename from apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*5vAu8GPtx3kpYcX9.png rename to apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0-5vAu8GPtx3kpYcX9.png diff --git a/apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*eqlu9eJJgj8vIqck.png b/apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0-eqlu9eJJgj8vIqck.png similarity index 100% rename from apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*eqlu9eJJgj8vIqck.png rename to apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0-eqlu9eJJgj8vIqck.png diff --git a/apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*mv6z4N7_OSza7_2h.png b/apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0-mv6z4N7_OSza7_2h.png similarity index 100% rename from apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*mv6z4N7_OSza7_2h.png rename to apps/blog/public/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0-mv6z4N7_OSza7_2h.png diff --git a/apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0*c56E4V22_pl88Si4.gif b/apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0-c56E4V22_pl88Si4.gif similarity index 100% rename from apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0*c56E4V22_pl88Si4.gif rename to apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0-c56E4V22_pl88Si4.gif diff --git a/apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0*zy8sNGj9yqANZhrw.png b/apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0-zy8sNGj9yqANZhrw.png similarity index 100% rename from apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0*zy8sNGj9yqANZhrw.png rename to apps/blog/public/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0-zy8sNGj9yqANZhrw.png diff --git a/apps/blog/public/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/1*MmTqUD1_jQtNRxsMhyQyDg@2x.png b/apps/blog/public/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/1-MmTqUD1_jQtNRxsMhyQyDg@2x.png similarity index 100% rename from apps/blog/public/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/1*MmTqUD1_jQtNRxsMhyQyDg@2x.png rename to apps/blog/public/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/1-MmTqUD1_jQtNRxsMhyQyDg@2x.png diff --git a/apps/blog/public/top-5-reasons-to-use-graphql-b60cfa683511/imgs/1*OPs5D2XrAcFI1hDay-_nEQ.png b/apps/blog/public/top-5-reasons-to-use-graphql-b60cfa683511/imgs/1-OPs5D2XrAcFI1hDay-_nEQ.png similarity index 100% rename from apps/blog/public/top-5-reasons-to-use-graphql-b60cfa683511/imgs/1*OPs5D2XrAcFI1hDay-_nEQ.png rename to apps/blog/public/top-5-reasons-to-use-graphql-b60cfa683511/imgs/1-OPs5D2XrAcFI1hDay-_nEQ.png diff --git a/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*1vMUL8w54yIAxOPVSR0UjQ.png b/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-1vMUL8w54yIAxOPVSR0UjQ.png similarity index 100% rename from apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*1vMUL8w54yIAxOPVSR0UjQ.png rename to apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-1vMUL8w54yIAxOPVSR0UjQ.png diff --git a/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*9fDpnhWdRrgN-vxB3HmLeQ.png b/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-9fDpnhWdRrgN-vxB3HmLeQ.png similarity index 100% rename from apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*9fDpnhWdRrgN-vxB3HmLeQ.png rename to apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-9fDpnhWdRrgN-vxB3HmLeQ.png diff --git a/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*GoxKn35GhQpmHZ6bnKbDZA.png b/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-GoxKn35GhQpmHZ6bnKbDZA.png similarity index 100% rename from apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*GoxKn35GhQpmHZ6bnKbDZA.png rename to apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-GoxKn35GhQpmHZ6bnKbDZA.png diff --git a/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*TisP6j41cu4itqI__dDE-w.png b/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-TisP6j41cu4itqI__dDE-w.png similarity index 100% rename from apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*TisP6j41cu4itqI__dDE-w.png rename to apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-TisP6j41cu4itqI__dDE-w.png diff --git a/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*c6bexq2J0bTeT5UioGjl_A.png b/apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-c6bexq2J0bTeT5UioGjl_A.png similarity index 100% rename from apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*c6bexq2J0bTeT5UioGjl_A.png rename to apps/blog/public/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1-c6bexq2J0bTeT5UioGjl_A.png diff --git a/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*3fi7Zud_T3VeocM7CN_FIQ.png b/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-3fi7Zud_T3VeocM7CN_FIQ.png similarity index 100% rename from apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*3fi7Zud_T3VeocM7CN_FIQ.png rename to apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-3fi7Zud_T3VeocM7CN_FIQ.png diff --git a/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*_EjTITNbwXGCVc7f5MA7tQ.png b/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-_EjTITNbwXGCVc7f5MA7tQ.png similarity index 100% rename from apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*_EjTITNbwXGCVc7f5MA7tQ.png rename to apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-_EjTITNbwXGCVc7f5MA7tQ.png diff --git a/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*dgGQ6f1SZcJH7nddNM0Kug.png b/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-dgGQ6f1SZcJH7nddNM0Kug.png similarity index 100% rename from apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*dgGQ6f1SZcJH7nddNM0Kug.png rename to apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-dgGQ6f1SZcJH7nddNM0Kug.png diff --git a/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*iNK392MZ7rLIemoigPtvGA.png b/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-iNK392MZ7rLIemoigPtvGA.png similarity index 100% rename from apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*iNK392MZ7rLIemoigPtvGA.png rename to apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-iNK392MZ7rLIemoigPtvGA.png diff --git a/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*idRITgkP04XGflQExvz61A.png b/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-idRITgkP04XGflQExvz61A.png similarity index 100% rename from apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*idRITgkP04XGflQExvz61A.png rename to apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-idRITgkP04XGflQExvz61A.png diff --git a/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*ifNy0EWA5EdrqkU0X9LT3Q.png b/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-ifNy0EWA5EdrqkU0X9LT3Q.png similarity index 100% rename from apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*ifNy0EWA5EdrqkU0X9LT3Q.png rename to apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-ifNy0EWA5EdrqkU0X9LT3Q.png diff --git a/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*rzI7PLKuJuRjjBIxoSiboQ.png b/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-rzI7PLKuJuRjjBIxoSiboQ.png similarity index 100% rename from apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*rzI7PLKuJuRjjBIxoSiboQ.png rename to apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-rzI7PLKuJuRjjBIxoSiboQ.png diff --git a/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*wBWEMQXeDUu6JZBN44ZGUg-1.png b/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-wBWEMQXeDUu6JZBN44ZGUg-1.png similarity index 100% rename from apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*wBWEMQXeDUu6JZBN44ZGUg-1.png rename to apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-wBWEMQXeDUu6JZBN44ZGUg-1.png diff --git a/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*wBWEMQXeDUu6JZBN44ZGUg.png b/apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-wBWEMQXeDUu6JZBN44ZGUg.png similarity index 100% rename from apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*wBWEMQXeDUu6JZBN44ZGUg.png rename to apps/blog/public/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1-wBWEMQXeDUu6JZBN44ZGUg.png diff --git a/apps/blog/public/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/imgs/0*A9dtztGpco-x9gTF.png b/apps/blog/public/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/imgs/0-A9dtztGpco-x9gTF.png similarity index 100% rename from apps/blog/public/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/imgs/0*A9dtztGpco-x9gTF.png rename to apps/blog/public/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/imgs/0-A9dtztGpco-x9gTF.png