├── .gitignore ├── README.md ├── client ├── .gitignore ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ └── robots.txt ├── src │ ├── ApolloClient.js │ ├── App.css │ ├── App.js │ ├── App.test.js │ ├── components │ │ └── Home.js │ ├── index.css │ ├── index.js │ ├── logo.svg │ └── serviceWorker.js └── yarn.lock ├── graphiql.gif ├── graphql-meetup-tweet.png ├── package-lock.json ├── package.json ├── schema.js └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.log 3 | npm-debug.log 4 | yarn-error.log 5 | .DS_Store 6 | build 7 | node_modules 8 | dist 9 | .cache 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GraphQL React Application 2 | 3 | ## Description :clipboard: 4 | > A GraphQL workshop to learn GraphQL implementations in JavaScript 5 | 6 | ## GraphQL App DEMO :video_camera: 7 | 8 | ## Built With :zap: 9 | 1. GraphQL 10 | 2. React 11 | 3. Apollo Client 12 | 4. External dependency [wp-graphql](https://github.com/wp-graphql/wp-graphql) ( for `graphql-with-wordpress` branch ) 13 | 5. Express 14 | 6. Node js 15 | 7. create-react-app ( uses Babel and Webpack ) 16 | 17 | ## Details :scroll: 18 | 19 | 1. :arrow_right: We have set up our backend server in node and express app ( `localhost:5000/graphql` ) in `server.js`. 20 | 2. :arrow_right: React application is set up using [create-react-app](https://github.com/facebook/create-react-app) ( that runs webpack-dev-server for the frontend on `localhost:3000` ) 21 | 3. :arrow_right: The schema and graphQl queries are created in `schema.js` 22 | 4. :arrow_right: We have used [wp-graphql](https://github.com/wp-graphql/wp-graphql) WordPress plugin that brings the power of GraphQL to WordPress. 23 | 5. :arrow_right: GraphiQL playground is available on `localhost:5000/graphql`. 24 | 6. :arrow_right: We have used Apollo Client to build UI in React that fetches data from GraphQL. Apollo client help us create a query and binds our React component with the query, so that when component renders, and handles any queries to GraphQl server and return the results. 25 | 7. :arrow_right: We import `` from `apollo-boost` and create a new object called `client` and pass the url for our GraphQL endpoint into this object. 26 | 8. :arrow_right: We wrap our main React Component `` and apollo `client` is then passed to these components, so that the results of your query can be passed to your components. 27 | 9. :arrow_right: The `graphql-tag` ( graphQl query parsing utility ) is installed and `gpl` is imported from it. The `gpl` parses GraphQL query strings into the standard GraphQL AST. 28 | 10. :arrow_right: Use `gpl` to query the data in front react app, from the schema we have create in our node application in backend. 29 | 11. :arrow_right: We have displayed all the data received as response of the query on home page( `Home.js` ). 30 | 31 | ## GraphiQL Playground DEMO :video_camera: 32 | ![](graphiql.gif) 33 | 34 | 35 | ## Installation :wrench: 36 | 37 | 1. Clone this repo by running `git clone https://github.com/imranhsayed/graphql-workshop` 38 | 2. `npm install` 39 | 3. `npm run dev` 40 | 41 | ## Branches Information: 42 | 43 | 1. * [master](https://github.com/imranhsayed/graphql-workshop) Creates a GraphQL server using express and nodejs and adds an endpoint at `localhost:5000/graphql`, where you can send all your query request. 44 | * It has Apollo client with React on front end . 45 | 2. [graphql-with-wordpress](https://github.com/imranhsayed/graphql-workshop/tree/graphql-with-wordpress) uses GraphQL server created by [wp-graphql](https://github.com/wp-graphql/wp-graphql) plugin on your WordPress install and React in frontend. More info is in that branch's read me. 46 | 47 | 48 | 49 | ## Plugins for GraphQL with WordPress :electric_plug: 50 | 51 | For `graphql-with-wordpress` branch Clone these repositories into plugin directory of your WordPress Install and activate them from WordPress dashboard. 52 | 53 | 1. [wp-graphql](https://github.com/wp-graphql/wp-graphql) 54 | 2. [wp-graphiql](https://github.com/wp-graphql/wp-graphiql) 55 | 56 | ## Instructions :point_right: 57 | 58 | * `Graphiql` is a tool that we can use as a client to make request to our server. 59 | * Graph QL endpoint where you can send your query request: `localhost:5000/graphql` 60 | 61 | ## Common Commands :computer: 62 | 63 | You can run these commands from root directory. 64 | 65 | 1. `npm run dev` runs webpack-dev-server for frontend on port 3000 in watch mode and backend server on port 5000. ( Uses concurrently package to run the two servers together, 66 | so the below two command are not required to run if you run this ). 67 | 2. `npm run dev:client` starts webpack dev server for React on port `5000` 68 | 3. `npm run dev:server` starts nodejs server on port `3000` 69 | 4. `npm run prod:client` runs the build for production for client. 70 | 71 | ## Useful Links :link: 72 | 73 | 1. [Express GraphQL github link](https://github.com/graphql/express-graphql) 74 | 2. [Apollo GraphQL](https://www.apollographql.com/docs/react/) 75 | 76 | Apollo Client is way to use GraphQL to build client applications. It helps you build a UI that fetches data with GraphQL, and can be used with any JavaScript front-end. 77 | When two components need the same data. If an action triggers an update on update, the second one won’t be updated . Apollo solves this using `reactive cache` feature. 78 | Its main job is fetch some GraphQL queries and keep them in sync with one another 79 | 80 | ## Thank you Note 🙏 81 | 82 | I would like to thank 🙏 everyone who attended the [GraphQL with React and WordPress Meet](https://www.meetup.com/Pune-WordPress-Knowledge-Exchange/events/264252479/) up on Sep 21, 2019. 83 | The session wouldn't have been so enjoyable and fruitful without your presence.😊 84 | 85 | 📹[MeetUp Highlights](http://bit.ly/2kXSGJF) 86 | 87 | 📷[Twitter Post with Snaps](https://twitter.com/imranhsayed/status/1175398297579638785?s=20) 88 | 89 | ![](graphql-meetup-tweet.png) 90 | 91 | ## License 92 | 93 | [![License](http://img.shields.io/:license-mit-blue.svg?style=flat-square)](http://badges.mit-license.org) 94 | 95 | - **[MIT license](http://opensource.org/licenses/mit-license.php)** 96 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@apollo/react-hooks": "^3.1.1", 7 | "@babel/runtime": "^7.6.0", 8 | "apollo-boost": "^0.4.4", 9 | "graphql": "^14.5.6", 10 | "react": "^16.9.0", 11 | "react-dom": "^16.9.0", 12 | "react-scripts": "5.0.1" 13 | }, 14 | "scripts": { 15 | "start": "react-scripts start", 16 | "build": "react-scripts build", 17 | "test": "react-scripts test", 18 | "eject": "react-scripts eject" 19 | }, 20 | "eslintConfig": { 21 | "extends": "react-app" 22 | }, 23 | "browserslist": { 24 | "production": [ 25 | ">0.2%", 26 | "not dead", 27 | "not op_mini all" 28 | ], 29 | "development": [ 30 | "last 1 chrome version", 31 | "last 1 firefox version", 32 | "last 1 safari version" 33 | ] 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imranhsayed/graphql-workshop/8a1479b01650038bd1603b6ee9d0d0f7f5a96f57/client/public/favicon.ico -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | GraphQL Workshop 13 | 14 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /client/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | -------------------------------------------------------------------------------- /client/src/ApolloClient.js: -------------------------------------------------------------------------------- 1 | import ApolloClient from 'apollo-boost'; 2 | 3 | const client = new ApolloClient({ 4 | uri: 'http://localhost:5000/graphql', 5 | }); 6 | 7 | export default client; 8 | -------------------------------------------------------------------------------- /client/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | animation: App-logo-spin infinite 20s linear; 7 | height: 40vmin; 8 | pointer-events: none; 9 | } 10 | 11 | .App-header { 12 | background-color: #282c34; 13 | min-height: 100vh; 14 | display: flex; 15 | flex-direction: column; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: calc(10px + 2vmin); 19 | color: white; 20 | } 21 | 22 | .App-link { 23 | color: #61dafb; 24 | } 25 | 26 | @keyframes App-logo-spin { 27 | from { 28 | transform: rotate(0deg); 29 | } 30 | to { 31 | transform: rotate(360deg); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /client/src/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './App.css'; 3 | 4 | import client from './ApolloClient'; 5 | import { ApolloProvider } from '@apollo/react-hooks'; 6 | import { Home } from "./components/Home"; 7 | 8 | 9 | const App = () => ( 10 | 11 | 12 | 13 | ); 14 | 15 | export default App; 16 | -------------------------------------------------------------------------------- /client/src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /client/src/components/Home.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { useQuery } from "@apollo/react-hooks"; 3 | import { gql } from "apollo-boost"; 4 | 5 | 6 | const postQuery = gql` 7 | { 8 | post( id: "1" ) { 9 | title 10 | content 11 | } 12 | } 13 | `; 14 | 15 | export const Home = () => { 16 | const { loading, error, data } = useQuery( postQuery ); 17 | 18 | if ( loading ) { 19 | return

