├── .gitignore ├── LICENSE ├── grapherrql-package ├── .gitignore ├── README-DEV.md ├── README.md ├── functions │ ├── index.js │ └── package.json ├── host-app │ ├── .gitignore │ ├── README.md │ ├── package-lock.json │ ├── package.json │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ └── manifest.json │ ├── server │ │ ├── package-lock.json │ │ ├── package.json │ │ └── server.js │ └── src │ │ ├── App.css │ │ ├── App.js │ │ ├── index.css │ │ ├── index.js │ │ └── reportWebVitals.js ├── package-lock.json ├── package.json ├── packageScripts │ ├── index.ts │ └── tsconfig.json ├── public │ ├── NewSpaceLogo.ico │ ├── index.html │ ├── logonowords.ico │ ├── manifest.json │ └── robots.txt ├── scripts │ ├── createPackage.js │ ├── createPackage.ts │ └── tsconfig.json ├── src │ ├── App.css │ ├── App.tsx │ ├── components │ │ ├── Header.jsx │ │ ├── HeaderItemContainer.js │ │ ├── LiveMode │ │ │ ├── ErrorResponseBox.js │ │ │ ├── LiveContext.js │ │ │ ├── Log.js │ │ │ ├── LoggerBox.js │ │ │ ├── SuccessResponseBox.js │ │ │ ├── Websocket.js │ │ │ └── styles │ │ │ │ ├── AnimatedComponent.styled.js │ │ │ │ ├── Display.styled.js │ │ │ │ ├── ErrorResponseBox.styled.js │ │ │ │ ├── Header.styled.js │ │ │ │ ├── HeaderItemContainer.styled.js │ │ │ │ ├── LMInputBox.styled.js │ │ │ │ ├── LMOutputBox.styled.js │ │ │ │ ├── LoggerBox.styled.js │ │ │ │ ├── LoggerResponse.styled.js │ │ │ │ └── SuccessResponseBox.styled.js │ │ └── SandboxMode │ │ │ ├── Context.jsx │ │ │ ├── Display.jsx │ │ │ ├── QueryBox.jsx │ │ │ ├── ResponseBox.jsx │ │ │ └── RunQuery.js │ ├── images │ │ ├── HeaderGif.gif │ │ └── HeaderRightPic.png │ ├── index.css │ └── index.tsx └── tsconfig.json └── package-lock.json /.gitignore: -------------------------------------------------------------------------------- 1 | hackernews-react-graphql/ 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License - CHANGED 2 | 3 | Copyright (c) 2022 OSLabs Beta 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /grapherrql-package/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | hackernews-react-graphql/ -------------------------------------------------------------------------------- /grapherrql-package/README-DEV.md: -------------------------------------------------------------------------------- 1 | # Integration of GraphErrQL into LOCAL HOST APP for Development 2 | 3 | ## Pre-reqs 4 | 5 | - LOCAL TESTING Host App must use Express and 'graphqlHTTP' from the "express-graphql" package. No existing support for Apollo-based Host Apps. 6 | - LOCAL TESTING Host App should live under top-level project repo. It should live in separate directory WITHIN 'grapherrql-package', which holds our project source code. Example file structure for development: 7 | GRAPHERR-QL/ 8 | ./grapherrql-package 9 | ./functions ('grapherrql-express') 10 | ./src ('grapherrql') 11 | ./(HOST APP USED FOR LOCAL TESTING) 12 |
13 |
14 | 15 | ## Add Endpoint for Accessing GraphErrQL by pointing to static files in grapherrql-package 16 | 17 | In Host App 'server.js' (or wherever your backend is defined) 18 | 19 | - Follow the integration directions in 'Host-App_README.md', with the following changes/additions: 20 | - **do not 'npm i grapherrql' since you will be pointing to the package locally, rather than via node_modules** 21 | 22 | Import needed 'grapherrql-express' utilities locally: 23 | ``` 24 | const { 25 | grapherrql, 26 | eventsHandler, 27 | serveGrapherrql, 28 | } = require('../../functions/index'); 29 | 30 | const path = require('path'); 31 | ``` 32 | 33 | Change the mounting endpoint to serve local files rather than via node_modules; 34 | change: 35 | 36 | ``` 37 | app.use(express.static(directoryPath)) 38 | app.get('/grapherrql', serveGrapherrql(PORT, defaultFilePath)); 39 | ``` 40 | 41 | to 42 | 43 | ``` 44 | app.use(express.static('../../build')); 45 | app.get('/grapherrql', serveGrapherrql(PORT)); 46 | ``` 47 | 48 | ## Using GraphErrQL with local Host App 49 | 50 | 1. Navigate to GRAPHERR-QL/grapherrql-package and run 'npm run build' to prepare the front-end code of our App for serving on Host App, or to update existing /build with new changes. 51 | 2. Navigate to your local Host App directory and start the server. 52 | 3. Open two browser terminals to; 53 | - **Host App frontend**: from here you will use the Host App, generating Queries/Mutations 54 | - **:/grapherrql**: This launches GraphErrQL, allowing you to test new Queries or capture queries Live from the Host App 55 | 56 |
57 |
58 | 59 | ## Making Changes to GraphErrQL Source Code 60 | 61 | 1. Navigate to descriptive feature branch from within **/grapherrql-package** 62 | 2. Make desired feature changes 63 | 3. Test changes with local Host App, capturing screenshots of updated functionality/styling and lack of errors if all works 64 | 4. On success, navigate to **/grapherrql-package/package.json** and update 'version' (either minor or major number change). Version **must** be incremented to allow for package update. 65 | 5. Delete existing **/build** and **/package** folders, generate new ones with 'npm run build', then 'npm run builduipackage' 66 | 6. Save, commit, and run "npm publish" from within **/grapherrql-package/package**. Ensure publishing is successful and confirm version change on npm. 67 | 7. If changes were made within /functions, update functions/package.json version number, and 'npm publish' within that directory as well. 68 | 7. Checkout /dev, 'git fetch --prune', then merge latest code with your feature branch. 69 | 8. After resolving any merge conflicts, push from your feature branch to origin/ 70 | 9. Submit PR, obtain approval, land, profit! 71 | 72 | 73 | # Walkthrough of Current Functions 74 | 75 | ## **Setup SSE Server** 76 | 77 | ### Create Stores for SSE Events and Clients 78 | 79 | ``` 80 | let SSE_Events = [] 81 | let SSE_Clients = [] 82 | ``` 83 | 84 | ### Add Event Handler 85 | 86 | The Event Handler will accept new SSE connections from clients (in our case just one, GraphErrQL), making them persistent via special HTTP headers. Sends new client all current events upon startup. Saves client info. 87 | 88 | ``` 89 | const eventsHandler = (req, res, next) => { 90 | const headers = { 91 | 'Content-Type': 'text/event-stream', 92 | Connection: 'keep-alive', 93 | 'Cache-Control': 'no-cache', 94 | }; 95 | res.writeHead(200, headers); 96 | const data = `data: ${JSON.stringify(SSE_Events)}\n\n`; 97 | res.write(data); 98 | 99 | const clientId = Date.now(); 100 | const newClient = { 101 | id: clientId, 102 | res, 103 | }; 104 | SSE_Clients.push(newClient); 105 | req.on('close', () => { 106 | console.log(`${clientId} | CONN CLOSED`); 107 | SSE_Clients = SSE_Clients.filter((client) => client.id !== clientId); 108 | }); 109 | };``` 110 | 111 | ## Provide Startup Closure Function 112 | 113 | This function is exported and called by Host App to instantiate thier GraphQL server with needed middleware added to handle SSE setup and Event forwarding to GraphErrQL. Closure is utilized to allow this function to access Host App provided arguments 'req', 'res', and 'next'. 114 | 115 | ``` 116 | const grapherrql = (gqlHTTP, graphqlSchema) => { 117 | const schema = graphqlSchema; 118 | 119 | const executeGQL = (req, res, next) => { 120 | //Called when '/graphql' receives new request from HostApp client, prior to GraphQL processing. Adds the query to those saved, then sends it to any open SSE clients. 121 | const newQuery = req.body; 122 | const newEvent = {'timestamp': Date.now(), 'query': newQuery}; 123 | SSE_Events.push(newEvent); 124 | sendEventToClients(newEvent); 125 | 126 | const executeFunc = (cb, ...args) => { 127 | cb(...args); 128 | }; 129 | 130 | const newGqlHTTP = gqlHTTP({ 131 | schema: schema, 132 | graphiql: false, 133 | customFormatErrorFn: (error) => { 134 | const newEvent = { 'timestamp': Date.now(), 'message': error }; 135 | SSE_Events.push(newEvent); 136 | sendEventToClients(newEvent); 137 | return error; 138 | }, 139 | extensions, 140 | }); 141 | 142 | executeFunc(newGqlHTTP, req, res, next); 143 | }; 144 | 145 | return async function grapherrqlMiddleware(req, res, next) { 146 | executeGQL(req, res, next); 147 | }; 148 | }; 149 | ``` 150 | 151 | ## Add Function to Send Event to Clients 152 | 153 | ``` 154 | const sendEventToClients = (newEvent) => { 155 | SSE_Clients.forEach((client) => 156 | client.res.write(`data: ${JSON.stringify(newEvent)}\n\n`) 157 | ); 158 | }; 159 | ``` 160 | 161 | ## Define GraphQL Extensions Callback 162 | 163 | This attaches to the GraphQLHTTP server and runs after Query is processed into result. We use it to store that result and forward it to SSE clients 164 | 165 | ``` 166 | const extensions = ({ result }) => { 167 | const newEvent = {'timestamp': Date.now(), 'data': result}; 168 | SSE_Events.push(newEvent); 169 | sendEventToClients(newEvent); 170 | }; 171 | ``` 172 | 173 | ## Add SSE Endpoint (FROM WITHIN HOST APP SERVER) 174 | 175 | Request to this URL from GraphErrQL will result in established SSE connection by invoking the Event Handler. The Path to the Host App endpoint will be injected into GraphErrQL html file as a Cookie and used to start the client connection. 176 | 177 | ``` 178 | app.get('/events', eventsHandler); 179 | ``` 180 | 181 | ## Add GraphQL Endpoint (FROM WITHIN HOST APP SERVER) 182 | 183 | This will serve Queries from Host App clients. Note the middleware to copy/forward the query to GraphErrQL and the included _extensions_ option 184 | 185 | ``` 186 | app.use('/graphql', grapherrql(graphqlHTTP, schema)); 187 | ``` 188 | 189 | ## Add GraphErrQL Module/Endpoint (FROM WITHIN HOST APP SERVER) 190 | 191 | This is the endpoint that will actually render GraphErrQL in the browser: 192 | 193 | ``` 194 | app.get('/grapherrql', serveGrapherrql(PORT)); 195 | `` 196 | 197 | 198 | ## File Structure 199 | 200 | - ./: Overall config files. package.json defines npm package metadata, tsconfig.json defines entry point of /src 201 | - /src: This contains the Front End files for GraphErrQL. Hosted React/HTML files are bundled, then published to npm. More on that below 202 | - /build: Result of the "npm run build" script, which joins serving files via 'react-scripts' 203 | - /package: This is where "npm publish" should be run from. /package results from the "npm run builduipackage" script, which copies /build contents to /package, and runs /scripts and /packageScripts. The only exports from here are 'defaultFilePath' and 'directoryPath' which are used by the Host App to dynamically reference the GraphErrQL files from node_modules after importing the package. 204 | - /scripts: Here, tsconfig compiles the createPackage file, which transpiles system metadata (eg 'package name', 'version') into the /package package file. It verifies the needed files exist before doing so. 205 | - /packageScripts: Here, tsconfig compiles the index file, which exports "directoryPath" as '\_\_dirname' and "defaultFilePath" for use by Host App. 206 | 207 | ## Implementation of Graph-ERR-QL into Host App 208 | 209 | - reference 'README.md' 210 | 211 | ## Resources 212 | 213 | - https://levelup.gitconnected.com/how-to-create-npm-package-out-of-react-app-7556b9b47bce -> walks through attaching a React app to a Host-App as a Middleware Endpoint 214 | -------------------------------------------------------------------------------- /grapherrql-package/README.md: -------------------------------------------------------------------------------- 1 | # **Integration of GraphErrQL at Host App** 2 | 3 | ## **Introduction** 4 | 5 | Graph-ERR-QL is a hosted endpoint package that improves GraphQL error inference. Features include: 6 | 7 | - Snappy Implementation onto existing Host-App. Be up and analyzing Mutation logs in minutes. 8 | - Sandbox Mode: Using your Host-App Schema, draft and test Queries/Mutations before you write a single line of Front-End code. 9 | - Live Mode: Our platform will capture Queries/Mutations as they arrive from a Live Front-End. Collection/Analysis of these logs all in one place. 10 | 11 | ![Alt Text](https://media.giphy.com/media/toDjawA61yu0DHKjIp/giphy.gif) 12 | 13 | 14 | ## **Functional Overview** 15 | 16 | - Navigating to **_'\:\/grapherrql'_** will cause '_grapherrql_' frontend files to be served to browser 17 | - Simultaneously, app will open a **SSE** (_Server-Sent-Events_) server, ready to accept client connection requests to the **_'\:\/events'_** endpoint 18 | - Upon initial browser rendering, **GraphErrQL** will initiate a new SSE client connection and will immediately receive any cached GraphQL queries from the Host App server. These will be logged to the main page "Live Mode" of **GraphErrQL** 19 | - Any future GraphQL queries made on the Host App client will be forwarded over the SSE connection, prior to proceeding with processing on the Host App. Results will then also be forwarded to GraphErrQL on its way back to the Host App client. At this point, GraphErrQL will render both the request and response together in **Live Mode** as a single log. 20 | 21 | ### Compatibility 22 | 23 | - Current initial release is designed only for Express-based Host Apps capable of including the 'extensions' option on the local GraphQL server. Iterating to allow for Apollo Host App integration is a focus point and we would love help! This is likely to have most of the answers: https://dev.to/seancwalsh/how-to-write-graphql-middleware-node-apollo-server-express-2h87 24 | 25 | 26 | 27 | # Using GraphErrQL on your Host App 28 | 29 | ### Install Packages 30 | 31 | ``` 32 | npm i grapherrql 33 | npm i grapherrql-express 34 | ``` 35 | 36 | ### Require Needed Exports 37 | 38 | ``` 39 | const { graphqlHTTP } = require('express-graphql'); 40 | 41 | const { directoryPath, defaultFilePath } = require ('grapherrql'); 42 | 43 | const { 44 | grapherrql, 45 | eventsHandler, 46 | serveGrapherrql, 47 | } = require('grapherrql-express'); 48 | ``` 49 | 50 | ### Call Express, Define Server Port, Setup Encoding 51 | 52 | ``` 53 | const PORT = '3001'; 54 | const app = express(); 55 | 56 | app.use(express.json()); 57 | app.use(express.urlencoded({extended: false})); 58 | ``` 59 | 60 | ### Setup Base GraphQL Endpoint 61 | 62 | ``` 63 | app.use('/graphql', grapherrql(graphqlHTTP, schema)); 64 | ``` 65 | 66 | ### Setup Events Endpoint for SSE 67 | 68 | ``` 69 | app.get('/events', eventsHandler); 70 | ``` 71 | 72 | ### Point Static File Requests to GraphErrQL node_module 73 | 74 | ``` 75 | app.use(express.static(directoryPath)) 76 | ``` 77 | 78 | ### Setup GraphErrQL Endpoint 79 | 80 | ``` 81 | app.get('/grapherrql', serveGrapherrql(PORT, defaultFilePath)); 82 | ``` 83 | 84 | ## Run it! 85 | 86 | 1. Start your Host App server. 87 | 2. Open two browser terminals to; 88 | - **Host App frontend**: from here you will use the Host App, generating Queries/Mutations 89 | - **:/grapherrql**: This launches GraphErrQL, allowing you to test new Queries or capture queries Live from the Host App 90 | -------------------------------------------------------------------------------- /grapherrql-package/functions/index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | //Store GraphQL Queries as they arrive from HostApp client. Any stored will be sent to GraphERRQL clients when they come up. 3 | let SSE_Events = []; 4 | let SSE_Clients = []; 5 | 6 | 7 | const serveGrapherrql = (serverPort, defaultFilePath) => { 8 | const eventsURI = `http://localhost:${serverPort}/events`; 9 | return (req, res) => { 10 | let data = fs.readFileSync(defaultFilePath, 'utf8'); 11 | res.send(data.replace('', eventsURI)); 12 | }; 13 | }; 14 | //Accept new SSE (Server-Sent-Events) connections from clients, makes them persistent via special HTTP headers. Sends new client all current queries upon startup. Subsequent queries will be added and forwarded by 'addQueryMiddleware'. Saves client info. Can server multiple clients simultaneously, but GraphERRQL is currently only one. 15 | const eventsHandler = (req, res, next) => { 16 | const headers = { 17 | 'Content-Type': 'text/event-stream', 18 | Connection: 'keep-alive', 19 | 'Cache-Control': 'no-cache', 20 | }; 21 | res.writeHead(200, headers); 22 | const data = `data: ${JSON.stringify(SSE_Events)}\n\n`; 23 | res.write(data); 24 | 25 | const clientId = Date.now(); 26 | const newClient = { 27 | id: clientId, 28 | res, 29 | }; 30 | SSE_Clients.push(newClient); 31 | req.on('close', () => { 32 | console.log(`${clientId} | CONN CLOSED`); 33 | SSE_Clients = SSE_Clients.filter((client) => client.id !== clientId); 34 | }); 35 | }; 36 | 37 | //Send the provided new Query (or Query response) to all currently open SSE Clients 38 | const sendEventToClients = (newEvent) => { 39 | SSE_Clients.forEach((client) => 40 | client.res.write(`data: ${JSON.stringify(newEvent)}\n\n`) 41 | ); 42 | }; 43 | 44 | //This attaches to the GraphQLHTTP server and runs AFTER Query is processed into result. We us it to store that result and forward it to SSE clients 45 | const extensions = ({ result }) => { 46 | const newEvent = { timestamp: Date.now(), data: result }; 47 | SSE_Events.push(newEvent); 48 | sendEventToClients(newEvent); 49 | }; 50 | //this is how we capture errors from graphqlHTTP and send them to grapherrql through SSE (the 'result' obj in graphqlHTTP remains undefined if an error is emmitted which is why we created functionality where we had access to the error obj being thrown from graphqlHTTP) 51 | const customFormatErrorFn = (error) => { 52 | const newEvent = { timestamp: Date.now(), message: error }; 53 | SSE_Events.push(newEvent); 54 | sendEventToClients(newEvent); 55 | return error; 56 | }; 57 | 58 | const grapherrql = (gqlHTTP, graphqlSchema) => { 59 | const schema = graphqlSchema; 60 | 61 | const executeGQL = (req, res, next) => { 62 | //Called when '/graphql' receives new request from HostApp client, prior to GraphQL processing. Adds the query to those saved, then sends it to any open SSE clients. 63 | const newQuery = req.body; 64 | const newEvent = { timestamp: Date.now(), query: newQuery }; 65 | SSE_Events.push(newEvent); 66 | sendEventToClients(newEvent); 67 | 68 | const executeFunc = (cb, ...args) => { 69 | cb(...args); 70 | }; 71 | 72 | const newGqlHTTP = gqlHTTP({ 73 | schema: schema, 74 | graphiql: false, 75 | customFormatErrorFn, 76 | extensions, 77 | }); 78 | 79 | executeFunc(newGqlHTTP, req, res, next); 80 | }; 81 | 82 | return async function grapherrqlMiddleware(req, res, next) { 83 | executeGQL(req, res, next); 84 | }; 85 | }; 86 | 87 | module.exports = { 88 | grapherrql, 89 | eventsHandler, 90 | serveGrapherrql, 91 | }; 92 | -------------------------------------------------------------------------------- /grapherrql-package/functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grapherrql-express", 3 | "version": "0.0.6", 4 | "description": "graphql Host App Utility Functions", 5 | "main": "index.js", 6 | "scripts": {}, 7 | "eslintConfig": { 8 | "extends": [] 9 | }, 10 | "browserslist": { 11 | "production": [ 12 | ">0.2%", 13 | "not dead", 14 | "not op_mini all" 15 | ], 16 | "development": [ 17 | "last 1 chrome version", 18 | "last 1 firefox version", 19 | "last 1 safari version" 20 | ] 21 | }, 22 | "devDependencies": {}, 23 | "keywords": [ 24 | "grapherrql", 25 | "grapherrql-express", 26 | "graphql error handling", 27 | "graphql error tool", 28 | "graphql", 29 | "graphql express dev tool", 30 | "graphql-express" 31 | ], 32 | "author": "pandaWhale", 33 | "license": "MIT", 34 | "dependencies": {} 35 | } 36 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/.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 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 13 | 14 | The page will reload when you make changes.\ 15 | You may also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 35 | 36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 39 | 40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "host-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.16.4", 7 | "@testing-library/react": "^13.3.0", 8 | "@testing-library/user-event": "^13.5.0", 9 | "react": "^18.2.0", 10 | "react-dom": "^18.2.0", 11 | "react-scripts": "5.0.1", 12 | "styled-components": "^5.3.5", 13 | "web-vitals": "^2.1.4" 14 | }, 15 | "scripts": { 16 | "start": "react-scripts start", 17 | "build": "react-scripts build", 18 | "test": "react-scripts test", 19 | "eject": "react-scripts eject" 20 | }, 21 | "eslintConfig": { 22 | "extends": [ 23 | "react-app", 24 | "react-app/jest" 25 | ] 26 | }, 27 | "browserslist": { 28 | "production": [ 29 | ">0.2%", 30 | "not dead", 31 | "not op_mini all" 32 | ], 33 | "development": [ 34 | "last 1 chrome version", 35 | "last 1 firefox version", 36 | "last 1 safari version" 37 | ] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/GraphErrQL/2f9a61a8b192d7f1993a2eb5813b6924af477730/grapherrql-package/host-app/public/favicon.ico -------------------------------------------------------------------------------- /grapherrql-package/host-app/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 16 | 17 | 26 | React App 27 | 28 | 29 | 30 |
31 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cors": "^2.8.5", 13 | "express": "^4.18.1", 14 | "express-graphql": "^0.12.0", 15 | "fs": "^0.0.1-security", 16 | "graphql": "^15.8.0", 17 | "nodemon": "^2.0.19", 18 | "redis": "^4.2.0" 19 | } 20 | }, 21 | "node_modules/@redis/bloom": { 22 | "version": "1.0.2", 23 | "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.0.2.tgz", 24 | "integrity": "sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw==", 25 | "peerDependencies": { 26 | "@redis/client": "^1.0.0" 27 | } 28 | }, 29 | "node_modules/@redis/client": { 30 | "version": "1.2.0", 31 | "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.2.0.tgz", 32 | "integrity": "sha512-a8Nlw5fv2EIAFJxTDSSDVUT7yfBGpZO96ybZXzQpgkyLg/dxtQ1uiwTc0EGfzg1mrPjZokeBSEGTbGXekqTNOg==", 33 | "dependencies": { 34 | "cluster-key-slot": "1.1.0", 35 | "generic-pool": "3.8.2", 36 | "yallist": "4.0.0" 37 | }, 38 | "engines": { 39 | "node": ">=14" 40 | } 41 | }, 42 | "node_modules/@redis/graph": { 43 | "version": "1.0.1", 44 | "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.0.1.tgz", 45 | "integrity": "sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ==", 46 | "peerDependencies": { 47 | "@redis/client": "^1.0.0" 48 | } 49 | }, 50 | "node_modules/@redis/json": { 51 | "version": "1.0.3", 52 | "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.3.tgz", 53 | "integrity": "sha512-4X0Qv0BzD9Zlb0edkUoau5c1bInWSICqXAGrpwEltkncUwcxJIGEcVryZhLgb0p/3PkKaLIWkjhHRtLe9yiA7Q==", 54 | "peerDependencies": { 55 | "@redis/client": "^1.0.0" 56 | } 57 | }, 58 | "node_modules/@redis/search": { 59 | "version": "1.0.6", 60 | "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.0.6.tgz", 61 | "integrity": "sha512-pP+ZQRis5P21SD6fjyCeLcQdps+LuTzp2wdUbzxEmNhleighDDTD5ck8+cYof+WLec4csZX7ks+BuoMw0RaZrA==", 62 | "peerDependencies": { 63 | "@redis/client": "^1.0.0" 64 | } 65 | }, 66 | "node_modules/@redis/time-series": { 67 | "version": "1.0.3", 68 | "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.3.tgz", 69 | "integrity": "sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==", 70 | "peerDependencies": { 71 | "@redis/client": "^1.0.0" 72 | } 73 | }, 74 | "node_modules/abbrev": { 75 | "version": "1.1.1", 76 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 77 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 78 | }, 79 | "node_modules/accepts": { 80 | "version": "1.3.8", 81 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 82 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 83 | "dependencies": { 84 | "mime-types": "~2.1.34", 85 | "negotiator": "0.6.3" 86 | }, 87 | "engines": { 88 | "node": ">= 0.6" 89 | } 90 | }, 91 | "node_modules/anymatch": { 92 | "version": "3.1.2", 93 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 94 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 95 | "dependencies": { 96 | "normalize-path": "^3.0.0", 97 | "picomatch": "^2.0.4" 98 | }, 99 | "engines": { 100 | "node": ">= 8" 101 | } 102 | }, 103 | "node_modules/array-flatten": { 104 | "version": "1.1.1", 105 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 106 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 107 | }, 108 | "node_modules/balanced-match": { 109 | "version": "1.0.2", 110 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 111 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 112 | }, 113 | "node_modules/binary-extensions": { 114 | "version": "2.2.0", 115 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 116 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 117 | "engines": { 118 | "node": ">=8" 119 | } 120 | }, 121 | "node_modules/body-parser": { 122 | "version": "1.20.0", 123 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 124 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 125 | "dependencies": { 126 | "bytes": "3.1.2", 127 | "content-type": "~1.0.4", 128 | "debug": "2.6.9", 129 | "depd": "2.0.0", 130 | "destroy": "1.2.0", 131 | "http-errors": "2.0.0", 132 | "iconv-lite": "0.4.24", 133 | "on-finished": "2.4.1", 134 | "qs": "6.10.3", 135 | "raw-body": "2.5.1", 136 | "type-is": "~1.6.18", 137 | "unpipe": "1.0.0" 138 | }, 139 | "engines": { 140 | "node": ">= 0.8", 141 | "npm": "1.2.8000 || >= 1.4.16" 142 | } 143 | }, 144 | "node_modules/brace-expansion": { 145 | "version": "1.1.11", 146 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 147 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 148 | "dependencies": { 149 | "balanced-match": "^1.0.0", 150 | "concat-map": "0.0.1" 151 | } 152 | }, 153 | "node_modules/braces": { 154 | "version": "3.0.2", 155 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 156 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 157 | "dependencies": { 158 | "fill-range": "^7.0.1" 159 | }, 160 | "engines": { 161 | "node": ">=8" 162 | } 163 | }, 164 | "node_modules/bytes": { 165 | "version": "3.1.2", 166 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 167 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 168 | "engines": { 169 | "node": ">= 0.8" 170 | } 171 | }, 172 | "node_modules/call-bind": { 173 | "version": "1.0.2", 174 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 175 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 176 | "dependencies": { 177 | "function-bind": "^1.1.1", 178 | "get-intrinsic": "^1.0.2" 179 | }, 180 | "funding": { 181 | "url": "https://github.com/sponsors/ljharb" 182 | } 183 | }, 184 | "node_modules/chokidar": { 185 | "version": "3.5.3", 186 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 187 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 188 | "funding": [ 189 | { 190 | "type": "individual", 191 | "url": "https://paulmillr.com/funding/" 192 | } 193 | ], 194 | "dependencies": { 195 | "anymatch": "~3.1.2", 196 | "braces": "~3.0.2", 197 | "glob-parent": "~5.1.2", 198 | "is-binary-path": "~2.1.0", 199 | "is-glob": "~4.0.1", 200 | "normalize-path": "~3.0.0", 201 | "readdirp": "~3.6.0" 202 | }, 203 | "engines": { 204 | "node": ">= 8.10.0" 205 | }, 206 | "optionalDependencies": { 207 | "fsevents": "~2.3.2" 208 | } 209 | }, 210 | "node_modules/cluster-key-slot": { 211 | "version": "1.1.0", 212 | "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", 213 | "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", 214 | "engines": { 215 | "node": ">=0.10.0" 216 | } 217 | }, 218 | "node_modules/concat-map": { 219 | "version": "0.0.1", 220 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 221 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 222 | }, 223 | "node_modules/content-disposition": { 224 | "version": "0.5.4", 225 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 226 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 227 | "dependencies": { 228 | "safe-buffer": "5.2.1" 229 | }, 230 | "engines": { 231 | "node": ">= 0.6" 232 | } 233 | }, 234 | "node_modules/content-type": { 235 | "version": "1.0.4", 236 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 237 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 238 | "engines": { 239 | "node": ">= 0.6" 240 | } 241 | }, 242 | "node_modules/cookie": { 243 | "version": "0.5.0", 244 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 245 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 246 | "engines": { 247 | "node": ">= 0.6" 248 | } 249 | }, 250 | "node_modules/cookie-signature": { 251 | "version": "1.0.6", 252 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 253 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 254 | }, 255 | "node_modules/cors": { 256 | "version": "2.8.5", 257 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 258 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 259 | "dependencies": { 260 | "object-assign": "^4", 261 | "vary": "^1" 262 | }, 263 | "engines": { 264 | "node": ">= 0.10" 265 | } 266 | }, 267 | "node_modules/debug": { 268 | "version": "2.6.9", 269 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 270 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 271 | "dependencies": { 272 | "ms": "2.0.0" 273 | } 274 | }, 275 | "node_modules/depd": { 276 | "version": "2.0.0", 277 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 278 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 279 | "engines": { 280 | "node": ">= 0.8" 281 | } 282 | }, 283 | "node_modules/destroy": { 284 | "version": "1.2.0", 285 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 286 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 287 | "engines": { 288 | "node": ">= 0.8", 289 | "npm": "1.2.8000 || >= 1.4.16" 290 | } 291 | }, 292 | "node_modules/ee-first": { 293 | "version": "1.1.1", 294 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 295 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 296 | }, 297 | "node_modules/encodeurl": { 298 | "version": "1.0.2", 299 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 300 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 301 | "engines": { 302 | "node": ">= 0.8" 303 | } 304 | }, 305 | "node_modules/escape-html": { 306 | "version": "1.0.3", 307 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 308 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 309 | }, 310 | "node_modules/etag": { 311 | "version": "1.8.1", 312 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 313 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 314 | "engines": { 315 | "node": ">= 0.6" 316 | } 317 | }, 318 | "node_modules/express": { 319 | "version": "4.18.1", 320 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 321 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 322 | "dependencies": { 323 | "accepts": "~1.3.8", 324 | "array-flatten": "1.1.1", 325 | "body-parser": "1.20.0", 326 | "content-disposition": "0.5.4", 327 | "content-type": "~1.0.4", 328 | "cookie": "0.5.0", 329 | "cookie-signature": "1.0.6", 330 | "debug": "2.6.9", 331 | "depd": "2.0.0", 332 | "encodeurl": "~1.0.2", 333 | "escape-html": "~1.0.3", 334 | "etag": "~1.8.1", 335 | "finalhandler": "1.2.0", 336 | "fresh": "0.5.2", 337 | "http-errors": "2.0.0", 338 | "merge-descriptors": "1.0.1", 339 | "methods": "~1.1.2", 340 | "on-finished": "2.4.1", 341 | "parseurl": "~1.3.3", 342 | "path-to-regexp": "0.1.7", 343 | "proxy-addr": "~2.0.7", 344 | "qs": "6.10.3", 345 | "range-parser": "~1.2.1", 346 | "safe-buffer": "5.2.1", 347 | "send": "0.18.0", 348 | "serve-static": "1.15.0", 349 | "setprototypeof": "1.2.0", 350 | "statuses": "2.0.1", 351 | "type-is": "~1.6.18", 352 | "utils-merge": "1.0.1", 353 | "vary": "~1.1.2" 354 | }, 355 | "engines": { 356 | "node": ">= 0.10.0" 357 | } 358 | }, 359 | "node_modules/express-graphql": { 360 | "version": "0.12.0", 361 | "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.12.0.tgz", 362 | "integrity": "sha512-DwYaJQy0amdy3pgNtiTDuGGM2BLdj+YO2SgbKoLliCfuHv3VVTt7vNG/ZqK2hRYjtYHE2t2KB705EU94mE64zg==", 363 | "dependencies": { 364 | "accepts": "^1.3.7", 365 | "content-type": "^1.0.4", 366 | "http-errors": "1.8.0", 367 | "raw-body": "^2.4.1" 368 | }, 369 | "engines": { 370 | "node": ">= 10.x" 371 | }, 372 | "peerDependencies": { 373 | "graphql": "^14.7.0 || ^15.3.0" 374 | } 375 | }, 376 | "node_modules/express-graphql/node_modules/depd": { 377 | "version": "1.1.2", 378 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 379 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 380 | "engines": { 381 | "node": ">= 0.6" 382 | } 383 | }, 384 | "node_modules/express-graphql/node_modules/http-errors": { 385 | "version": "1.8.0", 386 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", 387 | "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", 388 | "dependencies": { 389 | "depd": "~1.1.2", 390 | "inherits": "2.0.4", 391 | "setprototypeof": "1.2.0", 392 | "statuses": ">= 1.5.0 < 2", 393 | "toidentifier": "1.0.0" 394 | }, 395 | "engines": { 396 | "node": ">= 0.6" 397 | } 398 | }, 399 | "node_modules/express-graphql/node_modules/statuses": { 400 | "version": "1.5.0", 401 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 402 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 403 | "engines": { 404 | "node": ">= 0.6" 405 | } 406 | }, 407 | "node_modules/express-graphql/node_modules/toidentifier": { 408 | "version": "1.0.0", 409 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 410 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", 411 | "engines": { 412 | "node": ">=0.6" 413 | } 414 | }, 415 | "node_modules/fill-range": { 416 | "version": "7.0.1", 417 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 418 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 419 | "dependencies": { 420 | "to-regex-range": "^5.0.1" 421 | }, 422 | "engines": { 423 | "node": ">=8" 424 | } 425 | }, 426 | "node_modules/finalhandler": { 427 | "version": "1.2.0", 428 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 429 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 430 | "dependencies": { 431 | "debug": "2.6.9", 432 | "encodeurl": "~1.0.2", 433 | "escape-html": "~1.0.3", 434 | "on-finished": "2.4.1", 435 | "parseurl": "~1.3.3", 436 | "statuses": "2.0.1", 437 | "unpipe": "~1.0.0" 438 | }, 439 | "engines": { 440 | "node": ">= 0.8" 441 | } 442 | }, 443 | "node_modules/forwarded": { 444 | "version": "0.2.0", 445 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 446 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 447 | "engines": { 448 | "node": ">= 0.6" 449 | } 450 | }, 451 | "node_modules/fresh": { 452 | "version": "0.5.2", 453 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 454 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 455 | "engines": { 456 | "node": ">= 0.6" 457 | } 458 | }, 459 | "node_modules/fs": { 460 | "version": "0.0.1-security", 461 | "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", 462 | "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" 463 | }, 464 | "node_modules/fsevents": { 465 | "version": "2.3.2", 466 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 467 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 468 | "hasInstallScript": true, 469 | "optional": true, 470 | "os": [ 471 | "darwin" 472 | ], 473 | "engines": { 474 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 475 | } 476 | }, 477 | "node_modules/function-bind": { 478 | "version": "1.1.1", 479 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 480 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 481 | }, 482 | "node_modules/generic-pool": { 483 | "version": "3.8.2", 484 | "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", 485 | "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==", 486 | "engines": { 487 | "node": ">= 4" 488 | } 489 | }, 490 | "node_modules/get-intrinsic": { 491 | "version": "1.1.2", 492 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 493 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 494 | "dependencies": { 495 | "function-bind": "^1.1.1", 496 | "has": "^1.0.3", 497 | "has-symbols": "^1.0.3" 498 | }, 499 | "funding": { 500 | "url": "https://github.com/sponsors/ljharb" 501 | } 502 | }, 503 | "node_modules/glob-parent": { 504 | "version": "5.1.2", 505 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 506 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 507 | "dependencies": { 508 | "is-glob": "^4.0.1" 509 | }, 510 | "engines": { 511 | "node": ">= 6" 512 | } 513 | }, 514 | "node_modules/graphql": { 515 | "version": "15.8.0", 516 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", 517 | "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", 518 | "engines": { 519 | "node": ">= 10.x" 520 | } 521 | }, 522 | "node_modules/has": { 523 | "version": "1.0.3", 524 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 525 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 526 | "dependencies": { 527 | "function-bind": "^1.1.1" 528 | }, 529 | "engines": { 530 | "node": ">= 0.4.0" 531 | } 532 | }, 533 | "node_modules/has-flag": { 534 | "version": "3.0.0", 535 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 536 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 537 | "engines": { 538 | "node": ">=4" 539 | } 540 | }, 541 | "node_modules/has-symbols": { 542 | "version": "1.0.3", 543 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 544 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 545 | "engines": { 546 | "node": ">= 0.4" 547 | }, 548 | "funding": { 549 | "url": "https://github.com/sponsors/ljharb" 550 | } 551 | }, 552 | "node_modules/http-errors": { 553 | "version": "2.0.0", 554 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 555 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 556 | "dependencies": { 557 | "depd": "2.0.0", 558 | "inherits": "2.0.4", 559 | "setprototypeof": "1.2.0", 560 | "statuses": "2.0.1", 561 | "toidentifier": "1.0.1" 562 | }, 563 | "engines": { 564 | "node": ">= 0.8" 565 | } 566 | }, 567 | "node_modules/iconv-lite": { 568 | "version": "0.4.24", 569 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 570 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 571 | "dependencies": { 572 | "safer-buffer": ">= 2.1.2 < 3" 573 | }, 574 | "engines": { 575 | "node": ">=0.10.0" 576 | } 577 | }, 578 | "node_modules/ignore-by-default": { 579 | "version": "1.0.1", 580 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 581 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" 582 | }, 583 | "node_modules/inherits": { 584 | "version": "2.0.4", 585 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 586 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 587 | }, 588 | "node_modules/ipaddr.js": { 589 | "version": "1.9.1", 590 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 591 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 592 | "engines": { 593 | "node": ">= 0.10" 594 | } 595 | }, 596 | "node_modules/is-binary-path": { 597 | "version": "2.1.0", 598 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 599 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 600 | "dependencies": { 601 | "binary-extensions": "^2.0.0" 602 | }, 603 | "engines": { 604 | "node": ">=8" 605 | } 606 | }, 607 | "node_modules/is-extglob": { 608 | "version": "2.1.1", 609 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 610 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 611 | "engines": { 612 | "node": ">=0.10.0" 613 | } 614 | }, 615 | "node_modules/is-glob": { 616 | "version": "4.0.3", 617 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 618 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 619 | "dependencies": { 620 | "is-extglob": "^2.1.1" 621 | }, 622 | "engines": { 623 | "node": ">=0.10.0" 624 | } 625 | }, 626 | "node_modules/is-number": { 627 | "version": "7.0.0", 628 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 629 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 630 | "engines": { 631 | "node": ">=0.12.0" 632 | } 633 | }, 634 | "node_modules/media-typer": { 635 | "version": "0.3.0", 636 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 637 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 638 | "engines": { 639 | "node": ">= 0.6" 640 | } 641 | }, 642 | "node_modules/merge-descriptors": { 643 | "version": "1.0.1", 644 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 645 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 646 | }, 647 | "node_modules/methods": { 648 | "version": "1.1.2", 649 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 650 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 651 | "engines": { 652 | "node": ">= 0.6" 653 | } 654 | }, 655 | "node_modules/mime": { 656 | "version": "1.6.0", 657 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 658 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 659 | "bin": { 660 | "mime": "cli.js" 661 | }, 662 | "engines": { 663 | "node": ">=4" 664 | } 665 | }, 666 | "node_modules/mime-db": { 667 | "version": "1.52.0", 668 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 669 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 670 | "engines": { 671 | "node": ">= 0.6" 672 | } 673 | }, 674 | "node_modules/mime-types": { 675 | "version": "2.1.35", 676 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 677 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 678 | "dependencies": { 679 | "mime-db": "1.52.0" 680 | }, 681 | "engines": { 682 | "node": ">= 0.6" 683 | } 684 | }, 685 | "node_modules/minimatch": { 686 | "version": "3.1.2", 687 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 688 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 689 | "dependencies": { 690 | "brace-expansion": "^1.1.7" 691 | }, 692 | "engines": { 693 | "node": "*" 694 | } 695 | }, 696 | "node_modules/ms": { 697 | "version": "2.0.0", 698 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 699 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 700 | }, 701 | "node_modules/negotiator": { 702 | "version": "0.6.3", 703 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 704 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 705 | "engines": { 706 | "node": ">= 0.6" 707 | } 708 | }, 709 | "node_modules/nodemon": { 710 | "version": "2.0.19", 711 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", 712 | "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", 713 | "hasInstallScript": true, 714 | "dependencies": { 715 | "chokidar": "^3.5.2", 716 | "debug": "^3.2.7", 717 | "ignore-by-default": "^1.0.1", 718 | "minimatch": "^3.0.4", 719 | "pstree.remy": "^1.1.8", 720 | "semver": "^5.7.1", 721 | "simple-update-notifier": "^1.0.7", 722 | "supports-color": "^5.5.0", 723 | "touch": "^3.1.0", 724 | "undefsafe": "^2.0.5" 725 | }, 726 | "bin": { 727 | "nodemon": "bin/nodemon.js" 728 | }, 729 | "engines": { 730 | "node": ">=8.10.0" 731 | }, 732 | "funding": { 733 | "type": "opencollective", 734 | "url": "https://opencollective.com/nodemon" 735 | } 736 | }, 737 | "node_modules/nodemon/node_modules/debug": { 738 | "version": "3.2.7", 739 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 740 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 741 | "dependencies": { 742 | "ms": "^2.1.1" 743 | } 744 | }, 745 | "node_modules/nodemon/node_modules/ms": { 746 | "version": "2.1.3", 747 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 748 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 749 | }, 750 | "node_modules/nopt": { 751 | "version": "1.0.10", 752 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 753 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 754 | "dependencies": { 755 | "abbrev": "1" 756 | }, 757 | "bin": { 758 | "nopt": "bin/nopt.js" 759 | }, 760 | "engines": { 761 | "node": "*" 762 | } 763 | }, 764 | "node_modules/normalize-path": { 765 | "version": "3.0.0", 766 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 767 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 768 | "engines": { 769 | "node": ">=0.10.0" 770 | } 771 | }, 772 | "node_modules/object-assign": { 773 | "version": "4.1.1", 774 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 775 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 776 | "engines": { 777 | "node": ">=0.10.0" 778 | } 779 | }, 780 | "node_modules/object-inspect": { 781 | "version": "1.12.2", 782 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 783 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 784 | "funding": { 785 | "url": "https://github.com/sponsors/ljharb" 786 | } 787 | }, 788 | "node_modules/on-finished": { 789 | "version": "2.4.1", 790 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 791 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 792 | "dependencies": { 793 | "ee-first": "1.1.1" 794 | }, 795 | "engines": { 796 | "node": ">= 0.8" 797 | } 798 | }, 799 | "node_modules/parseurl": { 800 | "version": "1.3.3", 801 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 802 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 803 | "engines": { 804 | "node": ">= 0.8" 805 | } 806 | }, 807 | "node_modules/path-to-regexp": { 808 | "version": "0.1.7", 809 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 810 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 811 | }, 812 | "node_modules/picomatch": { 813 | "version": "2.3.1", 814 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 815 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 816 | "engines": { 817 | "node": ">=8.6" 818 | }, 819 | "funding": { 820 | "url": "https://github.com/sponsors/jonschlinkert" 821 | } 822 | }, 823 | "node_modules/proxy-addr": { 824 | "version": "2.0.7", 825 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 826 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 827 | "dependencies": { 828 | "forwarded": "0.2.0", 829 | "ipaddr.js": "1.9.1" 830 | }, 831 | "engines": { 832 | "node": ">= 0.10" 833 | } 834 | }, 835 | "node_modules/pstree.remy": { 836 | "version": "1.1.8", 837 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 838 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" 839 | }, 840 | "node_modules/qs": { 841 | "version": "6.10.3", 842 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 843 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 844 | "dependencies": { 845 | "side-channel": "^1.0.4" 846 | }, 847 | "engines": { 848 | "node": ">=0.6" 849 | }, 850 | "funding": { 851 | "url": "https://github.com/sponsors/ljharb" 852 | } 853 | }, 854 | "node_modules/range-parser": { 855 | "version": "1.2.1", 856 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 857 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 858 | "engines": { 859 | "node": ">= 0.6" 860 | } 861 | }, 862 | "node_modules/raw-body": { 863 | "version": "2.5.1", 864 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 865 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 866 | "dependencies": { 867 | "bytes": "3.1.2", 868 | "http-errors": "2.0.0", 869 | "iconv-lite": "0.4.24", 870 | "unpipe": "1.0.0" 871 | }, 872 | "engines": { 873 | "node": ">= 0.8" 874 | } 875 | }, 876 | "node_modules/readdirp": { 877 | "version": "3.6.0", 878 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 879 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 880 | "dependencies": { 881 | "picomatch": "^2.2.1" 882 | }, 883 | "engines": { 884 | "node": ">=8.10.0" 885 | } 886 | }, 887 | "node_modules/redis": { 888 | "version": "4.2.0", 889 | "resolved": "https://registry.npmjs.org/redis/-/redis-4.2.0.tgz", 890 | "integrity": "sha512-bCR0gKVhIXFg8zCQjXEANzgI01DDixtPZgIUZHBCmwqixnu+MK3Tb2yqGjh+HCLASQVVgApiwhNkv+FoedZOGQ==", 891 | "dependencies": { 892 | "@redis/bloom": "1.0.2", 893 | "@redis/client": "1.2.0", 894 | "@redis/graph": "1.0.1", 895 | "@redis/json": "1.0.3", 896 | "@redis/search": "1.0.6", 897 | "@redis/time-series": "1.0.3" 898 | } 899 | }, 900 | "node_modules/safe-buffer": { 901 | "version": "5.2.1", 902 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 903 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 904 | "funding": [ 905 | { 906 | "type": "github", 907 | "url": "https://github.com/sponsors/feross" 908 | }, 909 | { 910 | "type": "patreon", 911 | "url": "https://www.patreon.com/feross" 912 | }, 913 | { 914 | "type": "consulting", 915 | "url": "https://feross.org/support" 916 | } 917 | ] 918 | }, 919 | "node_modules/safer-buffer": { 920 | "version": "2.1.2", 921 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 922 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 923 | }, 924 | "node_modules/semver": { 925 | "version": "5.7.1", 926 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 927 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 928 | "bin": { 929 | "semver": "bin/semver" 930 | } 931 | }, 932 | "node_modules/send": { 933 | "version": "0.18.0", 934 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 935 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 936 | "dependencies": { 937 | "debug": "2.6.9", 938 | "depd": "2.0.0", 939 | "destroy": "1.2.0", 940 | "encodeurl": "~1.0.2", 941 | "escape-html": "~1.0.3", 942 | "etag": "~1.8.1", 943 | "fresh": "0.5.2", 944 | "http-errors": "2.0.0", 945 | "mime": "1.6.0", 946 | "ms": "2.1.3", 947 | "on-finished": "2.4.1", 948 | "range-parser": "~1.2.1", 949 | "statuses": "2.0.1" 950 | }, 951 | "engines": { 952 | "node": ">= 0.8.0" 953 | } 954 | }, 955 | "node_modules/send/node_modules/ms": { 956 | "version": "2.1.3", 957 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 958 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 959 | }, 960 | "node_modules/serve-static": { 961 | "version": "1.15.0", 962 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 963 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 964 | "dependencies": { 965 | "encodeurl": "~1.0.2", 966 | "escape-html": "~1.0.3", 967 | "parseurl": "~1.3.3", 968 | "send": "0.18.0" 969 | }, 970 | "engines": { 971 | "node": ">= 0.8.0" 972 | } 973 | }, 974 | "node_modules/setprototypeof": { 975 | "version": "1.2.0", 976 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 977 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 978 | }, 979 | "node_modules/side-channel": { 980 | "version": "1.0.4", 981 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 982 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 983 | "dependencies": { 984 | "call-bind": "^1.0.0", 985 | "get-intrinsic": "^1.0.2", 986 | "object-inspect": "^1.9.0" 987 | }, 988 | "funding": { 989 | "url": "https://github.com/sponsors/ljharb" 990 | } 991 | }, 992 | "node_modules/simple-update-notifier": { 993 | "version": "1.0.7", 994 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", 995 | "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", 996 | "dependencies": { 997 | "semver": "~7.0.0" 998 | }, 999 | "engines": { 1000 | "node": ">=8.10.0" 1001 | } 1002 | }, 1003 | "node_modules/simple-update-notifier/node_modules/semver": { 1004 | "version": "7.0.0", 1005 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1006 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1007 | "bin": { 1008 | "semver": "bin/semver.js" 1009 | } 1010 | }, 1011 | "node_modules/statuses": { 1012 | "version": "2.0.1", 1013 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1014 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1015 | "engines": { 1016 | "node": ">= 0.8" 1017 | } 1018 | }, 1019 | "node_modules/supports-color": { 1020 | "version": "5.5.0", 1021 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1022 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1023 | "dependencies": { 1024 | "has-flag": "^3.0.0" 1025 | }, 1026 | "engines": { 1027 | "node": ">=4" 1028 | } 1029 | }, 1030 | "node_modules/to-regex-range": { 1031 | "version": "5.0.1", 1032 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1033 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1034 | "dependencies": { 1035 | "is-number": "^7.0.0" 1036 | }, 1037 | "engines": { 1038 | "node": ">=8.0" 1039 | } 1040 | }, 1041 | "node_modules/toidentifier": { 1042 | "version": "1.0.1", 1043 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1044 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1045 | "engines": { 1046 | "node": ">=0.6" 1047 | } 1048 | }, 1049 | "node_modules/touch": { 1050 | "version": "3.1.0", 1051 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1052 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1053 | "dependencies": { 1054 | "nopt": "~1.0.10" 1055 | }, 1056 | "bin": { 1057 | "nodetouch": "bin/nodetouch.js" 1058 | } 1059 | }, 1060 | "node_modules/type-is": { 1061 | "version": "1.6.18", 1062 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1063 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1064 | "dependencies": { 1065 | "media-typer": "0.3.0", 1066 | "mime-types": "~2.1.24" 1067 | }, 1068 | "engines": { 1069 | "node": ">= 0.6" 1070 | } 1071 | }, 1072 | "node_modules/undefsafe": { 1073 | "version": "2.0.5", 1074 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1075 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" 1076 | }, 1077 | "node_modules/unpipe": { 1078 | "version": "1.0.0", 1079 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1080 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1081 | "engines": { 1082 | "node": ">= 0.8" 1083 | } 1084 | }, 1085 | "node_modules/utils-merge": { 1086 | "version": "1.0.1", 1087 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1088 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1089 | "engines": { 1090 | "node": ">= 0.4.0" 1091 | } 1092 | }, 1093 | "node_modules/vary": { 1094 | "version": "1.1.2", 1095 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1096 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1097 | "engines": { 1098 | "node": ">= 0.8" 1099 | } 1100 | }, 1101 | "node_modules/yallist": { 1102 | "version": "4.0.0", 1103 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1104 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1105 | } 1106 | }, 1107 | "dependencies": { 1108 | "@redis/bloom": { 1109 | "version": "1.0.2", 1110 | "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.0.2.tgz", 1111 | "integrity": "sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw==", 1112 | "requires": {} 1113 | }, 1114 | "@redis/client": { 1115 | "version": "1.2.0", 1116 | "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.2.0.tgz", 1117 | "integrity": "sha512-a8Nlw5fv2EIAFJxTDSSDVUT7yfBGpZO96ybZXzQpgkyLg/dxtQ1uiwTc0EGfzg1mrPjZokeBSEGTbGXekqTNOg==", 1118 | "requires": { 1119 | "cluster-key-slot": "1.1.0", 1120 | "generic-pool": "3.8.2", 1121 | "yallist": "4.0.0" 1122 | } 1123 | }, 1124 | "@redis/graph": { 1125 | "version": "1.0.1", 1126 | "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.0.1.tgz", 1127 | "integrity": "sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ==", 1128 | "requires": {} 1129 | }, 1130 | "@redis/json": { 1131 | "version": "1.0.3", 1132 | "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.3.tgz", 1133 | "integrity": "sha512-4X0Qv0BzD9Zlb0edkUoau5c1bInWSICqXAGrpwEltkncUwcxJIGEcVryZhLgb0p/3PkKaLIWkjhHRtLe9yiA7Q==", 1134 | "requires": {} 1135 | }, 1136 | "@redis/search": { 1137 | "version": "1.0.6", 1138 | "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.0.6.tgz", 1139 | "integrity": "sha512-pP+ZQRis5P21SD6fjyCeLcQdps+LuTzp2wdUbzxEmNhleighDDTD5ck8+cYof+WLec4csZX7ks+BuoMw0RaZrA==", 1140 | "requires": {} 1141 | }, 1142 | "@redis/time-series": { 1143 | "version": "1.0.3", 1144 | "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.3.tgz", 1145 | "integrity": "sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==", 1146 | "requires": {} 1147 | }, 1148 | "abbrev": { 1149 | "version": "1.1.1", 1150 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 1151 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 1152 | }, 1153 | "accepts": { 1154 | "version": "1.3.8", 1155 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1156 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1157 | "requires": { 1158 | "mime-types": "~2.1.34", 1159 | "negotiator": "0.6.3" 1160 | } 1161 | }, 1162 | "anymatch": { 1163 | "version": "3.1.2", 1164 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1165 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1166 | "requires": { 1167 | "normalize-path": "^3.0.0", 1168 | "picomatch": "^2.0.4" 1169 | } 1170 | }, 1171 | "array-flatten": { 1172 | "version": "1.1.1", 1173 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1174 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 1175 | }, 1176 | "balanced-match": { 1177 | "version": "1.0.2", 1178 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1179 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 1180 | }, 1181 | "binary-extensions": { 1182 | "version": "2.2.0", 1183 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1184 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 1185 | }, 1186 | "body-parser": { 1187 | "version": "1.20.0", 1188 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 1189 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 1190 | "requires": { 1191 | "bytes": "3.1.2", 1192 | "content-type": "~1.0.4", 1193 | "debug": "2.6.9", 1194 | "depd": "2.0.0", 1195 | "destroy": "1.2.0", 1196 | "http-errors": "2.0.0", 1197 | "iconv-lite": "0.4.24", 1198 | "on-finished": "2.4.1", 1199 | "qs": "6.10.3", 1200 | "raw-body": "2.5.1", 1201 | "type-is": "~1.6.18", 1202 | "unpipe": "1.0.0" 1203 | } 1204 | }, 1205 | "brace-expansion": { 1206 | "version": "1.1.11", 1207 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1208 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1209 | "requires": { 1210 | "balanced-match": "^1.0.0", 1211 | "concat-map": "0.0.1" 1212 | } 1213 | }, 1214 | "braces": { 1215 | "version": "3.0.2", 1216 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1217 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1218 | "requires": { 1219 | "fill-range": "^7.0.1" 1220 | } 1221 | }, 1222 | "bytes": { 1223 | "version": "3.1.2", 1224 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1225 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 1226 | }, 1227 | "call-bind": { 1228 | "version": "1.0.2", 1229 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1230 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1231 | "requires": { 1232 | "function-bind": "^1.1.1", 1233 | "get-intrinsic": "^1.0.2" 1234 | } 1235 | }, 1236 | "chokidar": { 1237 | "version": "3.5.3", 1238 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1239 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1240 | "requires": { 1241 | "anymatch": "~3.1.2", 1242 | "braces": "~3.0.2", 1243 | "fsevents": "~2.3.2", 1244 | "glob-parent": "~5.1.2", 1245 | "is-binary-path": "~2.1.0", 1246 | "is-glob": "~4.0.1", 1247 | "normalize-path": "~3.0.0", 1248 | "readdirp": "~3.6.0" 1249 | } 1250 | }, 1251 | "cluster-key-slot": { 1252 | "version": "1.1.0", 1253 | "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", 1254 | "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==" 1255 | }, 1256 | "concat-map": { 1257 | "version": "0.0.1", 1258 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1259 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 1260 | }, 1261 | "content-disposition": { 1262 | "version": "0.5.4", 1263 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 1264 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 1265 | "requires": { 1266 | "safe-buffer": "5.2.1" 1267 | } 1268 | }, 1269 | "content-type": { 1270 | "version": "1.0.4", 1271 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 1272 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 1273 | }, 1274 | "cookie": { 1275 | "version": "0.5.0", 1276 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 1277 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 1278 | }, 1279 | "cookie-signature": { 1280 | "version": "1.0.6", 1281 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1282 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 1283 | }, 1284 | "cors": { 1285 | "version": "2.8.5", 1286 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1287 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1288 | "requires": { 1289 | "object-assign": "^4", 1290 | "vary": "^1" 1291 | } 1292 | }, 1293 | "debug": { 1294 | "version": "2.6.9", 1295 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1296 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1297 | "requires": { 1298 | "ms": "2.0.0" 1299 | } 1300 | }, 1301 | "depd": { 1302 | "version": "2.0.0", 1303 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1304 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 1305 | }, 1306 | "destroy": { 1307 | "version": "1.2.0", 1308 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 1309 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 1310 | }, 1311 | "ee-first": { 1312 | "version": "1.1.1", 1313 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1314 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 1315 | }, 1316 | "encodeurl": { 1317 | "version": "1.0.2", 1318 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1319 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 1320 | }, 1321 | "escape-html": { 1322 | "version": "1.0.3", 1323 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1324 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1325 | }, 1326 | "etag": { 1327 | "version": "1.8.1", 1328 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1329 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1330 | }, 1331 | "express": { 1332 | "version": "4.18.1", 1333 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 1334 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 1335 | "requires": { 1336 | "accepts": "~1.3.8", 1337 | "array-flatten": "1.1.1", 1338 | "body-parser": "1.20.0", 1339 | "content-disposition": "0.5.4", 1340 | "content-type": "~1.0.4", 1341 | "cookie": "0.5.0", 1342 | "cookie-signature": "1.0.6", 1343 | "debug": "2.6.9", 1344 | "depd": "2.0.0", 1345 | "encodeurl": "~1.0.2", 1346 | "escape-html": "~1.0.3", 1347 | "etag": "~1.8.1", 1348 | "finalhandler": "1.2.0", 1349 | "fresh": "0.5.2", 1350 | "http-errors": "2.0.0", 1351 | "merge-descriptors": "1.0.1", 1352 | "methods": "~1.1.2", 1353 | "on-finished": "2.4.1", 1354 | "parseurl": "~1.3.3", 1355 | "path-to-regexp": "0.1.7", 1356 | "proxy-addr": "~2.0.7", 1357 | "qs": "6.10.3", 1358 | "range-parser": "~1.2.1", 1359 | "safe-buffer": "5.2.1", 1360 | "send": "0.18.0", 1361 | "serve-static": "1.15.0", 1362 | "setprototypeof": "1.2.0", 1363 | "statuses": "2.0.1", 1364 | "type-is": "~1.6.18", 1365 | "utils-merge": "1.0.1", 1366 | "vary": "~1.1.2" 1367 | } 1368 | }, 1369 | "express-graphql": { 1370 | "version": "0.12.0", 1371 | "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.12.0.tgz", 1372 | "integrity": "sha512-DwYaJQy0amdy3pgNtiTDuGGM2BLdj+YO2SgbKoLliCfuHv3VVTt7vNG/ZqK2hRYjtYHE2t2KB705EU94mE64zg==", 1373 | "requires": { 1374 | "accepts": "^1.3.7", 1375 | "content-type": "^1.0.4", 1376 | "http-errors": "1.8.0", 1377 | "raw-body": "^2.4.1" 1378 | }, 1379 | "dependencies": { 1380 | "depd": { 1381 | "version": "1.1.2", 1382 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1383 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" 1384 | }, 1385 | "http-errors": { 1386 | "version": "1.8.0", 1387 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", 1388 | "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", 1389 | "requires": { 1390 | "depd": "~1.1.2", 1391 | "inherits": "2.0.4", 1392 | "setprototypeof": "1.2.0", 1393 | "statuses": ">= 1.5.0 < 2", 1394 | "toidentifier": "1.0.0" 1395 | } 1396 | }, 1397 | "statuses": { 1398 | "version": "1.5.0", 1399 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1400 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" 1401 | }, 1402 | "toidentifier": { 1403 | "version": "1.0.0", 1404 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1405 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1406 | } 1407 | } 1408 | }, 1409 | "fill-range": { 1410 | "version": "7.0.1", 1411 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1412 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1413 | "requires": { 1414 | "to-regex-range": "^5.0.1" 1415 | } 1416 | }, 1417 | "finalhandler": { 1418 | "version": "1.2.0", 1419 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1420 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1421 | "requires": { 1422 | "debug": "2.6.9", 1423 | "encodeurl": "~1.0.2", 1424 | "escape-html": "~1.0.3", 1425 | "on-finished": "2.4.1", 1426 | "parseurl": "~1.3.3", 1427 | "statuses": "2.0.1", 1428 | "unpipe": "~1.0.0" 1429 | } 1430 | }, 1431 | "forwarded": { 1432 | "version": "0.2.0", 1433 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1434 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1435 | }, 1436 | "fresh": { 1437 | "version": "0.5.2", 1438 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1439 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1440 | }, 1441 | "fs": { 1442 | "version": "0.0.1-security", 1443 | "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", 1444 | "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" 1445 | }, 1446 | "fsevents": { 1447 | "version": "2.3.2", 1448 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1449 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1450 | "optional": true 1451 | }, 1452 | "function-bind": { 1453 | "version": "1.1.1", 1454 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1455 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1456 | }, 1457 | "generic-pool": { 1458 | "version": "3.8.2", 1459 | "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", 1460 | "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==" 1461 | }, 1462 | "get-intrinsic": { 1463 | "version": "1.1.2", 1464 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 1465 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 1466 | "requires": { 1467 | "function-bind": "^1.1.1", 1468 | "has": "^1.0.3", 1469 | "has-symbols": "^1.0.3" 1470 | } 1471 | }, 1472 | "glob-parent": { 1473 | "version": "5.1.2", 1474 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1475 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1476 | "requires": { 1477 | "is-glob": "^4.0.1" 1478 | } 1479 | }, 1480 | "graphql": { 1481 | "version": "15.8.0", 1482 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", 1483 | "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==" 1484 | }, 1485 | "has": { 1486 | "version": "1.0.3", 1487 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1488 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1489 | "requires": { 1490 | "function-bind": "^1.1.1" 1491 | } 1492 | }, 1493 | "has-flag": { 1494 | "version": "3.0.0", 1495 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1496 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" 1497 | }, 1498 | "has-symbols": { 1499 | "version": "1.0.3", 1500 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1501 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1502 | }, 1503 | "http-errors": { 1504 | "version": "2.0.0", 1505 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1506 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1507 | "requires": { 1508 | "depd": "2.0.0", 1509 | "inherits": "2.0.4", 1510 | "setprototypeof": "1.2.0", 1511 | "statuses": "2.0.1", 1512 | "toidentifier": "1.0.1" 1513 | } 1514 | }, 1515 | "iconv-lite": { 1516 | "version": "0.4.24", 1517 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1518 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1519 | "requires": { 1520 | "safer-buffer": ">= 2.1.2 < 3" 1521 | } 1522 | }, 1523 | "ignore-by-default": { 1524 | "version": "1.0.1", 1525 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 1526 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" 1527 | }, 1528 | "inherits": { 1529 | "version": "2.0.4", 1530 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1531 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1532 | }, 1533 | "ipaddr.js": { 1534 | "version": "1.9.1", 1535 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1536 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1537 | }, 1538 | "is-binary-path": { 1539 | "version": "2.1.0", 1540 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1541 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1542 | "requires": { 1543 | "binary-extensions": "^2.0.0" 1544 | } 1545 | }, 1546 | "is-extglob": { 1547 | "version": "2.1.1", 1548 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1549 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 1550 | }, 1551 | "is-glob": { 1552 | "version": "4.0.3", 1553 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1554 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1555 | "requires": { 1556 | "is-extglob": "^2.1.1" 1557 | } 1558 | }, 1559 | "is-number": { 1560 | "version": "7.0.0", 1561 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1562 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1563 | }, 1564 | "media-typer": { 1565 | "version": "0.3.0", 1566 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1567 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1568 | }, 1569 | "merge-descriptors": { 1570 | "version": "1.0.1", 1571 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1572 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1573 | }, 1574 | "methods": { 1575 | "version": "1.1.2", 1576 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1577 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1578 | }, 1579 | "mime": { 1580 | "version": "1.6.0", 1581 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1582 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1583 | }, 1584 | "mime-db": { 1585 | "version": "1.52.0", 1586 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1587 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1588 | }, 1589 | "mime-types": { 1590 | "version": "2.1.35", 1591 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1592 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1593 | "requires": { 1594 | "mime-db": "1.52.0" 1595 | } 1596 | }, 1597 | "minimatch": { 1598 | "version": "3.1.2", 1599 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1600 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1601 | "requires": { 1602 | "brace-expansion": "^1.1.7" 1603 | } 1604 | }, 1605 | "ms": { 1606 | "version": "2.0.0", 1607 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1608 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1609 | }, 1610 | "negotiator": { 1611 | "version": "0.6.3", 1612 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1613 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1614 | }, 1615 | "nodemon": { 1616 | "version": "2.0.19", 1617 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", 1618 | "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", 1619 | "requires": { 1620 | "chokidar": "^3.5.2", 1621 | "debug": "^3.2.7", 1622 | "ignore-by-default": "^1.0.1", 1623 | "minimatch": "^3.0.4", 1624 | "pstree.remy": "^1.1.8", 1625 | "semver": "^5.7.1", 1626 | "simple-update-notifier": "^1.0.7", 1627 | "supports-color": "^5.5.0", 1628 | "touch": "^3.1.0", 1629 | "undefsafe": "^2.0.5" 1630 | }, 1631 | "dependencies": { 1632 | "debug": { 1633 | "version": "3.2.7", 1634 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1635 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1636 | "requires": { 1637 | "ms": "^2.1.1" 1638 | } 1639 | }, 1640 | "ms": { 1641 | "version": "2.1.3", 1642 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1643 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1644 | } 1645 | } 1646 | }, 1647 | "nopt": { 1648 | "version": "1.0.10", 1649 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1650 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1651 | "requires": { 1652 | "abbrev": "1" 1653 | } 1654 | }, 1655 | "normalize-path": { 1656 | "version": "3.0.0", 1657 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1658 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1659 | }, 1660 | "object-assign": { 1661 | "version": "4.1.1", 1662 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1663 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 1664 | }, 1665 | "object-inspect": { 1666 | "version": "1.12.2", 1667 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 1668 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 1669 | }, 1670 | "on-finished": { 1671 | "version": "2.4.1", 1672 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1673 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1674 | "requires": { 1675 | "ee-first": "1.1.1" 1676 | } 1677 | }, 1678 | "parseurl": { 1679 | "version": "1.3.3", 1680 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1681 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1682 | }, 1683 | "path-to-regexp": { 1684 | "version": "0.1.7", 1685 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1686 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1687 | }, 1688 | "picomatch": { 1689 | "version": "2.3.1", 1690 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1691 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 1692 | }, 1693 | "proxy-addr": { 1694 | "version": "2.0.7", 1695 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1696 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1697 | "requires": { 1698 | "forwarded": "0.2.0", 1699 | "ipaddr.js": "1.9.1" 1700 | } 1701 | }, 1702 | "pstree.remy": { 1703 | "version": "1.1.8", 1704 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1705 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" 1706 | }, 1707 | "qs": { 1708 | "version": "6.10.3", 1709 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 1710 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 1711 | "requires": { 1712 | "side-channel": "^1.0.4" 1713 | } 1714 | }, 1715 | "range-parser": { 1716 | "version": "1.2.1", 1717 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1718 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1719 | }, 1720 | "raw-body": { 1721 | "version": "2.5.1", 1722 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1723 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1724 | "requires": { 1725 | "bytes": "3.1.2", 1726 | "http-errors": "2.0.0", 1727 | "iconv-lite": "0.4.24", 1728 | "unpipe": "1.0.0" 1729 | } 1730 | }, 1731 | "readdirp": { 1732 | "version": "3.6.0", 1733 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1734 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1735 | "requires": { 1736 | "picomatch": "^2.2.1" 1737 | } 1738 | }, 1739 | "redis": { 1740 | "version": "4.2.0", 1741 | "resolved": "https://registry.npmjs.org/redis/-/redis-4.2.0.tgz", 1742 | "integrity": "sha512-bCR0gKVhIXFg8zCQjXEANzgI01DDixtPZgIUZHBCmwqixnu+MK3Tb2yqGjh+HCLASQVVgApiwhNkv+FoedZOGQ==", 1743 | "requires": { 1744 | "@redis/bloom": "1.0.2", 1745 | "@redis/client": "1.2.0", 1746 | "@redis/graph": "1.0.1", 1747 | "@redis/json": "1.0.3", 1748 | "@redis/search": "1.0.6", 1749 | "@redis/time-series": "1.0.3" 1750 | } 1751 | }, 1752 | "safe-buffer": { 1753 | "version": "5.2.1", 1754 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1755 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1756 | }, 1757 | "safer-buffer": { 1758 | "version": "2.1.2", 1759 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1760 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1761 | }, 1762 | "semver": { 1763 | "version": "5.7.1", 1764 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1765 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1766 | }, 1767 | "send": { 1768 | "version": "0.18.0", 1769 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1770 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1771 | "requires": { 1772 | "debug": "2.6.9", 1773 | "depd": "2.0.0", 1774 | "destroy": "1.2.0", 1775 | "encodeurl": "~1.0.2", 1776 | "escape-html": "~1.0.3", 1777 | "etag": "~1.8.1", 1778 | "fresh": "0.5.2", 1779 | "http-errors": "2.0.0", 1780 | "mime": "1.6.0", 1781 | "ms": "2.1.3", 1782 | "on-finished": "2.4.1", 1783 | "range-parser": "~1.2.1", 1784 | "statuses": "2.0.1" 1785 | }, 1786 | "dependencies": { 1787 | "ms": { 1788 | "version": "2.1.3", 1789 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1790 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1791 | } 1792 | } 1793 | }, 1794 | "serve-static": { 1795 | "version": "1.15.0", 1796 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1797 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1798 | "requires": { 1799 | "encodeurl": "~1.0.2", 1800 | "escape-html": "~1.0.3", 1801 | "parseurl": "~1.3.3", 1802 | "send": "0.18.0" 1803 | } 1804 | }, 1805 | "setprototypeof": { 1806 | "version": "1.2.0", 1807 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1808 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1809 | }, 1810 | "side-channel": { 1811 | "version": "1.0.4", 1812 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1813 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1814 | "requires": { 1815 | "call-bind": "^1.0.0", 1816 | "get-intrinsic": "^1.0.2", 1817 | "object-inspect": "^1.9.0" 1818 | } 1819 | }, 1820 | "simple-update-notifier": { 1821 | "version": "1.0.7", 1822 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", 1823 | "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", 1824 | "requires": { 1825 | "semver": "~7.0.0" 1826 | }, 1827 | "dependencies": { 1828 | "semver": { 1829 | "version": "7.0.0", 1830 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1831 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" 1832 | } 1833 | } 1834 | }, 1835 | "statuses": { 1836 | "version": "2.0.1", 1837 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1838 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1839 | }, 1840 | "supports-color": { 1841 | "version": "5.5.0", 1842 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1843 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1844 | "requires": { 1845 | "has-flag": "^3.0.0" 1846 | } 1847 | }, 1848 | "to-regex-range": { 1849 | "version": "5.0.1", 1850 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1851 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1852 | "requires": { 1853 | "is-number": "^7.0.0" 1854 | } 1855 | }, 1856 | "toidentifier": { 1857 | "version": "1.0.1", 1858 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1859 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1860 | }, 1861 | "touch": { 1862 | "version": "3.1.0", 1863 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1864 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1865 | "requires": { 1866 | "nopt": "~1.0.10" 1867 | } 1868 | }, 1869 | "type-is": { 1870 | "version": "1.6.18", 1871 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1872 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1873 | "requires": { 1874 | "media-typer": "0.3.0", 1875 | "mime-types": "~2.1.24" 1876 | } 1877 | }, 1878 | "undefsafe": { 1879 | "version": "2.0.5", 1880 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1881 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" 1882 | }, 1883 | "unpipe": { 1884 | "version": "1.0.0", 1885 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1886 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1887 | }, 1888 | "utils-merge": { 1889 | "version": "1.0.1", 1890 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1891 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1892 | }, 1893 | "vary": { 1894 | "version": "1.1.2", 1895 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1896 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1897 | }, 1898 | "yallist": { 1899 | "version": "4.0.0", 1900 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1901 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1902 | } 1903 | } 1904 | } 1905 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "nodemon server.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "cors": "^2.8.5", 15 | "express": "^4.18.1", 16 | "express-graphql": "^0.12.0", 17 | "fs": "^0.0.1-security", 18 | "graphql": "^15.8.0", 19 | "nodemon": "^2.0.19", 20 | "redis": "^4.2.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/server/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const { graphqlHTTP } = require('express-graphql'); 3 | const cors = require('cors'); 4 | 5 | const { 6 | GraphQLSchema, 7 | GraphQLObjectType, 8 | GraphQLString, 9 | GraphQLList, 10 | GraphQLInt, 11 | GraphQLNonNull, 12 | } = require('graphql'); 13 | 14 | const { 15 | grapherrql, 16 | eventsHandler, 17 | serveGrapherrql, 18 | } = require('../../functions/index'); 19 | const PORT = '3001'; 20 | const app = express(); 21 | 22 | app.use(cors()); 23 | //Needed for SSE 24 | app.use(express.json()); 25 | app.use(express.urlencoded({ extended: false })); 26 | 27 | const authors = [ 28 | { id: 1, name: 'J. K. Rowling' }, 29 | { id: 2, name: 'J. R. R. Tolkien' }, 30 | { id: 3, name: 'Brent Weeks' }, 31 | ]; 32 | 33 | const books = [ 34 | { id: 1, name: 'Harry Potter and the Chamber of Secrets', authorId: 1 }, 35 | { id: 2, name: 'Harry Potter and the Prisoner of Azkaban', authorId: 1 }, 36 | { id: 3, name: 'Harry Potter and the Goblet of Fire', authorId: 1 }, 37 | { id: 4, name: 'The Fellowship of the Ring', authorId: 2 }, 38 | { id: 5, name: 'The Two Towers', authorId: 2 }, 39 | { id: 6, name: 'The Return of the King', authorId: 2 }, 40 | { id: 7, name: 'The Way of Shadows', authorId: 3 }, 41 | { id: 8, name: 'Beyond the Shadows', authorId: 3 }, 42 | ]; 43 | 44 | const BookType = new GraphQLObjectType({ 45 | name: 'Book', 46 | description: 'This represents a book written by an author', 47 | fields: () => ({ 48 | id: { type: new GraphQLNonNull(GraphQLInt) }, 49 | name: { type: new GraphQLNonNull(GraphQLString) }, 50 | authorId: { type: new GraphQLNonNull(GraphQLInt) }, 51 | author: { 52 | type: AuthorType, 53 | resolve: (book) => { 54 | return authors.find((author) => author.id === book.authorId); 55 | }, 56 | }, 57 | }), 58 | }); 59 | 60 | const AuthorType = new GraphQLObjectType({ 61 | name: 'Author', 62 | description: 'This represents a author of a book', 63 | fields: () => ({ 64 | id: { type: new GraphQLNonNull(GraphQLInt) }, 65 | name: { type: new GraphQLNonNull(GraphQLString) }, 66 | books: { 67 | type: new GraphQLList(BookType), 68 | resolve: (author) => { 69 | return books.filter((book) => book.authorId === author.id); 70 | }, 71 | }, 72 | }), 73 | }); 74 | 75 | const RootQueryType = new GraphQLObjectType({ 76 | name: 'Query', 77 | description: 'Root Query', 78 | fields: () => ({ 79 | book: { 80 | type: BookType, 81 | description: 'A Single Book', 82 | args: { 83 | id: { type: GraphQLInt }, 84 | }, 85 | resolve: (parent, args) => books.find((book) => book.id === args.id), 86 | }, 87 | books: { 88 | type: new GraphQLList(BookType), 89 | description: 'List of All Books', 90 | resolve: () => books, 91 | }, 92 | authors: { 93 | type: new GraphQLList(AuthorType), 94 | description: 'List of All Authors', 95 | resolve: () => authors, 96 | }, 97 | author: { 98 | type: AuthorType, 99 | description: 'A Single Author', 100 | args: { 101 | id: { type: GraphQLInt }, 102 | }, 103 | resolve: (parent, args) => 104 | authors.find((author) => author.id === args.id), 105 | }, 106 | }), 107 | }); 108 | 109 | const RootMutationType = new GraphQLObjectType({ 110 | name: 'Mutation', 111 | description: 'Root Mutation', 112 | fields: () => ({ 113 | addBook: { 114 | type: BookType, 115 | description: 'Add a book', 116 | args: { 117 | name: { type: new GraphQLNonNull(GraphQLString) }, 118 | authorId: { type: new GraphQLNonNull(GraphQLInt) }, 119 | }, 120 | resolve: (parent, args) => { 121 | const book = { 122 | id: books.length + 1, 123 | name: args.name, 124 | authorId: args.authorId, 125 | }; 126 | books.push(book); 127 | return book; 128 | }, 129 | }, 130 | addAuthor: { 131 | type: AuthorType, 132 | description: 'Add an author', 133 | args: { 134 | name: { type: new GraphQLNonNull(GraphQLString) }, 135 | }, 136 | resolve: (parent, args) => { 137 | const author = { id: authors.length + 1, name: args.name }; 138 | authors.push(author); 139 | return author; 140 | }, 141 | }, 142 | }), 143 | }); 144 | 145 | const schema = new GraphQLSchema({ 146 | query: RootQueryType, 147 | mutation: RootMutationType, 148 | }); 149 | 150 | //GraphQL base endpoint. Middleware called before GraphQL processing to capture and forward the Query to GraphERRQL for LiveMode logging. The 'extensions' prop on GraphQL return statement captures and forwards the GraphQL response. Both cases utilize SSE connection setup by 'eventsHandler' 151 | app.use('/graphql', grapherrql(graphqlHTTP, schema)); 152 | 153 | //Setup SSE (Server-Sent-Events) endpoint. GraphERRQL will setup conn to this upon initial render, connection will persist. 154 | app.get('/events', eventsHandler); 155 | 156 | //Referencing local files to serve to GraphERRQL. Deployment will see Host Apps referencing node-modules dynamically rather than looking for these files locally. 157 | //for dev environment only - this var would be imported from grapherrql npm package normally 158 | const directoryPath = '../../build'; 159 | app.use(express.static(directoryPath)); 160 | //serve up grapherrql GUI & trigger SSE connection when opening browser to /grapherrql endpoint 161 | 162 | //for dev environment only - this var would be imported from grapherrql npm package normally 163 | const defaultFilePath = '../../build/index.html'; 164 | app.get('/grapherrql', serveGrapherrql(PORT, defaultFilePath)); 165 | 166 | app.listen(PORT, () => console.log(`Server Running on ${PORT}`)); 167 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | max-width: 70rem; 3 | margin: 10rem auto; 4 | } 5 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/src/App.js: -------------------------------------------------------------------------------- 1 | import './App.css'; 2 | import React, { useState } from 'react'; 3 | 4 | 5 | import styled from 'styled-components'; 6 | const MainContainer = styled.div` 7 | display: flex; 8 | flex-direction: column; 9 | justify-content: space-between; 10 | `; 11 | 12 | const ButtonContainer = styled.div` 13 | display: flex; 14 | align-items: center; 15 | justify-content: center; 16 | `; 17 | 18 | const Button = styled.button` 19 | display: flex; 20 | align-items: center; 21 | justify-content: center; 22 | border-radius: 3px; 23 | padding: 0.5rem 0; 24 | margin: 0.5rem 1rem; 25 | width: 11rem; 26 | background: transparent; 27 | color: black; 28 | border: 2px solid black; 29 | `; 30 | 31 | const ResponseData = styled.div` 32 | display: flex; 33 | align-items: center; 34 | justify-content: center; 35 | border: 2px solid black; 36 | min-height: 85vh; 37 | `; 38 | 39 | const BOOKS_QUERY = ` 40 | { 41 | books { 42 | name 43 | id 44 | } 45 | } 46 | `; 47 | const AUTHORS_QUERY = ` 48 | { 49 | authors { 50 | name 51 | } 52 | } 53 | `; 54 | 55 | const AUTHORS_BDAY_QUERY = ` 56 | 57 | { 58 | authors { 59 | birthday 60 | } 61 | }`; 62 | 63 | function App() { 64 | 65 | 66 | const [response, setResponse] = useState([]); 67 | const [birthday, setBirthday] = useState({}); 68 | 69 | const queryBooks = () => { 70 | fetch('http://localhost:3001/graphql', { 71 | method: 'POST', 72 | headers: { 73 | 'Content-Type': 'application/json', 74 | }, 75 | body: JSON.stringify({ query: BOOKS_QUERY }), 76 | }) 77 | .then((response) => response.json()) 78 | .then((data) => setResponse(data)); 79 | }; 80 | const queryAuthors = () => { 81 | fetch('http://localhost:3001/graphql', { 82 | method: 'POST', 83 | headers: { 'Content-Type': 'application/json' }, 84 | body: JSON.stringify({ query: AUTHORS_QUERY }), 85 | }) 86 | .then((response) => response.json()) 87 | .then((data) => setResponse(data)); 88 | }; 89 | const queryAuthorsBday = () => { 90 | fetch('http://localhost:3001/graphql', { 91 | method: 'POST', 92 | headers: { 'Content-Type': 'application/json' }, 93 | body: JSON.stringify({ query: AUTHORS_BDAY_QUERY }), 94 | }) 95 | .then((response) => response.json()) 96 | .then((data) => setResponse(data)); 97 | }; 98 | 99 | const queryAuthorsBday2 = () => { 100 | fetch('http://localhost:3001/graphql', { 101 | method: 'POST', 102 | headers: { 'Content-Type': 'application/json' }, 103 | body: JSON.stringify({ query: AUTHORS_BDAY_QUERY }), 104 | }) 105 | .then((response) => response.json()) 106 | .then((data) => { 107 | // console.log('BIRTHDAY OBJ: ', data); 108 | setBirthday(data); 109 | }); 110 | }; 111 | 112 | const resetBirthdayState = () => { 113 | setBirthday({}); 114 | }; 115 | 116 | return ( 117 |
118 | 119 | 120 | 121 | 122 | 123 | 126 | 127 | 128 | 129 | 130 | {birthday.errors ? ( 131 | <> 132 |

The Author's birthday is:

133 |

{birthday.day}

134 | 135 | ) : ( 136 | JSON.stringify(response) 137 | )} 138 |
139 |
140 |
141 | ); 142 | } 143 | 144 | export default App; 145 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/src/index.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/GraphErrQL/2f9a61a8b192d7f1993a2eb5813b6924af477730/grapherrql-package/host-app/src/index.css -------------------------------------------------------------------------------- /grapherrql-package/host-app/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById('root')); 8 | root.render( 9 | 10 | 11 | 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /grapherrql-package/host-app/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /grapherrql-package/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grapherrql", 3 | "version": "0.1.9", 4 | "description": "graphql IDE", 5 | "main": "./dist/index.ts", 6 | "types": "./dist/index.d.ts", 7 | "files": [ 8 | "dist" 9 | ], 10 | "scripts": { 11 | "start": "react-scripts start", 12 | "build": "react-scripts build", 13 | "builduipackage": "tsc -p ./packageScripts/tsconfig.json --outDir ./package && tsc -p ./scripts/tsconfig.json && node ./scripts/createPackage.js", 14 | "test": "react-scripts test", 15 | "eject": "react-scripts eject" 16 | }, 17 | "eslintConfig": { 18 | "extends": [ 19 | "react-app", 20 | "react-app/jest" 21 | ] 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 | "devDependencies": { 36 | "@types/fs-extra": "^9.0.13" 37 | }, 38 | "keywords": [ 39 | "grapherrql", 40 | "grapherrql-express", 41 | "graphql error handling", 42 | "graphql error tool", 43 | "graphql", 44 | "graphql express dev tool", 45 | "graphql-express" 46 | ], 47 | "author": "pandaWhale", 48 | "license": "MIT", 49 | "dependencies": { 50 | "@babel/preset-env": "^7.18.2", 51 | "@babel/preset-react": "^7.17.12", 52 | "@testing-library/jest-dom": "^5.16.4", 53 | "@testing-library/react": "^13.3.0", 54 | "@testing-library/user-event": "^13.5.0", 55 | "@types/jest": "^27.5.2", 56 | "@types/node": "^16.11.41", 57 | "@types/react": "^18.0.14", 58 | "@types/react-dom": "^18.0.5", 59 | "babel-loader": "^8.2.5", 60 | "codemirror-addon-lint-fix": "^1.1.0", 61 | "codemirror-graphql": "^1.3.2", 62 | "express": "^4.18.1", 63 | "express-graphql": "^0.12.0", 64 | "fs-extra": "^10.1.0", 65 | "global": "^4.4.0", 66 | "graphql": "^15.8.0", 67 | "process": "^0.11.10", 68 | "react": "^16.14.0", 69 | "react-animations": "^1.0.0", 70 | "react-codemirror2": "^7.2.1", 71 | "react-dom": "^17.0.2", 72 | "react-icons": "^4.4.0", 73 | "react-scripts": "^5.0.1", 74 | "styled-components": "^5.3.5", 75 | "ts-loader": "^9.3.0", 76 | "typescript": "^4.7.4", 77 | "web-vitals": "^2.1.4" 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /grapherrql-package/packageScripts/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | 3 | const directoryPath = __dirname; 4 | const defaultFilePath = path.join(directoryPath, 'index.html'); 5 | 6 | export { directoryPath, defaultFilePath }; 7 | -------------------------------------------------------------------------------- /grapherrql-package/packageScripts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | // "incremental": true, /* Enable incremental compilation */ 5 | "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, 6 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, 7 | // "lib": [], /* Specify library files to be included in the compilation. */ 8 | // "allowJs": true, /* Allow javascript files to be compiled. */ 9 | // "checkJs": true, /* Report errors in .js files. */ 10 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 11 | "declaration": true /* Generates corresponding '.d.ts' file. */, 12 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 13 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 14 | // "outFile": "./", /* Concatenate and emit output to single file. */ 15 | // "outDir": "./", /* Redirect output structure to the directory. */ 16 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 17 | // "composite": true, /* Enable project compilation */ 18 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 19 | // "removeComments": true, /* Do not emit comments to output. */ 20 | // "noEmit": true, /* Do not emit outputs. */ 21 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 22 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 23 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 24 | 25 | /* Strict Type-Checking Options */ 26 | "strict": true /* Enable all strict type-checking options. */, 27 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 28 | // "strictNullChecks": true, /* Enable strict null checks. */ 29 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 30 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 31 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 32 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 33 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 34 | 35 | /* Additional Checks */ 36 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 37 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 38 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 39 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 40 | 41 | /* Module Resolution Options */ 42 | "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, 43 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 44 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 45 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 46 | // "typeRoots": [], /* List of folders to include type definitions from. */ 47 | "types": [ 48 | "node" 49 | ] /* Type declaration files to be included in compilation. */, 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 54 | 55 | /* Source Map Options */ 56 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 59 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 60 | 61 | /* Experimental Options */ 62 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 63 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 64 | 65 | /* Advanced Options */ 66 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 67 | }, 68 | "include": ["index.ts"] 69 | } 70 | -------------------------------------------------------------------------------- /grapherrql-package/public/NewSpaceLogo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/GraphErrQL/2f9a61a8b192d7f1993a2eb5813b6924af477730/grapherrql-package/public/NewSpaceLogo.ico -------------------------------------------------------------------------------- /grapherrql-package/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 21 | 22 | 30 | GraphErrQl 31 | 34 | 35 | 36 | 37 |
38 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /grapherrql-package/public/logonowords.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/GraphErrQL/2f9a61a8b192d7f1993a2eb5813b6924af477730/grapherrql-package/public/logonowords.ico -------------------------------------------------------------------------------- /grapherrql-package/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /grapherrql-package/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * -------------------------------------------------------------------------------- /grapherrql-package/scripts/createPackage.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | var desc = Object.getOwnPropertyDescriptor(m, k); 5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 6 | desc = { enumerable: true, get: function() { return m[k]; } }; 7 | } 8 | Object.defineProperty(o, k2, desc); 9 | }) : (function(o, m, k, k2) { 10 | if (k2 === undefined) k2 = k; 11 | o[k2] = m[k]; 12 | })); 13 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 14 | Object.defineProperty(o, "default", { enumerable: true, value: v }); 15 | }) : function(o, v) { 16 | o["default"] = v; 17 | }); 18 | var __importStar = (this && this.__importStar) || function (mod) { 19 | if (mod && mod.__esModule) return mod; 20 | var result = {}; 21 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 22 | __setModuleDefault(result, mod); 23 | return result; 24 | }; 25 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 26 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 27 | return new (P || (P = Promise))(function (resolve, reject) { 28 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 29 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 30 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 31 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 32 | }); 33 | }; 34 | var __generator = (this && this.__generator) || function (thisArg, body) { 35 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 36 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 37 | function verb(n) { return function (v) { return step([n, v]); }; } 38 | function step(op) { 39 | if (f) throw new TypeError("Generator is already executing."); 40 | while (_) try { 41 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 42 | if (y = 0, t) op = [op[0] & 2, t.value]; 43 | switch (op[0]) { 44 | case 0: case 1: t = op; break; 45 | case 4: _.label++; return { value: op[1], done: false }; 46 | case 5: _.label++; y = op[1]; op = [0]; continue; 47 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 48 | default: 49 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 50 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 51 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 52 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 53 | if (t[2]) _.ops.pop(); 54 | _.trys.pop(); continue; 55 | } 56 | op = body.call(thisArg, _); 57 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 58 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 59 | } 60 | }; 61 | Object.defineProperty(exports, "__esModule", { value: true }); 62 | var fs = __importStar(require("fs-extra")); 63 | var path = __importStar(require("path")); 64 | var packageJsonPath = path.join(__dirname, '..', 'package.json'); 65 | var buildPath = path.join(__dirname, '..', 'build'); 66 | var uiPackagePath = path.join(__dirname, '..', 'package'); 67 | var indexJsPath = path.join(uiPackagePath, 'index.js'); 68 | var indexDtsPath = path.join(uiPackagePath, 'index.d.ts'); 69 | function main() { 70 | return __awaiter(this, void 0, void 0, function () { 71 | var ex_1, ex_2, e_1, packageJsonObj, name_1, version, description, keywords, author, repository, license, publishConfig, newPackageJson, newPackageJsonFilePath, e_2; 72 | return __generator(this, function (_a) { 73 | switch (_a.label) { 74 | case 0: 75 | console.log("Verifying ".concat(indexJsPath, " exists")); 76 | _a.label = 1; 77 | case 1: 78 | _a.trys.push([1, 3, , 4]); 79 | return [4 /*yield*/, fs.ensureFile(indexJsPath)]; 80 | case 2: 81 | _a.sent(); 82 | return [3 /*break*/, 4]; 83 | case 3: 84 | ex_1 = _a.sent(); 85 | throw new Error("".concat(indexJsPath, " did not exist.")); 86 | case 4: 87 | console.log("Verifying ".concat(indexDtsPath, " exists")); 88 | _a.label = 5; 89 | case 5: 90 | _a.trys.push([5, 7, , 8]); 91 | return [4 /*yield*/, fs.ensureFile(indexDtsPath)]; 92 | case 6: 93 | _a.sent(); 94 | return [3 /*break*/, 8]; 95 | case 7: 96 | ex_2 = _a.sent(); 97 | throw new Error("".concat(indexDtsPath, " did not exist.")); 98 | case 8: 99 | console.log("Copy: ".concat(buildPath, " to ").concat(uiPackagePath)); 100 | _a.label = 9; 101 | case 9: 102 | _a.trys.push([9, 12, , 13]); 103 | return [4 /*yield*/, fs.ensureDir(buildPath)]; 104 | case 10: 105 | _a.sent(); 106 | return [4 /*yield*/, fs.copy(buildPath, uiPackagePath)]; 107 | case 11: 108 | _a.sent(); 109 | return [3 /*break*/, 13]; 110 | case 12: 111 | e_1 = _a.sent(); 112 | throw e_1; 113 | case 13: 114 | console.log("Reading package.json from: ".concat(packageJsonPath)); 115 | _a.label = 14; 116 | case 14: 117 | _a.trys.push([14, 17, , 18]); 118 | return [4 /*yield*/, fs.readJson(packageJsonPath)]; 119 | case 15: 120 | packageJsonObj = _a.sent(); 121 | name_1 = packageJsonObj.name, version = packageJsonObj.version, description = packageJsonObj.description, keywords = packageJsonObj.keywords, author = packageJsonObj.author, repository = packageJsonObj.repository, license = packageJsonObj.license, publishConfig = packageJsonObj.publishConfig; 122 | console.log("Found name: ".concat(name_1, " version: ").concat(version)); 123 | newPackageJson = { 124 | name: name_1, 125 | version: version, 126 | description: description, 127 | keywords: keywords, 128 | author: author, 129 | repository: repository, 130 | license: license, 131 | main: 'index.js', 132 | typings: 'index.d.ts', 133 | publishConfig: publishConfig, 134 | }; 135 | newPackageJsonFilePath = path.join(uiPackagePath, 'package.json'); 136 | console.log("Writing new package.json to ".concat(newPackageJsonFilePath)); 137 | return [4 /*yield*/, fs.writeJson(newPackageJsonFilePath, newPackageJson, { 138 | spaces: ' ', 139 | })]; 140 | case 16: 141 | _a.sent(); 142 | return [3 /*break*/, 18]; 143 | case 17: 144 | e_2 = _a.sent(); 145 | throw e_2; 146 | case 18: return [2 /*return*/]; 147 | } 148 | }); 149 | }); 150 | } 151 | main(); 152 | process.on('unhandledRejection', function (e) { 153 | throw e; 154 | }); 155 | -------------------------------------------------------------------------------- /grapherrql-package/scripts/createPackage.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs-extra'; 2 | import * as path from 'path'; 3 | 4 | const packageJsonPath = path.join(__dirname, '..', 'package.json'); 5 | const buildPath = path.join(__dirname, '..', 'build'); 6 | const uiPackagePath = path.join(__dirname, '..', 'package'); 7 | const indexJsPath = path.join(uiPackagePath, 'index.js'); 8 | const indexDtsPath = path.join(uiPackagePath, 'index.d.ts'); 9 | 10 | async function main() { 11 | console.log(`Verifying ${indexJsPath} exists`); 12 | try { 13 | await fs.ensureFile(indexJsPath); 14 | } catch (ex) { 15 | throw new Error(`${indexJsPath} did not exist.`); 16 | } 17 | 18 | console.log(`Verifying ${indexDtsPath} exists`); 19 | try { 20 | await fs.ensureFile(indexDtsPath); 21 | } catch (ex) { 22 | throw new Error(`${indexDtsPath} did not exist.`); 23 | } 24 | 25 | console.log(`Copy: ${buildPath} to ${uiPackagePath}`); 26 | try { 27 | await fs.ensureDir(buildPath); 28 | await fs.copy(buildPath, uiPackagePath); 29 | } catch (e) { 30 | throw e; 31 | } 32 | 33 | console.log(`Reading package.json from: ${packageJsonPath}`); 34 | try { 35 | const packageJsonObj = await fs.readJson(packageJsonPath); 36 | const { 37 | name, 38 | version, 39 | description, 40 | keywords, 41 | author, 42 | repository, 43 | license, 44 | publishConfig, 45 | } = packageJsonObj; 46 | console.log(`Found name: ${name} version: ${version}`); 47 | 48 | const newPackageJson = { 49 | name, 50 | version, 51 | description, 52 | keywords, 53 | author, 54 | repository, 55 | license, 56 | main: 'index.js', 57 | typings: 'index.d.ts', 58 | publishConfig, 59 | }; 60 | 61 | const newPackageJsonFilePath = path.join(uiPackagePath, 'package.json'); 62 | console.log(`Writing new package.json to ${newPackageJsonFilePath}`); 63 | await fs.writeJson(newPackageJsonFilePath, newPackageJson, { 64 | spaces: ' ', 65 | }); 66 | } catch (e) { 67 | throw e; 68 | } 69 | } 70 | 71 | main(); 72 | 73 | process.on('unhandledRejection', (e) => { 74 | throw e; 75 | }); 76 | -------------------------------------------------------------------------------- /grapherrql-package/scripts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | // "incremental": true, /* Enable incremental compilation */ 5 | "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, 6 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, 7 | // "lib": [], /* Specify library files to be included in the compilation. */ 8 | // "allowJs": true, /* Allow javascript files to be compiled. */ 9 | // "checkJs": true, /* Report errors in .js files. */ 10 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 11 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 12 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 13 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 14 | // "outFile": "./", /* Concatenate and emit output to single file. */ 15 | // "outDir": "./", /* Redirect output structure to the directory. */ 16 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 17 | // "composite": true, /* Enable project compilation */ 18 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 19 | // "removeComments": true, /* Do not emit comments to output. */ 20 | // "noEmit": true, /* Do not emit outputs. */ 21 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 22 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 23 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 24 | 25 | /* Strict Type-Checking Options */ 26 | "strict": true /* Enable all strict type-checking options. */, 27 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 28 | // "strictNullChecks": true, /* Enable strict null checks. */ 29 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 30 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 31 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 32 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 33 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 34 | 35 | /* Additional Checks */ 36 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 37 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 38 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 39 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 40 | 41 | /* Module Resolution Options */ 42 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 43 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 44 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 45 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 46 | // "typeRoots": [], /* List of folders to include type definitions from. */ 47 | // "types": [], /* Type declaration files to be included in compilation. */ 48 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 49 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 50 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 51 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 52 | 53 | /* Source Map Options */ 54 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 55 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 56 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 57 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 58 | 59 | /* Experimental Options */ 60 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 61 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 62 | 63 | /* Advanced Options */ 64 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 65 | }, 66 | "include": ["createPackage.ts"] 67 | } 68 | -------------------------------------------------------------------------------- /grapherrql-package/src/App.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/GraphErrQL/2f9a61a8b192d7f1993a2eb5813b6924af477730/grapherrql-package/src/App.css -------------------------------------------------------------------------------- /grapherrql-package/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import './App.css'; 3 | import Header from './components/Header'; 4 | import { GraphContextProvider } from './components/SandboxMode/Context'; 5 | import { LiveContext } from './components/LiveMode/LiveContext'; 6 | 7 | function App() { 8 | const [listening, setListening] = useState(false); 9 | const [liveQuery, setLiveQuery] = useState('Query'); 10 | const [liveResponse, setLiveResponse] = useState('Response'); 11 | const [dataLog, setDataLog] = useState([]); 12 | 13 | useEffect(() => { 14 | if (!listening) { 15 | const source = new EventSource(document.cookie.slice(10, -1)); 16 | console.log('listening for events from Host App SSE...'); 17 | source.onmessage = (event) => { 18 | const parsedData = JSON.parse(event.data); 19 | const regx = /\\n|/g; 20 | if (parsedData.query) { 21 | let str = JSON.stringify(parsedData.timestamp).concat( 22 | JSON.stringify(parsedData.query).replace(regx, '') 23 | ); 24 | setLiveQuery(str); 25 | setDataLog((prev: any) => [...prev, str]); 26 | } 27 | if (parsedData.data) { 28 | const str = JSON.stringify(parsedData.timestamp).concat( 29 | JSON.stringify(parsedData.data).replace(regx, '') 30 | ); 31 | setLiveResponse(str); 32 | setDataLog((prev: any) => [...prev, str]); 33 | } 34 | if (parsedData.message) { 35 | const str = JSON.stringify(parsedData.timestamp).concat( 36 | JSON.stringify(parsedData.message).replace(regx, '') 37 | ); 38 | setLiveResponse(str); 39 | setDataLog((prev: any) => [...prev, str]); 40 | } 41 | }; 42 | } 43 | }, [listening]); 44 | 45 | return ( 46 |
47 | 56 | 57 |
58 | 59 | 60 |
61 | ); 62 | } 63 | 64 | export default App; 65 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/Header.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import LoggerBox from './LiveMode/LoggerBox'; 3 | import HeaderGif from '../images/HeaderGif.gif'; 4 | import HeaderRightPic from '../images/HeaderRightPic.png' 5 | import { Logo, StyledHeader, HeaderRight } from './LiveMode/styles/Header.styled'; 6 | import { StyledBody } from './LiveMode/styles/LoggerBox.styled'; 7 | import HeaderItemContainer from './HeaderItemContainer'; 8 | import Display from './SandboxMode/Display'; 9 | 10 | function Header() { 11 | const [liveMode, setLiveMode] = useState(false); 12 | 13 | const handleToggleClick = () => { 14 | setLiveMode((previousToggle) => { 15 | return !previousToggle; 16 | }); 17 | }; 18 | 19 | return ( 20 |
21 | 22 | 23 | 27 | 28 | 29 | {liveMode ? : } 30 |
31 | ); 32 | } 33 | 34 | export default Header; 35 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/HeaderItemContainer.js: -------------------------------------------------------------------------------- 1 | import { StyledHeaderItemContainer } from './LiveMode/styles/HeaderItemContainer.styled'; 2 | import { BlinkingComponent } from './LiveMode/styles/AnimatedComponent.styled'; 3 | import { BsToggle2Off, BsToggle2On } from 'react-icons/bs'; 4 | 5 | 6 | function HeaderItemContainer({ liveMode, handleToggleClick }) { 7 | return ( 8 | <> 9 | <> 10 | 11 | 12 |

Live Mode

13 | {liveMode ? ( 14 | 15 | handleToggleClick()} 19 | /> 20 | 21 | ) : ( 22 | handleToggleClick()} 26 | /> 27 | )} 28 |