Loading...

20 | } 21 | if ( error ) { 22 | return

Error

23 | } 24 | return ( 25 |
26 |
{ data.post.title }
27 |
28 |

{ data.post.content }

29 |
30 |
31 | ) 32 | }; 33 | -------------------------------------------------------------------------------- /client/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | 6 | ReactDOM.render(, document.getElementById('root')); 7 | -------------------------------------------------------------------------------- /client/src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /client/src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read https://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.1/8 is considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl) 104 | .then(response => { 105 | // Ensure service worker exists, and that we really are getting a JS file. 106 | const contentType = response.headers.get('content-type'); 107 | if ( 108 | response.status === 404 || 109 | (contentType != null && contentType.indexOf('javascript') === -1) 110 | ) { 111 | // No service worker found. Probably a different app. Reload the page. 112 | navigator.serviceWorker.ready.then(registration => { 113 | registration.unregister().then(() => { 114 | window.location.reload(); 115 | }); 116 | }); 117 | } else { 118 | // Service worker found. Proceed as normal. 119 | registerValidSW(swUrl, config); 120 | } 121 | }) 122 | .catch(() => { 123 | console.log( 124 | 'No internet connection found. App is running in offline mode.' 125 | ); 126 | }); 127 | } 128 | 129 | export function unregister() { 130 | if ('serviceWorker' in navigator) { 131 | navigator.serviceWorker.ready.then(registration => { 132 | registration.unregister(); 133 | }); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /graphiql.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imranhsayed/graphql-workshop/8a1479b01650038bd1603b6ee9d0d0f7f5a96f57/graphiql.gif -------------------------------------------------------------------------------- /graphql-meetup-tweet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imranhsayed/graphql-workshop/8a1479b01650038bd1603b6ee9d0d0f7f5a96f57/graphql-meetup-tweet.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphql-workshop", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "requires": { 12 | "mime-types": "~2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "ansi-regex": { 17 | "version": "3.0.0", 18 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 19 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 20 | "dev": true 21 | }, 22 | "ansi-styles": { 23 | "version": "3.2.1", 24 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 25 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 26 | "dev": true, 27 | "requires": { 28 | "color-convert": "^1.9.0" 29 | } 30 | }, 31 | "array-flatten": { 32 | "version": "1.1.1", 33 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 34 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 35 | }, 36 | "body-parser": { 37 | "version": "1.19.0", 38 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 39 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 40 | "requires": { 41 | "bytes": "3.1.0", 42 | "content-type": "~1.0.4", 43 | "debug": "2.6.9", 44 | "depd": "~1.1.2", 45 | "http-errors": "1.7.2", 46 | "iconv-lite": "0.4.24", 47 | "on-finished": "~2.3.0", 48 | "qs": "6.7.0", 49 | "raw-body": "2.4.0", 50 | "type-is": "~1.6.17" 51 | } 52 | }, 53 | "bytes": { 54 | "version": "3.1.0", 55 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 56 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 57 | }, 58 | "camelcase": { 59 | "version": "5.3.1", 60 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 61 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 62 | "dev": true 63 | }, 64 | "chalk": { 65 | "version": "2.4.2", 66 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 67 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 68 | "dev": true, 69 | "requires": { 70 | "ansi-styles": "^3.2.1", 71 | "escape-string-regexp": "^1.0.5", 72 | "supports-color": "^5.3.0" 73 | }, 74 | "dependencies": { 75 | "supports-color": { 76 | "version": "5.5.0", 77 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 78 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 79 | "dev": true, 80 | "requires": { 81 | "has-flag": "^3.0.0" 82 | } 83 | } 84 | } 85 | }, 86 | "cliui": { 87 | "version": "4.1.0", 88 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 89 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 90 | "dev": true, 91 | "requires": { 92 | "string-width": "^2.1.1", 93 | "strip-ansi": "^4.0.0", 94 | "wrap-ansi": "^2.0.0" 95 | } 96 | }, 97 | "code-point-at": { 98 | "version": "1.1.0", 99 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 100 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 101 | "dev": true 102 | }, 103 | "color-convert": { 104 | "version": "1.9.3", 105 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 106 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 107 | "dev": true, 108 | "requires": { 109 | "color-name": "1.1.3" 110 | } 111 | }, 112 | "color-name": { 113 | "version": "1.1.3", 114 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 115 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 116 | "dev": true 117 | }, 118 | "concurrently": { 119 | "version": "4.1.2", 120 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", 121 | "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", 122 | "dev": true, 123 | "requires": { 124 | "chalk": "^2.4.2", 125 | "date-fns": "^1.30.1", 126 | "lodash": "^4.17.15", 127 | "read-pkg": "^4.0.1", 128 | "rxjs": "^6.5.2", 129 | "spawn-command": "^0.0.2-1", 130 | "supports-color": "^4.5.0", 131 | "tree-kill": "^1.2.1", 132 | "yargs": "^12.0.5" 133 | } 134 | }, 135 | "content-disposition": { 136 | "version": "0.5.3", 137 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 138 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 139 | "requires": { 140 | "safe-buffer": "5.1.2" 141 | } 142 | }, 143 | "content-type": { 144 | "version": "1.0.4", 145 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 146 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 147 | }, 148 | "cookie": { 149 | "version": "0.4.0", 150 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 151 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 152 | }, 153 | "cookie-signature": { 154 | "version": "1.0.6", 155 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 156 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 157 | }, 158 | "cors": { 159 | "version": "2.8.5", 160 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 161 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 162 | "requires": { 163 | "object-assign": "^4", 164 | "vary": "^1" 165 | } 166 | }, 167 | "cross-spawn": { 168 | "version": "6.0.5", 169 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 170 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 171 | "dev": true, 172 | "requires": { 173 | "nice-try": "^1.0.4", 174 | "path-key": "^2.0.1", 175 | "semver": "^5.5.0", 176 | "shebang-command": "^1.2.0", 177 | "which": "^1.2.9" 178 | } 179 | }, 180 | "date-fns": { 181 | "version": "1.30.1", 182 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", 183 | "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", 184 | "dev": true 185 | }, 186 | "debug": { 187 | "version": "2.6.9", 188 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 189 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 190 | "requires": { 191 | "ms": "2.0.0" 192 | } 193 | }, 194 | "decamelize": { 195 | "version": "1.2.0", 196 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 197 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 198 | "dev": true 199 | }, 200 | "depd": { 201 | "version": "1.1.2", 202 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 203 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 204 | }, 205 | "destroy": { 206 | "version": "1.0.4", 207 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 208 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 209 | }, 210 | "ee-first": { 211 | "version": "1.1.1", 212 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 213 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 214 | }, 215 | "encodeurl": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 218 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 219 | }, 220 | "end-of-stream": { 221 | "version": "1.4.1", 222 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 223 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 224 | "dev": true, 225 | "requires": { 226 | "once": "^1.4.0" 227 | } 228 | }, 229 | "error-ex": { 230 | "version": "1.3.2", 231 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 232 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 233 | "dev": true, 234 | "requires": { 235 | "is-arrayish": "^0.2.1" 236 | } 237 | }, 238 | "escape-html": { 239 | "version": "1.0.3", 240 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 241 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 242 | }, 243 | "escape-string-regexp": { 244 | "version": "1.0.5", 245 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 246 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 247 | "dev": true 248 | }, 249 | "etag": { 250 | "version": "1.8.1", 251 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 252 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 253 | }, 254 | "execa": { 255 | "version": "1.0.0", 256 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 257 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 258 | "dev": true, 259 | "requires": { 260 | "cross-spawn": "^6.0.0", 261 | "get-stream": "^4.0.0", 262 | "is-stream": "^1.1.0", 263 | "npm-run-path": "^2.0.0", 264 | "p-finally": "^1.0.0", 265 | "signal-exit": "^3.0.0", 266 | "strip-eof": "^1.0.0" 267 | } 268 | }, 269 | "express": { 270 | "version": "4.17.1", 271 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 272 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 273 | "requires": { 274 | "accepts": "~1.3.7", 275 | "array-flatten": "1.1.1", 276 | "body-parser": "1.19.0", 277 | "content-disposition": "0.5.3", 278 | "content-type": "~1.0.4", 279 | "cookie": "0.4.0", 280 | "cookie-signature": "1.0.6", 281 | "debug": "2.6.9", 282 | "depd": "~1.1.2", 283 | "encodeurl": "~1.0.2", 284 | "escape-html": "~1.0.3", 285 | "etag": "~1.8.1", 286 | "finalhandler": "~1.1.2", 287 | "fresh": "0.5.2", 288 | "merge-descriptors": "1.0.1", 289 | "methods": "~1.1.2", 290 | "on-finished": "~2.3.0", 291 | "parseurl": "~1.3.3", 292 | "path-to-regexp": "0.1.7", 293 | "proxy-addr": "~2.0.5", 294 | "qs": "6.7.0", 295 | "range-parser": "~1.2.1", 296 | "safe-buffer": "5.1.2", 297 | "send": "0.17.1", 298 | "serve-static": "1.14.1", 299 | "setprototypeof": "1.1.1", 300 | "statuses": "~1.5.0", 301 | "type-is": "~1.6.18", 302 | "utils-merge": "1.0.1", 303 | "vary": "~1.1.2" 304 | } 305 | }, 306 | "express-graphql": { 307 | "version": "0.9.0", 308 | "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.9.0.tgz", 309 | "integrity": "sha512-wccd9Lb6oeJ8yHpUs/8LcnGjFUUQYmOG9A5BNLybRdCzGw0PeUrtBxsIR8bfiur6uSW4OvPkVDoYH06z6/N9+w==", 310 | "requires": { 311 | "accepts": "^1.3.7", 312 | "content-type": "^1.0.4", 313 | "http-errors": "^1.7.3", 314 | "raw-body": "^2.4.1" 315 | }, 316 | "dependencies": { 317 | "http-errors": { 318 | "version": "1.7.3", 319 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 320 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 321 | "requires": { 322 | "depd": "~1.1.2", 323 | "inherits": "2.0.4", 324 | "setprototypeof": "1.1.1", 325 | "statuses": ">= 1.5.0 < 2", 326 | "toidentifier": "1.0.0" 327 | } 328 | }, 329 | "inherits": { 330 | "version": "2.0.4", 331 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 332 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 333 | }, 334 | "raw-body": { 335 | "version": "2.4.1", 336 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", 337 | "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", 338 | "requires": { 339 | "bytes": "3.1.0", 340 | "http-errors": "1.7.3", 341 | "iconv-lite": "0.4.24", 342 | "unpipe": "1.0.0" 343 | } 344 | } 345 | } 346 | }, 347 | "finalhandler": { 348 | "version": "1.1.2", 349 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 350 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 351 | "requires": { 352 | "debug": "2.6.9", 353 | "encodeurl": "~1.0.2", 354 | "escape-html": "~1.0.3", 355 | "on-finished": "~2.3.0", 356 | "parseurl": "~1.3.3", 357 | "statuses": "~1.5.0", 358 | "unpipe": "~1.0.0" 359 | } 360 | }, 361 | "find-up": { 362 | "version": "3.0.0", 363 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 364 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 365 | "dev": true, 366 | "requires": { 367 | "locate-path": "^3.0.0" 368 | } 369 | }, 370 | "forwarded": { 371 | "version": "0.1.2", 372 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 373 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 374 | }, 375 | "fresh": { 376 | "version": "0.5.2", 377 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 378 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 379 | }, 380 | "get-caller-file": { 381 | "version": "1.0.3", 382 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 383 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", 384 | "dev": true 385 | }, 386 | "get-stream": { 387 | "version": "4.1.0", 388 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 389 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 390 | "dev": true, 391 | "requires": { 392 | "pump": "^3.0.0" 393 | } 394 | }, 395 | "graphql": { 396 | "version": "14.5.5", 397 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.5.tgz", 398 | "integrity": "sha512-Ly+hS+HY+gHN79ee7KTP25ZLUJJTMfpOMoDa3LSRZNFUh7w0CLAAgzuyOpOZQFAPWFwooEuakixh0EbVe+vqAA==", 399 | "requires": { 400 | "iterall": "^1.2.2" 401 | } 402 | }, 403 | "has-flag": { 404 | "version": "3.0.0", 405 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 406 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 407 | "dev": true 408 | }, 409 | "hosted-git-info": { 410 | "version": "2.8.9", 411 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 412 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 413 | "dev": true 414 | }, 415 | "http-errors": { 416 | "version": "1.7.2", 417 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 418 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 419 | "requires": { 420 | "depd": "~1.1.2", 421 | "inherits": "2.0.3", 422 | "setprototypeof": "1.1.1", 423 | "statuses": ">= 1.5.0 < 2", 424 | "toidentifier": "1.0.0" 425 | } 426 | }, 427 | "iconv-lite": { 428 | "version": "0.4.24", 429 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 430 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 431 | "requires": { 432 | "safer-buffer": ">= 2.1.2 < 3" 433 | } 434 | }, 435 | "inherits": { 436 | "version": "2.0.3", 437 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 438 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 439 | }, 440 | "invert-kv": { 441 | "version": "2.0.0", 442 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 443 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", 444 | "dev": true 445 | }, 446 | "ipaddr.js": { 447 | "version": "1.9.0", 448 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", 449 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" 450 | }, 451 | "is-arrayish": { 452 | "version": "0.2.1", 453 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 454 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 455 | "dev": true 456 | }, 457 | "is-fullwidth-code-point": { 458 | "version": "2.0.0", 459 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 460 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 461 | "dev": true 462 | }, 463 | "is-stream": { 464 | "version": "1.1.0", 465 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 466 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 467 | "dev": true 468 | }, 469 | "isexe": { 470 | "version": "2.0.0", 471 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 472 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 473 | "dev": true 474 | }, 475 | "iterall": { 476 | "version": "1.2.2", 477 | "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", 478 | "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" 479 | }, 480 | "json-parse-better-errors": { 481 | "version": "1.0.2", 482 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 483 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 484 | "dev": true 485 | }, 486 | "lcid": { 487 | "version": "2.0.0", 488 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 489 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 490 | "dev": true, 491 | "requires": { 492 | "invert-kv": "^2.0.0" 493 | } 494 | }, 495 | "locate-path": { 496 | "version": "3.0.0", 497 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 498 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 499 | "dev": true, 500 | "requires": { 501 | "p-locate": "^3.0.0", 502 | "path-exists": "^3.0.0" 503 | } 504 | }, 505 | "lodash": { 506 | "version": "4.17.21", 507 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 508 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 509 | "dev": true 510 | }, 511 | "map-age-cleaner": { 512 | "version": "0.1.3", 513 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 514 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 515 | "dev": true, 516 | "requires": { 517 | "p-defer": "^1.0.0" 518 | } 519 | }, 520 | "media-typer": { 521 | "version": "0.3.0", 522 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 523 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 524 | }, 525 | "mem": { 526 | "version": "4.3.0", 527 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", 528 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", 529 | "dev": true, 530 | "requires": { 531 | "map-age-cleaner": "^0.1.1", 532 | "mimic-fn": "^2.0.0", 533 | "p-is-promise": "^2.0.0" 534 | } 535 | }, 536 | "merge-descriptors": { 537 | "version": "1.0.1", 538 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 539 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 540 | }, 541 | "methods": { 542 | "version": "1.1.2", 543 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 544 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 545 | }, 546 | "mime": { 547 | "version": "1.6.0", 548 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 549 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 550 | }, 551 | "mime-db": { 552 | "version": "1.40.0", 553 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 554 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 555 | }, 556 | "mime-types": { 557 | "version": "2.1.24", 558 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 559 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 560 | "requires": { 561 | "mime-db": "1.40.0" 562 | } 563 | }, 564 | "mimic-fn": { 565 | "version": "2.1.0", 566 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 567 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 568 | "dev": true 569 | }, 570 | "ms": { 571 | "version": "2.0.0", 572 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 573 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 574 | }, 575 | "negotiator": { 576 | "version": "0.6.2", 577 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 578 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 579 | }, 580 | "nice-try": { 581 | "version": "1.0.5", 582 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 583 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 584 | "dev": true 585 | }, 586 | "normalize-package-data": { 587 | "version": "2.5.0", 588 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 589 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 590 | "dev": true, 591 | "requires": { 592 | "hosted-git-info": "^2.1.4", 593 | "resolve": "^1.10.0", 594 | "semver": "2 || 3 || 4 || 5", 595 | "validate-npm-package-license": "^3.0.1" 596 | } 597 | }, 598 | "npm-run-path": { 599 | "version": "2.0.2", 600 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 601 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 602 | "dev": true, 603 | "requires": { 604 | "path-key": "^2.0.0" 605 | } 606 | }, 607 | "number-is-nan": { 608 | "version": "1.0.1", 609 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 610 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 611 | "dev": true 612 | }, 613 | "object-assign": { 614 | "version": "4.1.1", 615 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 616 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 617 | }, 618 | "on-finished": { 619 | "version": "2.3.0", 620 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 621 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 622 | "requires": { 623 | "ee-first": "1.1.1" 624 | } 625 | }, 626 | "once": { 627 | "version": "1.4.0", 628 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 629 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 630 | "dev": true, 631 | "requires": { 632 | "wrappy": "1" 633 | } 634 | }, 635 | "os-locale": { 636 | "version": "3.1.0", 637 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 638 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 639 | "dev": true, 640 | "requires": { 641 | "execa": "^1.0.0", 642 | "lcid": "^2.0.0", 643 | "mem": "^4.0.0" 644 | } 645 | }, 646 | "p-defer": { 647 | "version": "1.0.0", 648 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 649 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", 650 | "dev": true 651 | }, 652 | "p-finally": { 653 | "version": "1.0.0", 654 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 655 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 656 | "dev": true 657 | }, 658 | "p-is-promise": { 659 | "version": "2.1.0", 660 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", 661 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", 662 | "dev": true 663 | }, 664 | "p-limit": { 665 | "version": "2.2.1", 666 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 667 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 668 | "dev": true, 669 | "requires": { 670 | "p-try": "^2.0.0" 671 | } 672 | }, 673 | "p-locate": { 674 | "version": "3.0.0", 675 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 676 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 677 | "dev": true, 678 | "requires": { 679 | "p-limit": "^2.0.0" 680 | } 681 | }, 682 | "p-try": { 683 | "version": "2.2.0", 684 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 685 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 686 | "dev": true 687 | }, 688 | "parse-json": { 689 | "version": "4.0.0", 690 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 691 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 692 | "dev": true, 693 | "requires": { 694 | "error-ex": "^1.3.1", 695 | "json-parse-better-errors": "^1.0.1" 696 | } 697 | }, 698 | "parseurl": { 699 | "version": "1.3.3", 700 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 701 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 702 | }, 703 | "path-exists": { 704 | "version": "3.0.0", 705 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 706 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 707 | "dev": true 708 | }, 709 | "path-key": { 710 | "version": "2.0.1", 711 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 712 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 713 | "dev": true 714 | }, 715 | "path-parse": { 716 | "version": "1.0.7", 717 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 718 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 719 | "dev": true 720 | }, 721 | "path-to-regexp": { 722 | "version": "0.1.7", 723 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 724 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 725 | }, 726 | "pify": { 727 | "version": "3.0.0", 728 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 729 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 730 | "dev": true 731 | }, 732 | "proxy-addr": { 733 | "version": "2.0.5", 734 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", 735 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", 736 | "requires": { 737 | "forwarded": "~0.1.2", 738 | "ipaddr.js": "1.9.0" 739 | } 740 | }, 741 | "pump": { 742 | "version": "3.0.0", 743 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 744 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 745 | "dev": true, 746 | "requires": { 747 | "end-of-stream": "^1.1.0", 748 | "once": "^1.3.1" 749 | } 750 | }, 751 | "qs": { 752 | "version": "6.7.0", 753 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 754 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 755 | }, 756 | "range-parser": { 757 | "version": "1.2.1", 758 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 759 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 760 | }, 761 | "raw-body": { 762 | "version": "2.4.0", 763 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 764 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 765 | "requires": { 766 | "bytes": "3.1.0", 767 | "http-errors": "1.7.2", 768 | "iconv-lite": "0.4.24", 769 | "unpipe": "1.0.0" 770 | } 771 | }, 772 | "read-pkg": { 773 | "version": "4.0.1", 774 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", 775 | "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", 776 | "dev": true, 777 | "requires": { 778 | "normalize-package-data": "^2.3.2", 779 | "parse-json": "^4.0.0", 780 | "pify": "^3.0.0" 781 | } 782 | }, 783 | "require-directory": { 784 | "version": "2.1.1", 785 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 786 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 787 | "dev": true 788 | }, 789 | "require-main-filename": { 790 | "version": "1.0.1", 791 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 792 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", 793 | "dev": true 794 | }, 795 | "resolve": { 796 | "version": "1.12.0", 797 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 798 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 799 | "dev": true, 800 | "requires": { 801 | "path-parse": "^1.0.6" 802 | } 803 | }, 804 | "rxjs": { 805 | "version": "6.5.3", 806 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", 807 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", 808 | "dev": true, 809 | "requires": { 810 | "tslib": "^1.9.0" 811 | } 812 | }, 813 | "safe-buffer": { 814 | "version": "5.1.2", 815 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 816 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 817 | }, 818 | "safer-buffer": { 819 | "version": "2.1.2", 820 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 821 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 822 | }, 823 | "semver": { 824 | "version": "5.7.1", 825 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 826 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 827 | "dev": true 828 | }, 829 | "send": { 830 | "version": "0.17.1", 831 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 832 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 833 | "requires": { 834 | "debug": "2.6.9", 835 | "depd": "~1.1.2", 836 | "destroy": "~1.0.4", 837 | "encodeurl": "~1.0.2", 838 | "escape-html": "~1.0.3", 839 | "etag": "~1.8.1", 840 | "fresh": "0.5.2", 841 | "http-errors": "~1.7.2", 842 | "mime": "1.6.0", 843 | "ms": "2.1.1", 844 | "on-finished": "~2.3.0", 845 | "range-parser": "~1.2.1", 846 | "statuses": "~1.5.0" 847 | }, 848 | "dependencies": { 849 | "ms": { 850 | "version": "2.1.1", 851 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 852 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 853 | } 854 | } 855 | }, 856 | "serve-static": { 857 | "version": "1.14.1", 858 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 859 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 860 | "requires": { 861 | "encodeurl": "~1.0.2", 862 | "escape-html": "~1.0.3", 863 | "parseurl": "~1.3.3", 864 | "send": "0.17.1" 865 | } 866 | }, 867 | "set-blocking": { 868 | "version": "2.0.0", 869 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 870 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 871 | "dev": true 872 | }, 873 | "setprototypeof": { 874 | "version": "1.1.1", 875 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 876 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 877 | }, 878 | "shebang-command": { 879 | "version": "1.2.0", 880 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 881 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 882 | "dev": true, 883 | "requires": { 884 | "shebang-regex": "^1.0.0" 885 | } 886 | }, 887 | "shebang-regex": { 888 | "version": "1.0.0", 889 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 890 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 891 | "dev": true 892 | }, 893 | "signal-exit": { 894 | "version": "3.0.2", 895 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 896 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 897 | "dev": true 898 | }, 899 | "spawn-command": { 900 | "version": "0.0.2-1", 901 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", 902 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", 903 | "dev": true 904 | }, 905 | "spdx-correct": { 906 | "version": "3.1.0", 907 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 908 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 909 | "dev": true, 910 | "requires": { 911 | "spdx-expression-parse": "^3.0.0", 912 | "spdx-license-ids": "^3.0.0" 913 | } 914 | }, 915 | "spdx-exceptions": { 916 | "version": "2.2.0", 917 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 918 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 919 | "dev": true 920 | }, 921 | "spdx-expression-parse": { 922 | "version": "3.0.0", 923 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 924 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 925 | "dev": true, 926 | "requires": { 927 | "spdx-exceptions": "^2.1.0", 928 | "spdx-license-ids": "^3.0.0" 929 | } 930 | }, 931 | "spdx-license-ids": { 932 | "version": "3.0.5", 933 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 934 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 935 | "dev": true 936 | }, 937 | "statuses": { 938 | "version": "1.5.0", 939 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 940 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 941 | }, 942 | "string-width": { 943 | "version": "2.1.1", 944 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 945 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 946 | "dev": true, 947 | "requires": { 948 | "is-fullwidth-code-point": "^2.0.0", 949 | "strip-ansi": "^4.0.0" 950 | } 951 | }, 952 | "strip-ansi": { 953 | "version": "4.0.0", 954 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 955 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 956 | "dev": true, 957 | "requires": { 958 | "ansi-regex": "^3.0.0" 959 | } 960 | }, 961 | "strip-eof": { 962 | "version": "1.0.0", 963 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 964 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 965 | "dev": true 966 | }, 967 | "supports-color": { 968 | "version": "4.5.0", 969 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 970 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 971 | "dev": true, 972 | "requires": { 973 | "has-flag": "^2.0.0" 974 | }, 975 | "dependencies": { 976 | "has-flag": { 977 | "version": "2.0.0", 978 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 979 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 980 | "dev": true 981 | } 982 | } 983 | }, 984 | "toidentifier": { 985 | "version": "1.0.0", 986 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 987 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 988 | }, 989 | "tree-kill": { 990 | "version": "1.2.2", 991 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 992 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 993 | "dev": true 994 | }, 995 | "tslib": { 996 | "version": "1.10.0", 997 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 998 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 999 | "dev": true 1000 | }, 1001 | "type-is": { 1002 | "version": "1.6.18", 1003 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1004 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1005 | "requires": { 1006 | "media-typer": "0.3.0", 1007 | "mime-types": "~2.1.24" 1008 | } 1009 | }, 1010 | "unpipe": { 1011 | "version": "1.0.0", 1012 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1013 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1014 | }, 1015 | "utils-merge": { 1016 | "version": "1.0.1", 1017 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1018 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1019 | }, 1020 | "validate-npm-package-license": { 1021 | "version": "3.0.4", 1022 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1023 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1024 | "dev": true, 1025 | "requires": { 1026 | "spdx-correct": "^3.0.0", 1027 | "spdx-expression-parse": "^3.0.0" 1028 | } 1029 | }, 1030 | "vary": { 1031 | "version": "1.1.2", 1032 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1033 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1034 | }, 1035 | "which": { 1036 | "version": "1.3.1", 1037 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1038 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1039 | "dev": true, 1040 | "requires": { 1041 | "isexe": "^2.0.0" 1042 | } 1043 | }, 1044 | "which-module": { 1045 | "version": "2.0.0", 1046 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1047 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1048 | "dev": true 1049 | }, 1050 | "wrap-ansi": { 1051 | "version": "2.1.0", 1052 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 1053 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 1054 | "dev": true, 1055 | "requires": { 1056 | "string-width": "^1.0.1", 1057 | "strip-ansi": "^3.0.1" 1058 | }, 1059 | "dependencies": { 1060 | "ansi-regex": { 1061 | "version": "2.1.1", 1062 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1063 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1064 | "dev": true 1065 | }, 1066 | "is-fullwidth-code-point": { 1067 | "version": "1.0.0", 1068 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1069 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1070 | "dev": true, 1071 | "requires": { 1072 | "number-is-nan": "^1.0.0" 1073 | } 1074 | }, 1075 | "string-width": { 1076 | "version": "1.0.2", 1077 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1078 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1079 | "dev": true, 1080 | "requires": { 1081 | "code-point-at": "^1.0.0", 1082 | "is-fullwidth-code-point": "^1.0.0", 1083 | "strip-ansi": "^3.0.0" 1084 | } 1085 | }, 1086 | "strip-ansi": { 1087 | "version": "3.0.1", 1088 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1089 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1090 | "dev": true, 1091 | "requires": { 1092 | "ansi-regex": "^2.0.0" 1093 | } 1094 | } 1095 | } 1096 | }, 1097 | "wrappy": { 1098 | "version": "1.0.2", 1099 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1100 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1101 | "dev": true 1102 | }, 1103 | "y18n": { 1104 | "version": "4.0.3", 1105 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 1106 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", 1107 | "dev": true 1108 | }, 1109 | "yargs": { 1110 | "version": "12.0.5", 1111 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", 1112 | "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", 1113 | "dev": true, 1114 | "requires": { 1115 | "cliui": "^4.0.0", 1116 | "decamelize": "^1.2.0", 1117 | "find-up": "^3.0.0", 1118 | "get-caller-file": "^1.0.1", 1119 | "os-locale": "^3.0.0", 1120 | "require-directory": "^2.1.1", 1121 | "require-main-filename": "^1.0.1", 1122 | "set-blocking": "^2.0.0", 1123 | "string-width": "^2.0.0", 1124 | "which-module": "^2.0.0", 1125 | "y18n": "^3.2.1 || ^4.0.0", 1126 | "yargs-parser": "^11.1.1" 1127 | } 1128 | }, 1129 | "yargs-parser": { 1130 | "version": "11.1.1", 1131 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", 1132 | "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", 1133 | "dev": true, 1134 | "requires": { 1135 | "camelcase": "^5.0.0", 1136 | "decamelize": "^1.2.0" 1137 | } 1138 | } 1139 | } 1140 | } 1141 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphql-workshop", 3 | "version": "1.0.0", 4 | "description": "A GraphQL workshop to learn GraphQL implementations in JavaScript", 5 | "main": "server.js", 6 | "scripts": { 7 | "dev:client": "npm start --prefix client", 8 | "prod:client": "npm run build --prefix client", 9 | "dev:server": "nodemon server.js", 10 | "dev": "concurrently \"npm run dev:server \" \"npm run dev:client\" " 11 | }, 12 | "keywords": [ 13 | "GraphQL", 14 | "JavaScript", 15 | "React", 16 | "WordPress", 17 | "Apollo", 18 | "Client", 19 | "Express" 20 | ], 21 | "author": "Imran Sayed", 22 | "license": "MIT", 23 | "dependencies": { 24 | "cors": "^2.8.5", 25 | "express": "^4.17.1", 26 | "express-graphql": "^0.9.0", 27 | "graphql": "^14.5.5" 28 | }, 29 | "devDependencies": { 30 | "concurrently": "^4.1.2" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /schema.js: -------------------------------------------------------------------------------- 1 | const graphql = require( 'graphql' ); 2 | 3 | const { 4 | GraphQLObjectType, 5 | GraphQLString, 6 | GraphQLSchema 7 | } = graphql; 8 | 9 | // Dummy Data 10 | const posts = [ 11 | { id: '1', title: 'Lord of the Rings', content: 'Awesome book' }, 12 | { id: '2', title: 'Avengers', content: 'Awesome movie' }, 13 | { id: '3', title: 'Harry Potter', content: 'Awesome book' }, 14 | ]; 15 | 16 | // Define an object type called 'PostType'. 17 | const PostType = new GraphQLObjectType({ 18 | name: 'Post', 19 | fields: () => ({ 20 | id: { type: GraphQLString }, 21 | title: { type: GraphQLString }, 22 | content: { type: GraphQLString } 23 | }) 24 | }); 25 | 26 | // Define RootQuery 27 | const RootQuery = new GraphQLObjectType({ 28 | name: 'RootQueryType', 29 | fields: { 30 | post: { 31 | type: PostType, 32 | args: { id: { type: GraphQLString } }, 33 | resolve( parent, args ) { 34 | // Get the data. 35 | return posts.find( post => ( post.id === args.id ) ); 36 | } 37 | } 38 | } 39 | }); 40 | 41 | module.exports = new GraphQLSchema({ 42 | query: RootQuery 43 | }) ; 44 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require( 'express' ); 2 | var cors = require('cors'); 3 | 4 | const graphqlHTTP = require( 'express-graphql' ); 5 | 6 | const schema = require( './schema' ); 7 | 8 | const app = express(); 9 | app.use( cors() ); 10 | 11 | // Add the graphqlHTTP() middleware, to interact with GraphQL 12 | app.use( '/graphql', graphqlHTTP({ 13 | schema, 14 | graphiql: true 15 | }) ); 16 | 17 | app.listen( 5000, () => { 18 | console.warn( 'Listening on port 5000' ); 19 | } ); 20 | --------------------------------------------------------------------------------