{liveMode ? 'On' : 'Off'}

29 |
30 | 31 | 32 | ); 33 | } 34 | 35 | export default HeaderItemContainer; 36 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/ErrorResponseBox.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { ErrorResponseDropdown } from './styles/ErrorResponseBox.styled'; 3 | 4 | function ErrorResponseBox(props) { 5 | return ( 6 |
7 | {props.response} 8 |
9 | ); 10 | } 11 | 12 | export default ErrorResponseBox; 13 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/LiveContext.js: -------------------------------------------------------------------------------- 1 | import React, { createContext, useState } from 'react'; 2 | 3 | export const LiveContext = createContext({}); 4 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/Log.js: -------------------------------------------------------------------------------- 1 | import { React, useState } from 'react'; 2 | import ErrorResponseBox from './ErrorResponseBox'; 3 | import { StyledSuccessLog, StyledErrorLogNoResponse, StyledErrorLogWithResponse } from './styles/Log.styled'; 4 | 5 | function Log(props) { 6 | const [errorResponseBox, setErrorResponseBox] = useState(false); 7 | 8 | const handleClickSuccess = () => { 9 | console.log(' Success clicked!'); 10 | }; 11 | const handleClickError = () => { 12 | setErrorResponseBox((current) => !current); 13 | }; 14 | 15 | //} 16 | return ( 17 |
18 | {props.success ? ( 19 |
20 | 21 | SUCCESS: {props.success} 22 |   23 | {props.query} 24 |   25 | {props.response} 26 | 27 |
28 | ) : errorResponseBox ? ( 29 |
30 |
31 | 32 | ERROR: {props.success} 33 |   34 | {props.query} 35 | 36 |
37 | 38 |
39 | {errorResponseBox && } 40 |
41 |
42 | ) : ( 43 |
44 |
45 | 46 | ERROR: {props.success} 47 |   48 | {props.query} 49 | 50 |
51 |
52 | )} 53 |
54 | ); 55 | } 56 | 57 | export default Log; 58 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/LoggerBox.js: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | 3 | import { LiveContext } from '../LiveMode/LiveContext'; 4 | import { 5 | DataContainer, 6 | IncomingDataContainer, 7 | TextContainer, 8 | ErrorTextContainer, 9 | CurrentLog, 10 | LogContainer, 11 | } from './styles/LoggerResponse.styled'; 12 | 13 | function LoggerBox() { 14 | const { liveQuery, liveResponse, dataLog } = useContext(LiveContext); 15 | 16 | const regexRemove = /"/g; 17 | const regexColon = /:/g; 18 | 19 | const liveQueryParsed = liveQuery 20 | .slice(13) 21 | .replace(regexRemove, ``) 22 | .replace(regexColon, ` `); 23 | const liveResponseParsed = liveResponse 24 | .slice(13) 25 | .replace(regexRemove, ``) 26 | .replace(regexColon, ` `); 27 | 28 | let logQueue = []; 29 | const displayDataLog = dataLog 30 | .slice(0, -2) 31 | .reverse() 32 | .map((qR) => { 33 | logQueue.push(qR); 34 | console.log(`LOGQUEUE UPDATE: ${JSON.stringify(logQueue)}`); 35 | if (logQueue.length === 2) { 36 | const items = logQueue; 37 | logQueue = []; 38 | const timestamp = new Date( 39 | parseInt(String(items[0]).slice(0, 13)) 40 | ).toString(); 41 | return ( 42 |
43 | 44 | {String(items[1]).slice(15, 20) === 'query' ? ( 45 | 46 |
47 |

{timestamp}

48 |

{items[1].slice(13)}

49 |
50 |
51 | ) : String(items[1]).slice(15, 22) === 'message' ? ( 52 | 53 |

{items[1].slice(13)}

54 |
55 | ) : ( 56 | 57 |

{items[1].slice(13)}

58 |
59 | )} 60 | {String(items[0]).slice(15, 20) === 'query' ? ( 61 | 62 |
63 |

{timestamp}

64 |

{items[0].slice(13)}

65 |
66 |
67 | ) : String(items[0]).slice(15, 22) === 'message' ? ( 68 | 69 |

{items[0].slice(13)}

70 |
71 | ) : ( 72 | 73 |

{items[0].slice(13)}

74 |
75 | )} 76 |
77 |

78 |
79 | ); 80 | } else return <>; 81 | }); 82 | return ( 83 | <> 84 | 85 | 86 |

Latest Log from {document.cookie.slice(10, -7)}

87 | 88 | 89 | {liveResponse.length > 8 ? ( 90 |

91 | Query Processing Time:{' '} 92 | {(liveResponse.slice(0, 13) - liveQuery.slice(0, 13)) / 1000}{' '} 93 | seconds 94 |

95 | ) : ( 96 |

Waiting for Events from Host App...

97 | )} 98 |
99 | 100 |

{liveQueryParsed}

101 |
102 | {String(liveResponseParsed).slice(1, 8) === 'message' ? ( 103 | {liveResponse.slice(13)} 104 | ) : ( 105 | 106 |

{liveResponseParsed}

107 |
108 | )} 109 |
110 |

Past Logs

111 |

{displayDataLog}

112 |
113 |
114 | 115 | ); 116 | } 117 | export default LoggerBox; 118 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/SuccessResponseBox.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { SuccessResponseDropdown } from './styles/SuccessResponseBox.styled'; 3 | 4 | function SuccessResponseBox(props) { 5 | return ( 6 |
7 | {props.response} 8 |
9 | ); 10 | } 11 | 12 | export default SuccessResponseBox; 13 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/Websocket.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { useState, useRef } from 'react'; 3 | 4 | export const WsFunc = () => { 5 | const [val, setVal] = useState(null); 6 | const ws = useRef(null); 7 | 8 | useEffect(() => { 9 | const clientWebSocket = new WebSocket('wss://localhost:3001/'); 10 | clientWebSocket.addEventListener('connection', function (event) { 11 | clientWebSocket.send('Connect from client successful'); 12 | }); 13 | 14 | // clientWebSocket.onopen = () => { 15 | // console.log('client websocket opened'); 16 | // }; 17 | // clientWebSocket.onclose = () => { 18 | // console.log('client websocket closed'); 19 | // }; 20 | 21 | // clientWebSocket.onmessage = (event) => { 22 | // console.log('recieved message', JSON.parse(event.data)); 23 | // setVal(event.data); 24 | // }; 25 | clientWebSocket.addEventListener('open', function (event) { 26 | console.log('Connected to WS server'); 27 | }); 28 | clientWebSocket.addEventListener('close', function (event) { 29 | console.log('Connection to WS server is closed'); 30 | }); 31 | 32 | clientWebSocket.addEventListener('message', function (event) { 33 | console.log('Message from server ', JSON.parse(event.data).message); 34 | // setVal(event.data); 35 | }); 36 | let i = 0; 37 | setVal(i++); 38 | 39 | ws.current = clientWebSocket; 40 | 41 | console.log('WS Current: ', ws.current); 42 | // return () => { 43 | // clientWebSocket.close(); 44 | // }; 45 | }, []); 46 | return
Value: {val}
; 47 | }; 48 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/AnimatedComponent.styled.js: -------------------------------------------------------------------------------- 1 | import styled, { keyframes } from 'styled-components'; 2 | 3 | const blinkingEffect = () => { 4 | return keyframes` 5 | 50% { 6 | opacity: 0; 7 | } 8 | `; 9 | }; 10 | 11 | export const BlinkingComponent = styled.div` 12 | animation: ${blinkingEffect} 1.8s linear infinite; 13 | `; 14 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/Display.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const DisplaySandbox = styled.div` 4 | display: flex; 5 | flex-wrap: nowrap; 6 | flex-direction: row; 7 | `; 8 | 9 | export const QuerySandbox = styled.div` 10 | width: 50%; 11 | margin: 2px; 12 | margin-right: 20px; 13 | margin-left: 20px; 14 | box-shadow: 10px 10px black; 15 | border: 2px solid black; 16 | border-radius: 0px; 17 | `; 18 | 19 | export const ResponseSandbox = styled.div` 20 | width: 50%; 21 | margin: 2px; 22 | border: 2px solid black; 23 | box-shadow: 10px 10px black; 24 | `; 25 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/ErrorResponseBox.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ErrorResponseDropdown = styled.pre` 4 | background-color: #e9eef0; 5 | border: 7px solid #ff1616; 6 | border-top: 0px; 7 | border-radius: 0px 0px 20px 20px; 8 | padding: 15px 15px; 9 | color: black; 10 | margin-top: 0px; 11 | margin-right: 0px; 12 | margin-left: 0px; 13 | font-size: 1.25em; 14 | `; 15 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/Header.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | 4 | export const StyledHeader = styled.header` 5 | display: flex; 6 | justify-content: space-between; 7 | font-family: 'Gagalin', sans-serif; 8 | font-size: large; 9 | color: white; 10 | background-color: #003845; 11 | padding: 15px 15px 15px 15px; 12 | /* justify-content: space-evenly; */ 13 | border: 7px solid #078aa8; 14 | `; 15 | 16 | export const Logo = styled.img` 17 | display: flex; 18 | object-fit: contain; 19 | height: 200px; 20 | /* margin-right: 10px; */ 21 | `; 22 | 23 | export const HeaderRight = styled.img` 24 | display: flex; 25 | object-fit: contain; 26 | height: 200px; 27 | 28 | ` 29 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/HeaderItemContainer.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const StyledHeaderItemContainer = styled.div` 4 | display: flex; 5 | flex-direction: column; 6 | justify-content: space-between; 7 | align-items: center; 8 | background-color: #003845; 9 | `; 10 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/LMInputBox.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const StyledLMInputBox = styled.pre` 4 | background-color: #e9eef0; 5 | border: 7px solid #078aa8; 6 | color: black; 7 | border-radius: 20px; 8 | padding: 15px 15px; 9 | font-size: 1.25em; 10 | display: inline-block; 11 | min-height: 70vh; 12 | `; 13 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/LMOutputBox.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const StyledLMResponseBox = styled.pre` 4 | background-color: #e9eef0; 5 | border: 7px solid #078aa8; 6 | color: black; 7 | border-radius: 20px; 8 | padding: 15px 15px; 9 | font-size: 1.25em; 10 | display: inline-block; 11 | min-height: 70vh; 12 | `; 13 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/LoggerBox.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const StyledBody = styled.div` 4 | background-color: #003845; 5 | border: 7px solid #078aa8; 6 | color: #ffffff; 7 | padding: 15px 15px; 8 | min-height: 70vh; 9 | margin: 10px 0px 0px 0px; 10 | `; 11 | 12 | export const Button = styled.button` 13 | background-color: #078aa8; 14 | border: 4px solid #ffffff; 15 | color: #003845; 16 | font-size: 1em; 17 | padding: 15px 15px; 18 | border-radius: 20px; 19 | `; 20 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/LoggerResponse.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const StyledSuccessNoResponse = styled.div` 4 | display: flex; 5 | flex-direction: column; 6 | flex-wrap: wrap; 7 | max-width: 87.25vw; 8 | background-color: #e9eef0; 9 | // border: 7px solid #5a79af; 10 | color: black; 11 | // border-radius: 20px; 12 | padding: 15px 15px; 13 | `; 14 | export const DataContainer = styled.div` 15 | display: grid; 16 | `; 17 | 18 | export const IncomingDataContainer = styled.div` 19 | padding: 1rem; 20 | display: grid; 21 | grid-gap: 1em; 22 | `; 23 | 24 | export const TextContainer = styled.div``; 25 | 26 | export const BottomLogContainer = styled.div` 27 | border: 7px solid #078aa8; 28 | border-top: 0px; 29 | `; 30 | 31 | export const TopLogContainer = styled.div` 32 | border: 7px solid #078aa8; 33 | border-bottom: 0px; 34 | `; 35 | 36 | export const ErrorTextContainer = styled.div` 37 | background-color: #e9eef0; 38 | border: 7px solid #ff1616; 39 | color: black; 40 | border-radius: 20px; 41 | padding: 10px; 42 | font-size: 1.15em; 43 | `; 44 | 45 | export const CurrentLog = styled.div` 46 | display: flex; 47 | flex-direction: column; 48 | flex-wrap: wrap; 49 | max-width: 87.25vw; 50 | background-color: #e9eef0; 51 | border: 7px solid #078aa8; 52 | color: black; 53 | padding: 15px 15px; 54 | box-shadow: 10px 10px black; 55 | `; 56 | 57 | export const LogContainer = styled.div` 58 | display: flex; 59 | flex-direction: column; 60 | flex-wrap: wrap; 61 | max-width: 87.25vw; 62 | background-color: #e9eef0; 63 | border: 7px solid #078aa8; 64 | color: black; 65 | padding: 15px 15px; 66 | box-shadow: 10px 10px black; 67 | `; 68 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/LiveMode/styles/SuccessResponseBox.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const SuccessResponseDropdown = styled.pre` 4 | background-color: #e9eef0; 5 | // border: 7px solid #078aa8; 6 | border-top: 0px; 7 | // border-radius: 0px 0px 20px 20px; 8 | padding: 15px 15px; 9 | color: black; 10 | margin-top: 0px; 11 | font-size: 1.25em; 12 | `; 13 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/SandboxMode/Context.jsx: -------------------------------------------------------------------------------- 1 | import { createContext, useState } from 'react'; 2 | 3 | export const GraphContext = createContext(); 4 | 5 | export const GraphContextProvider = (props) => { 6 | const [info, setInfo] = useState({ 7 | uri: '', 8 | body: '', 9 | response: '', 10 | }); 11 | 12 | return {props.children}; 13 | }; -------------------------------------------------------------------------------- /grapherrql-package/src/components/SandboxMode/Display.jsx: -------------------------------------------------------------------------------- 1 | 2 | import ResponseBox from './ResponseBox'; 3 | import QueryBox from './QueryBox'; 4 | import APIInput from './RunQuery' 5 | import { DisplaySandbox, QuerySandbox, ResponseSandbox } from '../LiveMode/styles/Display.styled'; 6 | 7 | export default function Display() { 8 | return ( 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/SandboxMode/QueryBox.jsx: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { Controlled as CodeMirror } from 'react-codemirror2'; 3 | import { GraphContext } from './Context'; 4 | 5 | import 'codemirror/mode/xml/xml'; 6 | import 'codemirror/mode/javascript/javascript' 7 | import 'codemirror/lib/codemirror.css'; 8 | import 'codemirror/addon/hint/show-hint'; 9 | import 'codemirror/addon/lint/lint'; 10 | import 'codemirror-graphql/hint'; 11 | import 'codemirror-graphql/lint'; 12 | import 'codemirror-graphql/mode'; 13 | import 'codemirror/mode/jsx/jsx'; 14 | import 'codemirror/addon/edit/closebrackets'; 15 | 16 | const QueryEditor = () => { 17 | const [info, setInfo] = useContext(GraphContext); 18 | 19 | const onChange = (editor, data, value) => { 20 | setInfo(() => ({ 21 | ...info, 22 | body: value, 23 | })); 24 | }; 25 | 26 | return ( 27 | <> 28 | { 36 | // final value 37 | }} 38 | /> 39 | 40 | ); 41 | }; 42 | 43 | export default QueryEditor; -------------------------------------------------------------------------------- /grapherrql-package/src/components/SandboxMode/ResponseBox.jsx: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { Controlled as CodeMirror } from 'react-codemirror2'; 3 | import { GraphContext } from './Context'; 4 | import 'codemirror/mode/javascript/javascript' 5 | import 'codemirror/lib/codemirror.css'; 6 | import 'codemirror/addon/hint/show-hint'; 7 | import 'codemirror/addon/lint/lint'; 8 | import 'codemirror-graphql/hint'; 9 | import 'codemirror-graphql/lint'; 10 | import 'codemirror-graphql/mode'; 11 | import 'codemirror/mode/jsx/jsx'; 12 | import 'codemirror/addon/edit/closebrackets'; 13 | 14 | import ('codemirror/mode/xml/xml'); 15 | 16 | 17 | 18 | function ResponseBox() { 19 | const [info, setInfo] = useContext(GraphContext); 20 | 21 | return ( 22 | <> 23 | { 31 | value = info.response; 32 | }} 33 | onChange={(editor, metadata, value) => { 34 | value = info.response; 35 | }} 36 | /> 37 | 38 | ); 39 | } 40 | 41 | export default ResponseBox 42 | -------------------------------------------------------------------------------- /grapherrql-package/src/components/SandboxMode/RunQuery.js: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { GraphContext } from './Context'; 3 | import { BsPlayCircle } from 'react-icons/bs'; 4 | 5 | const RunQuery = () => { 6 | const [info, setInfo] = useContext(GraphContext); 7 | 8 | function handleClick(e) { 9 | e.preventDefault(); 10 | 11 | let APIURI = window.location.origin + '/graphql/'; 12 | 13 | const handleInput = () => { 14 | fetch(`${APIURI}`, { 15 | method: 'POST', 16 | headers: { 17 | 'Content-Type': 'application/json', 18 | }, 19 | body: JSON.stringify({ 20 | query: `${info.body}`, 21 | }), 22 | }) 23 | .then((res) => res.json()) 24 | .then((res) => { 25 | setInfo(() => ({ 26 | ...info, 27 | response: res.data 28 | })); 29 | }) 30 | .catch((err) => { 31 | setInfo(() => ({ 32 | ...info, 33 | response: 'Sorry, your request failed', 34 | })); 35 | }); 36 | }; 37 | 38 | const handleInvalidInput = () => { 39 | setInfo(() => ({ 40 | ...info, 41 | response: 'Please start with query or mutation', 42 | })); 43 | }; 44 | 45 | if ( 46 | info.body.substring(0, 5).toLowerCase() === 'query' || 47 | info.body.substring(0, 8).toLowerCase() === 'mutation' || 48 | info.body[0] === '{' 49 | ) { 50 | handleInput(); 51 | } else { 52 | handleInvalidInput(); 53 | } 54 | } 55 | 56 | return ( 57 |
58 | 66 | 67 |
68 | ); 69 | } 70 | 71 | export default RunQuery; 72 | -------------------------------------------------------------------------------- /grapherrql-package/src/images/HeaderGif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/GraphErrQL/2f9a61a8b192d7f1993a2eb5813b6924af477730/grapherrql-package/src/images/HeaderGif.gif -------------------------------------------------------------------------------- /grapherrql-package/src/images/HeaderRightPic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/GraphErrQL/2f9a61a8b192d7f1993a2eb5813b6924af477730/grapherrql-package/src/images/HeaderRightPic.png -------------------------------------------------------------------------------- /grapherrql-package/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 | -------------------------------------------------------------------------------- /grapherrql-package/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById('root') 12 | ); 13 | -------------------------------------------------------------------------------- /grapherrql-package/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "esModuleInterop": true, 8 | "allowSyntheticDefaultImports": true, 9 | "strict": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "noFallthroughCasesInSwitch": true, 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"] 20 | } 21 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GraphERR-QL", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": {} 6 | } 7 | --------------------------------------------------------------------------------