├── .gitignore
├── CONTRIBUTING.MD
├── LICENSE
├── README.md
├── __tests__
├── components
│ └── home.js
└── goTrace
│ ├── goTrace.test.js
│ ├── graphql.js
│ ├── jest.config.js
│ ├── package-lock.json
│ └── package.json
├── screenshots
├── Insights-hover.gif
├── Reset.gif
├── Trace-Rectangle.png
├── averages.png
├── dashboard.gif
├── err-1.png
├── err-2.png
├── insights.png
└── reset.png
├── src
├── .babelrc
├── .eslintrc.json
├── components
│ ├── averages.tsx
│ ├── dashboard.tsx
│ ├── feedContainer.tsx
│ ├── flexComponent.tsx
│ ├── graphContainer.tsx
│ ├── graphGenerator.tsx
│ ├── header.tsx
│ ├── layout.tsx
│ ├── liveFeed.tsx
│ ├── liveGraph.jsx
│ ├── loading.tsx
│ ├── metricsTable.tsx
│ ├── navhoverbox.tsx
│ ├── navitem.tsx
│ ├── resolverMetric.tsx
│ └── sidebar.tsx
├── next-env.d.ts
├── next.config.js
├── package-lock.json
├── package.json
├── pages
│ ├── _app.tsx
│ ├── _document.tsx
│ └── index.tsx
├── state
│ ├── action-creators
│ │ ├── export.js
│ │ └── index.js
│ ├── constants
│ │ └── actionTypes.js
│ ├── hooks.ts
│ ├── index.js
│ ├── reducers
│ │ └── dataReducer.js
│ ├── store.ts
│ └── sync_storage.ts
├── styles
│ └── globals.css
├── theme
│ └── theme.ts
└── tsconfig.json
└── tracer-npm-package
├── .npmignore
├── goTrace.js
├── out
├── _next
│ └── static
│ │ ├── chunks
│ │ ├── 365-19e3808453cf1bc5.js
│ │ ├── 36bcf0ca-cd00c79edaf90b14.js
│ │ ├── 651.e7ad805f32a091cd.js
│ │ ├── framework-91d7f78b5b4003c8.js
│ │ ├── main-66a3cca2c05145e3.js
│ │ ├── pages
│ │ │ ├── _app-668123a5f219c6b7.js
│ │ │ ├── _error-1f95674706ce531a.js
│ │ │ └── index-7868c61b64985229.js
│ │ ├── polyfills-5cd94c89d3acac5f.js
│ │ └── webpack-a61ddaad2b129f16.js
│ │ ├── css
│ │ └── 2974ebc8daa97b04.css
│ │ └── trace-app
│ │ ├── _buildManifest.js
│ │ ├── _middlewareManifest.js
│ │ └── _ssgManifest.js
└── index.html
├── package-lock.json
├── package.json
└── server.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | node_modules
5 | /__tests__/goTrace_testing/node_modules/
6 | /node_modules/
7 | /tracer-npm-package/node_modules/
8 | /src/node_modules/
9 | /src/node_modules
10 | src/node_modules
11 | /.pnp
12 | .pnp.js
13 |
14 | # testing
15 | /coverage
16 |
17 | # next.js
18 | /.next/
19 | /out/
20 |
21 | # production
22 | /build
23 | /trace
24 |
25 | # misc
26 | .DS_Store
27 | *.pem
28 |
29 | # debug
30 | npm-debug.log*
31 | yarn-debug.log*
32 | yarn-error.log*
33 |
34 | # local env files
35 | /__tests/goTrace/.env
36 | .env
37 | .env.local
38 | .env.development.local
39 | .env.test.local
40 | .env.production.local
41 |
42 | # vercel
43 | .vercel
44 |
45 | # typescript
46 | *.tsbuildinfo
47 |
48 | # vscode
49 | settings.json
50 |
51 | # icloud
52 | .icloud
53 | *.icloud
54 |
55 | # env
56 | .env
57 |
--------------------------------------------------------------------------------
/CONTRIBUTING.MD:
--------------------------------------------------------------------------------
1 | ## Contributing to Trace
2 |
3 | Firstly, thank you for your interest and for your time in contributing to Trace.
4 |
5 | ## Reporting Bugs
6 |
7 | Bugs are tracked as GitHub issues. Create an issue on our repository and provide the following information based on this template:
8 |
9 | - **Clear and description title**: Please provide a clear and descriptive title for your issue.
10 | - **Steps to reproduce**: Describe the steps you took to reproduce the problem. If possible, provide specific code or screenshots that caused the problem.
11 | - **Expected behavior**: Describe the expected behavior and why.
12 | - **When did this problem start to happen?**: Describe when the problem started to happen.
13 | - **Details about your configuration and environment**: Describe your configuration and environment.
14 |
15 | ## Enhancements and Improvements
16 |
17 | Code changes related to enhancements and improvements are tracked as pull requests. Create a pull request on our repository following the below guidelines:
18 |
19 | 1. Fork the repository and create a new branch from Main.
20 | 2. Make your changes in the new branch.
21 | 3. If you've added code that should be tested, we recommended adding tests into the __tests__ folder.
22 | 4. Run your code through our linter and ensure it passes.
23 | 5. Run your code through our tests and ensure they pass.
24 | 6. Issue a pull request!
25 |
26 | ## License
27 | By contributing, you agree that your contributions will be licensed under Trace's MIT License.
28 |
29 | This document was adapted from the contribution guidelines from [Atom](https://github.com/atom/atom).
30 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Trace
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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | ## Trace ✏️
4 |
5 | Trace is a lightweight, open-source GraphQL query performance monitoring GUI that provides users with real-time, resolver-level performance tracing metrics and error logging. At its inception, Trace was created for the developer looking for a straightforward option for query performance monitoring on their Express-GraphQL server -- without having to install hefty libraries full of tools they'll never use such as Apollo or Hasura. Trace provides a simple, intuitive interface for users looking to test queries for their Express-GraphQL servers.
6 |
7 | As an easy-to-configure and self-contained application, Trace not only equips users with resolver-level query tracing but also illustrative insights on specific resolvers. Trace is designed to be used in a development environment for debugging and performance tuning.
8 |
9 | ## Table of Contents 📋
10 |
11 | - [Features](#features-)
12 | - [Installation](#installation-%EF%B8%8F)
13 | - [Configuration](#configuration-)
14 | - [Trace GUI](#trace-gui-)
15 | - [Additional Usage & Examples](#additional-usage--examples-)
16 | - [Contributing](#contributing-)
17 |
18 |
19 | ## Features ✨
20 |
21 | - Real-time, resolver-level query performance data collection from your GraphQL server
22 | - Visualization of individual query traces and averages
23 | - Insights on the averages and counts of root operations and specific resolvers
24 | - Error tracking for queries that fail during the GraphQL parsing, validation, or execution phase
25 |
26 |
27 | ## Installation ⚙️
28 |
29 | $ npm i --save-dev @go-trace/tracer
30 |
31 |
32 | ## Configuration 🔧
33 |
34 | Trace works with one of the simplest ways to run a GraphQL API server: Express, a popular web app framework for Node.js.
35 |
36 | 1. After installing the package, require the package in your Express app:
37 |
38 | ```
39 | const goTrace = require('@go-trace/tracer');
40 | ```
41 |
42 | 2. Create a GraphQLSchema instance. You can use the same schema as you would in your Express app. If you're using the GraphQL Tools library, you can use 'makeExecutableSchema' to generate a GraphQLSchema instance from GraphQL schema language (see [Additional Usage & Examples](#additional-usage--examples-) for sample code). Here's an example:
43 |
44 | ```
45 | const schema = new GraphQLSchema({
46 | query: new GraphQLObjectType({
47 | name: 'RootQuery',
48 | fields: {
49 | post: {
50 | type: postType,
51 | args: {
52 | id: {
53 | type: new GraphQLNonNull(GraphQLInt)
54 | }
55 | },
56 | resolve: async (obj, args) => {
57 | return pool.query(`SELECT * FROM "posts" WHERE id = $1`, [args.id])
58 | .then((result) => result.rows[0])
59 | }
60 | },
61 | posts: {
62 | type: new GraphQLList(postType),
63 | resolve: async () => {
64 | return pool.query(`
65 | SELECT * FROM "posts"
66 | `, []).then((result) => result.rows);
67 | }
68 | },
69 | },
70 | }),
71 | });
72 | ```
73 |
74 | 3. Setup your GraphQL server with Trace.
75 |
76 | ```
77 | app.use('/graphql', async (req, res) => {
78 | const query = req.body.query
79 | const variables = req.body.variables
80 | const response = await goTrace(
81 | schema,
82 | query,
83 | null, // Optional: rootValue, which will get passed as the root value to the executor
84 | null, // Optional: use this for custom context or leave null!
85 | variables
86 | )
87 | });
88 | ```
89 | 4. And that's it! Trace will now collect query performance data for your GraphQL server. The GUI will automatically run at http://localhost:2929/ once your first query runs.
90 |
91 |
92 | ## Trace GUI 🧮
93 |
94 | When you visit http://localhost:2929/ in your browser, you'll see a simple, intuitive interface that first reveals a live graph of traces. By clicking on a trace, represented by a bar on the graph, you will be navigated to a detailed view of the trace. Detailed view of each trace can be found below the graph. This includes the trace ID, timestamp, total duration, resolver-specific duration, the result and any error messages (more below on error tracing).
95 |
96 | 
97 |
98 | Trace additionally provides illustration of real-time error logging. Queries that fail during the GraphQL parsing, validation, or execution phase will be marked in red. You can view the specific error messages by clicking on specific trace.
99 |
100 | 
101 | 
102 |
103 | The dashboard has two additional views: Resolver Average View and Insights.
104 |
105 | 
106 | 
107 |
108 | To reset the GUI, you can click on the "Reset" button located at the bottom of the sidebar. This will clear all traces and error messages.
109 |
110 | 
111 |
112 | ## Additional Usage & Examples ✨
113 |
114 | For those using GraphQL Tools, you can use the following code to generate a GraphQLSchema instance from GraphQL schema language:
115 |
116 | 1. First create your type definitions:
117 |
118 | ```
119 | const typeDefs = buildSchema(`
120 | type User {
121 | id: ID!
122 | firstName: String!
123 | lastName: String!
124 | username: String!
125 | password: String!
126 | email: String!
127 | avatar_url: String
128 | }
129 |
130 | type Query {
131 | getUsers: [User]
132 | getUser(username: String!): User
133 | }
134 | );
135 | ```
136 |
137 | 2. Then create your resolvers:
138 |
139 | ```
140 | {
141 | Query: {
142 | getUsers: async (root, args, context, info) => {
143 | try {
144 | const query = `SELECT * FROM users`;
145 | const users = await pool.query(query);
146 | return users.rows;
147 | } catch (error) {
148 | return error;
149 | }
150 | },
151 | getUser: async (root, args, context, info) => {
152 | try {
153 | const username = args.username;
154 | const query = `SELECT * FROM users WHERE username = $1`;
155 | const users = await pool.query(query, [username]);
156 | return users.rows[0];
157 | } catch (error) {
158 | return error;
159 | }
160 | }
161 | }
162 | }
163 | ```
164 | 3. Use GraphQL Tools' makeExecutableSchema to generate a GraphQLSchema instance:
165 |
166 | ```
167 | const schema = makeExecutableSchema({
168 | typeDefs,
169 | resolvers,
170 | });
171 | ```
172 | 4. Finally, use this 'schema' as the first argument to goTrace!
173 |
174 | ## Contributing ➕
175 |
176 | Interested in making a contribution to Trace? [Click here](./CONTRIBUTING.MD) for our open-source contribution guidelines.
177 |
178 | Thank you for your interest and support!
179 |
--------------------------------------------------------------------------------
/__tests__/components/home.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/__tests__/components/home.js
--------------------------------------------------------------------------------
/__tests__/goTrace/goTrace.test.js:
--------------------------------------------------------------------------------
1 | const schema = require('./graphql');
2 | const goTrace = require('@go-trace/tracer');
3 | let request = require('supertest');
4 | request = request('http://localhost:2929');
5 |
6 |
7 | describe('goTrace', () => {
8 | const query = `query ($id: Int!) { post (id: $id) { title }}`;
9 | const variables = { id: 1 };
10 | let queryResponse;
11 |
12 | beforeAll(async () => {
13 | queryResponse = await goTrace(schema, query, null, null, variables);
14 | });
15 |
16 | it('is an exported function', () => {
17 | expect(typeof goTrace).toBe('function');
18 | });
19 |
20 | it('properly spawns a localhost server at port 2929', () => {
21 | request.get('/').expect('Testing: server is running!')
22 | });
23 |
24 | it('returns the correct query response', () => {
25 | expect(queryResponse).toEqual({"data": {"post": {"title": "One easy trick to learn graphql"}}});
26 | });
27 | });
--------------------------------------------------------------------------------
/__tests__/goTrace/graphql.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config()
2 |
3 | const {
4 | GraphQLID,
5 | GraphQLInt,
6 | GraphQLList,
7 | GraphQLNonNull,
8 | GraphQLObjectType,
9 | GraphQLSchema,
10 | GraphQLString,
11 | } = require('graphql');
12 |
13 | const { Pool } = require('pg');
14 | const connectionString = process.env.DB_CONNECTION_STRING
15 | const pool = new Pool({connectionString});
16 |
17 | const userType = new GraphQLObjectType({
18 | name: 'User',
19 | fields: {
20 | id: {
21 | type: GraphQLID
22 | },
23 | username: {
24 | type: GraphQLString
25 | },
26 | }
27 | });
28 |
29 | const commentType = new GraphQLObjectType({
30 | name: 'Comment',
31 | fields: {
32 | id: {
33 | type: GraphQLID
34 | },
35 | post_id: {
36 | type: GraphQLInt
37 | },
38 | text: {
39 | type: GraphQLString
40 | },
41 | user: {
42 | type: userType,
43 | resolve: async (obj) => {
44 | return pool.query(`
45 | SELECT * FROM "users"
46 | WHERE id = $1
47 | `, [obj.user_id]).then((result) => result.rows[0]);
48 | }
49 | },
50 | }
51 | });
52 |
53 | const postType = new GraphQLObjectType({
54 | name: 'Post',
55 | fields: {
56 | id: {
57 | type: GraphQLID
58 | },
59 | title: {
60 | type: GraphQLString
61 | },
62 | comments: {
63 | type: new GraphQLList(commentType),
64 | args: {
65 | limit: {
66 | type: GraphQLInt
67 | }
68 | },
69 | resolve: async (obj, args) => {
70 | return pool.query(`
71 | SELECT * FROM "comments"
72 | WHERE post_id = $1
73 | LIMIT $2
74 | `, [obj.id, args.limit]).then((result) => result.rows);
75 | }
76 | },
77 | }
78 | });
79 |
80 | const schema = new GraphQLSchema({
81 | query: new GraphQLObjectType({
82 | name: 'RootQuery',
83 | fields: {
84 | post: {
85 | type: postType,
86 | args: {
87 | id: {
88 | type: new GraphQLNonNull(GraphQLInt)
89 | }
90 | },
91 | resolve: async (obj, args) => {
92 | return pool.query(`SELECT * FROM "posts" WHERE id = $1`, [args.id])
93 | .then((result) => result.rows[0])
94 | }
95 | },
96 | posts: {
97 | type: new GraphQLList(postType),
98 | resolve: async () => {
99 | return pool.query(`
100 | SELECT * FROM "posts"
101 | `, []).then((result) => result.rows);
102 | }
103 | },
104 | },
105 | }),
106 | });
107 |
108 | module.exports = schema;
--------------------------------------------------------------------------------
/__tests__/goTrace/jest.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | clearMocks: true,
3 | testMatch: [ "**/?(*.)+(test).[jt]s?(x)" ],
4 | testEnvironment: "node",
5 | testPathIgnorePatterns: [
6 | "/node_modules/"
7 | ]
8 | };
9 |
--------------------------------------------------------------------------------
/__tests__/goTrace/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gotrace-testing",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "test_server.js",
6 | "scripts": {
7 | "test": "jest"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "dependencies": {
12 | "dotenv": "^10.0.0",
13 | "express": "^4.17.1",
14 | "pg": "^8.7.1",
15 | "socket.io-client": "^4.4.0"
16 | },
17 | "devDependencies": {
18 | "@go-trace/tracer": "^1.0.5",
19 | "jest": "^27.4.5",
20 | "supertest": "^6.1.6"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/screenshots/Insights-hover.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/screenshots/Insights-hover.gif
--------------------------------------------------------------------------------
/screenshots/Reset.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/screenshots/Reset.gif
--------------------------------------------------------------------------------
/screenshots/Trace-Rectangle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/screenshots/Trace-Rectangle.png
--------------------------------------------------------------------------------
/screenshots/averages.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/screenshots/averages.png
--------------------------------------------------------------------------------
/screenshots/dashboard.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/screenshots/dashboard.gif
--------------------------------------------------------------------------------
/screenshots/err-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/screenshots/err-1.png
--------------------------------------------------------------------------------
/screenshots/err-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/screenshots/err-2.png
--------------------------------------------------------------------------------
/screenshots/insights.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/screenshots/insights.png
--------------------------------------------------------------------------------
/screenshots/reset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/Trace/b4376efec51abff009e006bb0675d609fc6c73e0/screenshots/reset.png
--------------------------------------------------------------------------------
/src/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["next/babel"],
3 | "plugins": [
4 | [
5 | "babel-plugin-styled-components"
6 | ]
7 | ]
8 | }
--------------------------------------------------------------------------------
/src/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals",
3 | "parser": "babel-eslint"
4 | }
--------------------------------------------------------------------------------
/src/components/averages.tsx:
--------------------------------------------------------------------------------
1 | import { useAppSelector } from '../state/hooks';
2 | import {
3 | Table,
4 | Thead,
5 | Tbody,
6 | Tfoot,
7 | Tr,
8 | Th,
9 | Td,
10 | } from '@chakra-ui/react'
11 |
12 | const Averages = () => {
13 | const store = useAppSelector((state) => state);
14 | const resolverData = store.data;
15 |
16 | // iterate through resolverData
17 | // set count variable for resolvers of same type
18 | // sum duration and find average for resolvers of same type
19 | // save averages as object { resolverName: averageDuration }
20 |
21 | const tableData: JSX.Element[] = [];
22 |
23 | let totalSum = 0;
24 | let totalCount = 0;
25 | let totalAverage;
26 |
27 | // if no resolver data set total average to 0
28 | totalCount === 0 ? totalAverage = 0 : totalAverage = totalSum / totalCount;
29 |
30 | for (let resolver in resolverData.averages) {
31 | tableData.push(
32 |
33 | { resolver } |
34 | { resolverData.averages[resolver].toFixed(2) } ms |
35 |
36 | )
37 | // calculate total sum and count for total average
38 | totalSum += resolverData.averages[resolver] * Number(resolverData.count[resolver]);
39 | totalCount += Number(resolverData.count[resolver]);
40 | }
41 | totalAverage = totalSum / totalCount;
42 |
43 |
44 | return (
45 |
46 |
47 |
48 | Resolver Name |
49 | Average Duration |
50 |
51 |
52 |
53 | { tableData }
54 |
55 |
56 |
57 | Average Execution Time |
58 | { totalAverage.toFixed(2) } ms |
59 |
60 |
61 |
62 | )
63 |
64 | }
65 |
66 | export default Averages;
--------------------------------------------------------------------------------
/src/components/dashboard.tsx:
--------------------------------------------------------------------------------
1 | import FeedContainer from "./feedContainer"
2 | import GraphContainer from './graphContainer'
3 | import Averages from './averages'
4 | import { useState } from 'react'
5 | import { Button, ButtonGroup, Flex } from "@chakra-ui/react"
6 | import { Chart as ChartJS, BarController, BarElement, LinearScale, Title, CategoryScale } from 'chart.js';
7 |
8 | ChartJS.register(BarController, BarElement, LinearScale, Title, CategoryScale);
9 |
10 |
11 | const Dashboard = () => {
12 | const [ view, setView ] = useState('live')
13 |
14 | return (
15 | <>
16 |
17 |
23 |
29 |
35 |
36 |
37 |
40 |
41 | { view === 'live' ? :
42 | view === 'res' ? : }
43 |
44 |
45 | >
46 | )
47 | }
48 |
49 | export default Dashboard
--------------------------------------------------------------------------------
/src/components/feedContainer.tsx:
--------------------------------------------------------------------------------
1 | import { Flex } from "@chakra-ui/layout"
2 | import LiveFeed from "./liveFeed"
3 | import LiveGraph from "./liveGraph"
4 |
5 | const FeedContainer = () => {
6 |
7 | return (
8 |
13 |
14 |
15 |
16 | )
17 | }
18 |
19 | export default FeedContainer
--------------------------------------------------------------------------------
/src/components/flexComponent.tsx:
--------------------------------------------------------------------------------
1 | import { Flex, Box, Heading, Tooltip } from "@chakra-ui/react"
2 |
3 | // make an array for multicolors
4 | // get specific with style
5 | // no form has been given yet
6 |
7 | type FlexComponentProps = {
8 | max: number,
9 | thisNum: number | string,
10 | name: string,
11 | label: string
12 | }
13 |
14 | const FlexComponent = ({ max, thisNum, name, label }: FlexComponentProps) => {
15 | console.log(max, thisNum, name, label)
16 | const graphWidth = thisNum === max ? '100%' : ((Number(thisNum) / max) * 100).toString() + '%';
17 | if (label.length) thisNum = Number(thisNum).toFixed(2);
18 | return (
19 | // flex container that represents the entire width of the graph
20 |
21 |
25 | {name}
26 |
27 |
34 |
35 |
41 |
42 |
43 |
44 | )
45 | }
46 |
47 | export default FlexComponent
--------------------------------------------------------------------------------
/src/components/graphContainer.tsx:
--------------------------------------------------------------------------------
1 | import makeGraphs from './graphGenerator'
2 | import { Grid } from '@chakra-ui/react'
3 | import { useAppSelector } from '../state/hooks'
4 |
5 | const GraphContainer = () => {
6 |
7 | const { averages, count } = useAppSelector((state) => state.data)
8 | const graphs = makeGraphs(averages, count);
9 |
10 | return (
11 |
15 | {graphs}
16 |
17 | )
18 | }
19 |
20 | export default GraphContainer
--------------------------------------------------------------------------------
/src/components/graphGenerator.tsx:
--------------------------------------------------------------------------------
1 | import FlexComponent from './flexComponent'
2 | import { GridItem, Heading } from '@chakra-ui/react';
3 |
4 | const makeGraphs = (averages: {[key: string]: number}, count: {[key: string]: any}) => {
5 |
6 | // push completed divs into this array
7 | const graphDivs: any[] = [];
8 |
9 | // declare arrays for data to be split between
10 | const rootAvg: any[] = []
11 | const rootCt: any[] = [];
12 | const resolveAvg: any[] = [];
13 | const resolveCt: any[] = [];
14 |
15 | // Divide the queries into root operations and resolvers
16 | // while preserving the count - average distinction
17 | for (const query in averages) {
18 | if (query.slice(0, 5) == ("RootQ" || "Mutat" || "Query")) {
19 | rootAvg.push([query, averages[query]]);
20 | rootCt.push([query, count[query]]);
21 | } else {
22 | resolveAvg.push([query, averages[query]]);
23 | resolveCt.push([query, count[query]]);
24 | }
25 | }
26 |
27 | // sort the number metrics by descending and keep only their top 5 entries
28 | const mapGraphs = (arr: any[]): any[] => {
29 | return arr.map(arr => {
30 | arr.sort((a: any, b: any) => b[1] - a[1]).splice(5);
31 | return arr
32 | })
33 | }
34 |
35 | // rootAvg.sort((a, b) => b[1] - a[1]).splice(5);
36 | // rootCt.sort((a, b) => b[1] - a[1]).splice(5);
37 | // resolveAvg.sort((a, b) => b[1] - a[1]).splice(5);
38 | // resolveCt.sort((a, b) => b[1] - a[1]).splice(5);
39 |
40 | // cast graph data and coordinates to arrays
41 | const graphData = mapGraphs([rootAvg, rootCt, resolveAvg, resolveCt]);
42 | console.log(graphData)
43 | const gridCoords = [[1, 1], [2, 1], [1, 2], [2, 2]];
44 | const headings = [
45 | 'Root Operations by Average Duration',
46 | 'Root Operations by Invocation Count',
47 | 'Resolvers by Average Duration',
48 | 'Resolvers by Invocation Count'
49 | ];
50 |
51 | let i = 1000;
52 |
53 | // for each item of graph data
54 | while (graphData.length) {
55 | // shift the first element of both arrays
56 | // to be used as this graph's props
57 |
58 | let label: string = ''
59 | const thisGraph: any[] = graphData.shift();
60 | const thisCount: number = thisGraph.length;
61 | const theseCoords: any = gridCoords.shift();
62 | const thisLabel: string | undefined = 'Top ' + `${thisCount} ` + headings.shift();
63 | if (theseCoords && theseCoords[0] === 1) label = 'ms';
64 | // map the iterative props to a FlexComponent component
65 | // cast to an array
66 | const theseComponents = thisGraph.map((item: any[], index: number) => );
67 | // render that array into a GridItem div
68 | // and push it to the output array
69 | graphDivs.push(
70 |
81 |
85 | {thisLabel}
86 |
87 |
88 | {theseComponents}
89 |
90 | )
91 |
92 | i++
93 | }
94 | // after the while loop has run four times;
95 | // once for each insight graph,
96 | // return the four graph components
97 | // to their final container outside of this file
98 |
99 | return graphDivs
100 | };
101 |
102 | export default makeGraphs
103 |
--------------------------------------------------------------------------------
/src/components/layout.tsx:
--------------------------------------------------------------------------------
1 | import React, { ReactNode } from 'react';
2 | import Head from 'next/head';
3 | import Sidebar from './sidebar';
4 | import styled from 'styled-components';
5 |
6 | const Main = styled.main`
7 | display: flex;
8 | justify-content: flex-start;
9 | align-items: flex-start;
10 | height: 100vh;
11 | overflow-y: hidden;
12 | `;
13 |
14 | type Props = {
15 | children: ReactNode;
16 | title?: string;
17 | };
18 |
19 | const Layout = ({
20 | children,
21 | title = "Trace"
22 | }: Props) => (
23 | <>
24 |
25 | {title}
26 |
27 |
28 |
29 |
30 |
31 |
32 | {children}
33 |
34 | >
35 | );
36 |
37 | export default Layout;
--------------------------------------------------------------------------------
/src/components/liveFeed.tsx:
--------------------------------------------------------------------------------
1 | import { Box, Flex } from "@chakra-ui/layout"
2 | import { Key } from "react"
3 | import { useAppSelector } from '../state/hooks'
4 | import {
5 | Table,
6 | Thead,
7 | Tr,
8 | Th,
9 | Accordion,
10 | AccordionItem,
11 | AccordionButton,
12 | AccordionPanel
13 | } from '@chakra-ui/react'
14 | import ResolverMetric from "./resolverMetric"
15 | import MetricsTable from "./metricsTable"
16 |
17 | const LiveFeed = () => {
18 |
19 | const store = useAppSelector(state => state)
20 | const data = store.data.rawdata;
21 | console.log('DATA FROM LIVE FEED: ', data);
22 |
23 | const items = data.map((obj: Object, i: Key) => {
24 | return (
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | )
38 | });
39 |
40 | return (
41 |
49 |
50 |
51 |
52 | Trace ID |
53 | Duration Metrics |
54 |
55 |
56 |
57 |
61 |
62 | {items}
63 |
64 |
65 |
66 |
67 | )
68 | }
69 |
70 | export default LiveFeed
--------------------------------------------------------------------------------
/src/components/liveGraph.jsx:
--------------------------------------------------------------------------------
1 | import { useRouter } from 'next/router'
2 | import { Flex } from "@chakra-ui/layout";
3 | import { useEffect, useState, useRef, useMemo } from "react"
4 | import { Bar } from 'react-chartjs-2';
5 | import {
6 | Chart,
7 | BarElement,
8 | BarController,
9 | Legend,
10 | Title,
11 | Tooltip
12 | } from 'chart.js';
13 |
14 | Chart.register(
15 | BarElement,
16 | BarController,
17 | Legend,
18 | Title,
19 | Tooltip
20 | );
21 |
22 | import { useAppSelector } from "../state/hooks"
23 |
24 | const LiveGraph = () => {
25 |
26 | const clickRef = useRef(null)
27 |
28 | const router = useRouter()
29 |
30 | const handleClick = (i) => {
31 | const href = '/#' + i;
32 | router.push(href)
33 | }
34 |
35 | const options = {
36 | onClick: (evt, elem) => {
37 | const index = elem[0] ? elem[0].index : null;
38 | handleClick(index);
39 | },
40 | barThickness: 10,
41 | plugins: {
42 | legend: {
43 | display: false
44 | },
45 | tooltip: {
46 | backgroundColor: 'rgb(178, 190, 219)',
47 | titleColor: '#1A365D',
48 | bodyColor: '#1A365D',
49 | callbacks: {
50 | label: function(context) {
51 | return 'Total Duration: ' + context.parsed.y + 'ms';
52 | }
53 | }
54 | }
55 | },
56 | //responsive: true,
57 | maintainAspectRatio: false,
58 | onResize: (chart, size) => {
59 | chart.update();
60 | },
61 | scales: {
62 | x: {
63 | grid: {
64 | display: false,
65 | },
66 | position: 'bottom',
67 | stacked: true,
68 | ticks: {
69 | callback: function(value) {
70 | return '';
71 | },
72 | color: '#8e94ab'
73 | },
74 | },
75 | y: {
76 | grid: {
77 | display: false
78 | },
79 | ticks: {
80 | callback: function(value, index, values) {
81 | return value + 'ms';
82 | },
83 | color: 'white'
84 | }
85 | },
86 | },
87 | };
88 |
89 | const [ chartData, setChartData ] = useState({
90 | labels: [],
91 | datasets: [{
92 | id: 1,
93 | label: 'Traces',
94 | data: [],
95 | backgroundColor: []
96 | }]
97 | })
98 | const store = useAppSelector((state) => state)
99 |
100 | useEffect(() => {
101 | if (store) {
102 | const data = {
103 | labels: [],
104 | datasets: [{
105 | id: 1,
106 | label: 'Traces',
107 | data: [],
108 | backgroundColor: []
109 | }]
110 | }
111 |
112 | for (let obj of store.data.rawdata) {
113 | if (obj) {
114 | data.labels.push(obj.trace_id)
115 | data.datasets[0].data.push(obj.totalDuration);
116 | if (obj.errors || obj.response.errors) data.datasets[0].backgroundColor.push('#63171B')
117 | else data.datasets[0].backgroundColor.push('white')
118 | }
119 | }
120 |
121 | setChartData(data);
122 | clickRef.current.update();
123 | }
124 | }, [store])
125 |
126 | return (
127 |
141 |
147 |
148 |
149 | )
150 | }
151 |
152 | export default LiveGraph
--------------------------------------------------------------------------------
/src/components/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Spinner, Flex } from '@chakra-ui/react'
2 | import { Text } from '@chakra-ui/layout'
3 |
4 | const Loading = () => {
5 | return (
6 |
14 | Just give us a moment...
15 |
23 |
24 | )
25 | }
26 |
27 | export default Loading
--------------------------------------------------------------------------------
/src/components/metricsTable.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react'
2 | import { Flex } from '@chakra-ui/layout';
3 |
4 | const MetricsTable = ({ data }: any) => {
5 |
6 | const details: Array = [];
7 | let response;
8 | let errors = '';
9 |
10 | for (let str of Object.keys(data)) {
11 | if (str === 'trace_id') continue;
12 | if (str === 'errors') {
13 | errors += JSON.stringify(data[str]);
14 | } else if (str === 'response') {
15 | if (data[str].data) response = JSON.stringify(data[str].data)
16 | if (data[str].errors) errors += JSON.stringify(data[str].errors)
17 | } else if (str === 'dateAndTime') {
18 | const old = details[0]
19 | details[0] = (
20 |
21 | TIMESTAMP: { data[str] }
22 |
23 | )
24 | details.push(old)
25 | }
26 | else if (str === 'totalDuration') {
27 | const old = details[1]
28 | details[1] = (
29 |
30 | TOTAL DURATION: { data[str] }ms
31 |
32 | )
33 | details.push(old)
34 | } else {
35 | details.push(
36 |
37 | { str }: { data[str] }ms
38 |
39 | )
40 | }
41 | }
42 |
43 | details.push(
44 |
45 | RESULT: {response}
46 | { errors ? ERRORS: {errors}
47 | : null }
48 |
49 | )
50 |
51 | return (
52 |
60 | { details }
61 |
62 | )
63 | }
64 |
65 | export default MetricsTable
--------------------------------------------------------------------------------
/src/components/navhoverbox.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import {
3 | Flex,
4 | Heading,
5 | Text,
6 | Icon
7 | } from '@chakra-ui/react'
8 | import { IconType } from 'react-icons'
9 |
10 | type Props = {
11 | title: string;
12 | icon: IconType;
13 | description: string | undefined;
14 | }
15 |
16 | export default function NavHoverBox({ title, icon, description }: Props) {
17 | return (
18 | <>
19 |
30 |
42 |
43 | {title}
44 | {description}
47 |
48 | >
49 | )
50 | }
--------------------------------------------------------------------------------
/src/components/navitem.tsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react'
2 | import {
3 | Flex,
4 | Text,
5 | Icon,
6 | Link,
7 | Menu,
8 | MenuButton,
9 | MenuList,
10 | useDisclosure,
11 | Box
12 | } from '@chakra-ui/react'
13 | import { IconType } from 'react-icons';
14 | import NavHoverBox from './navhoverbox'
15 |
16 | type Props = {
17 | icon: IconType;
18 | title: string;
19 | path?: string;
20 | description?: string;
21 | active?: boolean;
22 | navSize: string;
23 | onClick?: any
24 | };
25 |
26 | export default function NavItem({ icon, title, path, description, active=false, navSize, onClick }: Props) {
27 | const { isOpen, onOpen, onClose } = useDisclosure();
28 |
29 | return title !== "Reset" ? (
30 |
36 |
71 |
72 | ) : (
73 |
79 |
113 |
114 | )
115 | }
116 |
--------------------------------------------------------------------------------
/src/components/resolverMetric.tsx:
--------------------------------------------------------------------------------
1 | import { Flex, Box } from "@chakra-ui/layout";
2 | import { Tooltip } from '@chakra-ui/react'
3 | import { useEffect, useState, useRef } from "react";
4 |
5 | const ResolverMetric = ({ data, id }: any) => {
6 | let max = useRef(100);
7 | const [ sum, setSum ] = useState(1)
8 | const [ errors, setErrors ] = useState(false)
9 | let resolvers:any[] = [];
10 |
11 | useEffect(() => {
12 | if (data) {
13 | if (data.errors) setErrors(true);
14 | else if (data.response.errors) setErrors(true);
15 | let preSum = Object.keys(data).reduce((a: number, b: string) => {
16 | if (b !== 'errors' && b !== 'dateAndTime' && b !== 'totalDuration' && b !== 'trace_id' && b !== 'response') {
17 | max.current = Math.max(max.current, data[b])
18 | return a + data[b];
19 | } else return a;
20 | }, 0);
21 |
22 | setSum(preSum);
23 | }
24 | }, [data])
25 |
26 | const colors = ['orange.300', 'orange.400', 'orange.500', 'orange.600', 'orange.700'];
27 | const errColors = ['red.500', 'red.600', 'red.700', 'red.800', 'red.900'];
28 | let index = 0;
29 | const filteredData = Object.keys(data).filter(key => (
30 | key !== 'dateAndTime' && key !== 'totalDuration' && key !== 'trace_id' && key !== 'errors' && key !== 'response'
31 | ));
32 |
33 | for (let str of filteredData) {
34 | let color = index % 5
35 |
36 | max.current = Math.max(max.current, data[str]);
37 | resolvers.push(
38 |
39 |
59 | {str}
60 |
61 |
62 | );
63 |
64 | index++;
65 | }
66 |
67 | return (
68 |
69 | {data.trace_id}
81 | { resolvers }
82 |
83 | )
84 | }
85 |
86 | export default ResolverMetric
87 |
--------------------------------------------------------------------------------
/src/components/sidebar.tsx:
--------------------------------------------------------------------------------
1 | // Based off Chakra UI Responsive Sidebar Tutorial: https://github.com/bjcarlson42/chakra-left-responsive-navbar/tree/main/components
2 |
3 | // React/Redux, Next, and Styled Components Imports
4 | import { useState } from 'react'
5 | import NavItem from './navitem'
6 | import { useAppDispatch } from '../state/hooks'
7 | import { bindActionCreators } from 'redux'
8 | import { actionCreators } from '../state/action-creators/export'
9 | import { useRouter } from 'next/router'
10 |
11 | // Chakra Imports
12 | import {
13 | Flex,
14 | IconButton,
15 | } from '@chakra-ui/react'
16 |
17 | // Feather Icon Imports
18 | import {
19 | FiMenu,
20 | FiGrid,
21 | } from 'react-icons/fi'
22 |
23 | import { BsArrowCounterclockwise } from 'react-icons/bs'
24 |
25 | // Framer Motion
26 | import { motion } from 'framer-motion';
27 | const mainVariants = {
28 | 'small': { width: '80px' },
29 | 'big': { width: '200px' }
30 | }
31 | const innerVariants = {
32 | 'small': { alignItems: 'center' },
33 | 'big': {
34 | alignItems: 'flex-start',
35 | transition: { duration: 1.5 },
36 | }
37 | }
38 |
39 | const Sidebar = () => {
40 | const [navSize, changeNavSize] = useState("small")
41 | const dispatch = useAppDispatch();
42 | const { deleteDataActionCreator } = bindActionCreators(actionCreators, dispatch);
43 | const router = useRouter()
44 |
45 | const handleReset = () => {
46 | deleteDataActionCreator()
47 | router.reload()
48 | }
49 |
50 | return (
51 |
57 |
66 |
72 |
73 | }
79 | onClick={() => {
80 | if (navSize == "small") changeNavSize("big")
81 | else changeNavSize("small")
82 | }}
83 | style={ { alignItems: 'center' }}
84 | />
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 | )
93 | }
94 |
95 | export default Sidebar;
96 |
--------------------------------------------------------------------------------
/src/next-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 | ///
4 |
5 | // NOTE: This file should not be edited
6 | // see https://nextjs.org/docs/basic-features/typescript for more information.
7 |
--------------------------------------------------------------------------------
/src/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 |
3 | module.exports = {
4 | reactStrictMode: true,
5 | distDir: 'trace',
6 | generateBuildId: async () => {
7 | return 'trace-app'
8 | },
9 | webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
10 | return config
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "trace",
3 | "version": "1.0",
4 | "description": "Enhance GraphQL diagnostics and testing capabilities with resolver-level query tracing with Trace",
5 | "author": "Pat Constant, Alex Hager, Eddy Kwon, Jueun Grace Yun",
6 | "publishConfig": {
7 | "access": "public"
8 | },
9 | "license": "MIT",
10 | "homepage": "",
11 | "repository": {
12 | "type": "git",
13 | "url": "https://github.com/oslabs-beta/trace/"
14 | },
15 | "main": "index.js",
16 | "scripts": {
17 | "dev": "next dev -p 2929",
18 | "start": "next start -p 2929",
19 | "lint": "next lint",
20 | "export": "next build && next export"
21 | },
22 | "dependencies": {
23 | "@chakra-ui/react": "^1.7.2",
24 | "chart.js": "^3.0.0",
25 | "framer-motion": "^4.1.17",
26 | "next": "12.0.4",
27 | "next-redux-wrapper": "^7.0.5",
28 | "react": "17.0.2",
29 | "react-chartjs-2": "^4.0.0",
30 | "react-icons": "^4.3.1",
31 | "react-redux": "^7.2.6",
32 | "redux": "^4.1.2",
33 | "redux-persist": "^6.0.0",
34 | "redux-thunk": "^2.4.1",
35 | "socket.io-client": "^4.4.0"
36 | },
37 | "devDependencies": {
38 | "@types/node": "16.11.10",
39 | "@types/react": "^17.0.37",
40 | "@types/styled-components": "^5.1.15",
41 | "babel-eslint": "^10.1.0",
42 | "dotenv": "^10.0.0",
43 | "eslint": "7.32.0",
44 | "eslint-config-next": "12.0.4",
45 | "styled-components": "^5.3.3",
46 | "typescript": "4.5.2"
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/pages/_app.tsx:
--------------------------------------------------------------------------------
1 | import '../styles/globals.css'
2 | import Layout from '../components/layout'
3 | import { AppProps } from 'next/app'
4 | import { ChakraProvider } from "@chakra-ui/react"
5 | import theme from '../theme/theme'
6 | import { Provider, useStore } from 'react-redux';
7 | import { PersistGate } from 'redux-persist/integration/react'
8 | import { wrapper } from '../state/store'
9 | import Loading from '../components/loading'
10 | import { motion } from 'framer-motion';
11 | import { useState, useEffect } from 'react'
12 | import { useAppDispatch } from '../state/hooks'
13 | import { bindActionCreators } from 'redux'
14 | import { actionCreators } from '../state/action-creators/export'
15 | import io from 'socket.io-client'
16 |
17 | function MyApp({ Component, pageProps, router }: AppProps) {
18 | const [ newData, setData ] = useState(null);
19 |
20 | // SOCKET IO
21 | useEffect(() => {
22 | fetch('http://localhost:2929/socketio').finally(() => {
23 | const socket = io()
24 |
25 | socket.on('connect', () => {
26 | console.log(socket.id, 'index.tsx: connected')
27 | })
28 |
29 | socket.on('data', data => {
30 | setData(data);
31 | })
32 |
33 | socket.on('disconnect', () => {
34 | console.log('index.tsx: disconnect')
35 | })
36 | })
37 | }, [])
38 |
39 | // REDUX
40 | const dispatch = useAppDispatch();
41 | const { updateDataActionCreator } = bindActionCreators(actionCreators, dispatch);
42 |
43 | useEffect(() => {
44 | if (newData !== null) {
45 | console.log('new data updated');
46 | updateDataActionCreator(newData);
47 | }
48 | }, [ newData, updateDataActionCreator ])
49 |
50 | const store: any = useStore()
51 |
52 | return process.browser ? (
53 |
54 |
55 | } >
56 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 | ) : (
78 |
79 |
80 | } >
81 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 | )
103 | }
104 |
105 | export default wrapper.withRedux(MyApp)
--------------------------------------------------------------------------------
/src/pages/_document.tsx:
--------------------------------------------------------------------------------
1 | import Document, { Html, Head, Main, NextScript } from 'next/document'
2 |
3 | class MyDocument extends Document {
4 |
5 | render() {
6 | return (
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | )
17 | }
18 | }
19 |
20 | export default MyDocument
--------------------------------------------------------------------------------
/src/pages/index.tsx:
--------------------------------------------------------------------------------
1 | import Dashboard from '../components/dashboard'
2 | import Header from '../components/header'
3 | import { Flex } from '@chakra-ui/layout'
4 |
5 | const Home = () => {
6 |
7 | return (
8 | <>
9 |
10 |
11 |
12 |
13 | >
14 | )
15 | }
16 |
17 | export default Home
18 |
--------------------------------------------------------------------------------
/src/state/action-creators/export.js:
--------------------------------------------------------------------------------
1 | export * as actionCreators from './index';
--------------------------------------------------------------------------------
/src/state/action-creators/index.js:
--------------------------------------------------------------------------------
1 | import * as types from '../constants/actionTypes'
2 |
3 | // create action creators and export them all individually
4 | // "export const [nameOfCreator]""
5 |
6 | export const updateDataActionCreator = newData => ({
7 | type: types.UPDATE_DATA,
8 | payload: newData
9 | })
10 |
11 | export const deleteDataActionCreator = () => ({
12 | type: types.DELETE_DATA
13 | })
14 |
15 | // maybe add some actions for options
16 | // actions can update how many resolvers to show for each graph
17 |
18 | // do we need action for darkmode? or chakra ui provides native method?
--------------------------------------------------------------------------------
/src/state/constants/actionTypes.js:
--------------------------------------------------------------------------------
1 | export const UPDATE_DATA = 'UPDATE_DATA';
2 |
3 | export const DELETE_DATA = 'DELETE_DATA';
--------------------------------------------------------------------------------
/src/state/hooks.ts:
--------------------------------------------------------------------------------
1 | import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
2 | import type { RootState, AppDispatch } from './store'
3 |
4 | export const useAppDispatch = () => useDispatch()
5 | export const useAppSelector: TypedUseSelectorHook = useSelector
6 |
--------------------------------------------------------------------------------
/src/state/index.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from "redux";
2 | import dataReducer from './reducers/dataReducer';
3 |
4 | const reducers = combineReducers({
5 | data: dataReducer
6 | });
7 |
8 | export default reducers;
--------------------------------------------------------------------------------
/src/state/reducers/dataReducer.js:
--------------------------------------------------------------------------------
1 | import * as types from '../constants/actionTypes'
2 | import storage from '../sync_storage'
3 |
4 | const initialState = {
5 | rawdata: [],
6 | averages: {},
7 | count: {}
8 | }
9 |
10 | const dataReducer = (state = initialState, action) => {
11 |
12 | switch (action.type) {
13 | case types.UPDATE_DATA:
14 | const data = action.payload;
15 | const clone = {...state};
16 |
17 | // UPDATE RAW DATA ARRAY
18 | clone.rawdata.push(data);
19 |
20 | // UPDATE AVERAGES + COUNT
21 | for (let key in data) {
22 | if (key !== 'dateAndTime' && key !== 'errors' && key !== 'response' && key !== 'totalDuration' && key !== 'trace_id') {
23 | if (clone.averages[key]) {
24 | let sum = clone.averages[key] * clone.count[key];
25 | sum += data[key];
26 | clone.averages[key] = sum / (clone.count[key] + 1);
27 | } else clone.averages[key] = data[key];
28 |
29 | if (clone.count[key]) clone.count[key]++;
30 | else clone.count[key] = 1;
31 | }
32 | }
33 |
34 | return clone;
35 |
36 | case types.DELETE_DATA:
37 | storage.removeItem('persist:trace')
38 | return initialState;
39 |
40 | default:
41 | return state;
42 | }
43 | };
44 |
45 | export default dataReducer;
--------------------------------------------------------------------------------
/src/state/store.ts:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware } from "redux";
2 | import { createWrapper } from 'next-redux-wrapper';
3 | import reducers from "./index";
4 | import thunk from "redux-thunk";
5 | import { persistStore, persistReducer } from 'redux-persist'
6 | import storage from './sync_storage'
7 | //import storage from 'redux-persist/lib/storage'
8 |
9 | export type RootState = {
10 | data: Data
11 | }
12 |
13 | interface Data {
14 | rawdata: [];
15 | count: Count;
16 | averages: Averages;
17 | }
18 |
19 | interface Count {
20 | [key: string]: []
21 | }
22 |
23 | interface Averages {
24 | [key: string]: number
25 | }
26 |
27 | let reduxStore: any
28 |
29 | const makeStore = ({ isServer }: { isServer?: any }) => {
30 |
31 | if (isServer) {
32 | reduxStore = createStore(reducers, applyMiddleware(thunk))
33 | return reduxStore
34 | } else {
35 | const persistConfig = {
36 | key: 'trace',
37 | storage
38 | }
39 |
40 | const persistedReducer = persistReducer(persistConfig, reducers)
41 |
42 | reduxStore = createStore(
43 | persistedReducer,
44 | applyMiddleware(thunk)
45 | )
46 |
47 | reduxStore.__persistor = persistStore(reduxStore);
48 |
49 | return reduxStore
50 | }
51 |
52 | }
53 |
54 | export const wrapper = createWrapper(makeStore as any)
55 |
56 | export type AppDispatch = typeof reduxStore.dispatch
57 |
--------------------------------------------------------------------------------
/src/state/sync_storage.ts:
--------------------------------------------------------------------------------
1 | import createWebStorage from 'redux-persist/lib/storage/createWebStorage';
2 |
3 | const createNoopStorage = () => {
4 | return {
5 | getItem(_key: any) {
6 | return Promise.resolve(null);
7 | },
8 | setItem(_key: any, value: any) {
9 | return Promise.resolve(value);
10 | },
11 | removeItem(_key: any) {
12 | return Promise.resolve();
13 | },
14 | };
15 | };
16 |
17 | const storage =
18 | typeof window !== 'undefined'
19 | ? createWebStorage('local')
20 | : createNoopStorage();
21 |
22 | export default storage;
--------------------------------------------------------------------------------
/src/styles/globals.css:
--------------------------------------------------------------------------------
1 | html,
2 | body {
3 | padding: 0;
4 | margin: 0;
5 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
6 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
7 | }
8 |
9 | a {
10 | color: inherit;
11 | text-decoration: none;
12 | }
13 |
14 | * {
15 | box-sizing: border-box;
16 | }
--------------------------------------------------------------------------------
/src/theme/theme.ts:
--------------------------------------------------------------------------------
1 | import { extendTheme } from '@chakra-ui/react';
2 | import { mode } from '@chakra-ui/theme-tools';
3 |
4 | const config = {
5 | initialColorMode: 'dark',
6 | useSystemColorMode: false,
7 | breakpoints: {
8 | sm: "0",
9 | md: "700px",
10 | lg: "960px",
11 | xl: "1200px",
12 | },
13 | global: (props: any) => ({
14 | body: {
15 | color: mode('gray.800', 'whiteAlpha.900')(props),
16 | bg: mode('gray.100', '#141214')(props),
17 | }
18 | }),
19 | }
20 |
21 | const theme = extendTheme({ config });
22 |
23 | export default theme;
--------------------------------------------------------------------------------
/src/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "forceConsistentCasingInFileNames": true,
9 | "noEmit": true,
10 | "esModuleInterop": true,
11 | "module": "esnext",
12 | "moduleResolution": "node",
13 | "resolveJsonModule": true,
14 | "isolatedModules": true,
15 | "jsx": "preserve",
16 | "incremental": true
17 | },
18 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "components/resolverGraph.jsx"],
19 | "exclude": ["node_modules"]
20 | }
--------------------------------------------------------------------------------
/tracer-npm-package/.npmignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .vscode
3 | node_modules
--------------------------------------------------------------------------------
/tracer-npm-package/goTrace.js:
--------------------------------------------------------------------------------
1 | const util = require('util');
2 | const exec = util.promisify(require('child_process').exec);
3 | const { parse, validate, execute } = require('graphql')
4 | const { applyMiddleware } = require('graphql-middleware')
5 | const { v4: uuidv4 } = require('uuid')
6 | const fetch = require("node-fetch");
7 |
8 | const loggingMiddleware = (_context) => {
9 | return async (resolve, root, args, context, info) => {
10 | const startTime = process.hrtime();
11 | const result = await resolve(root, args, _context, info);
12 | const endTime = process.hrtime(startTime);
13 | const duration = JSON.parse((endTime[1] / 1e6).toFixed(2));
14 | context[`${info.parentType}.${info.fieldName}`] = duration;
15 | return result;
16 | }
17 | }
18 |
19 | let served = false;
20 |
21 | const runTrace = async () => {
22 | if (!served) {
23 | served = true;
24 | await exec('cd node_modules && cd @go-trace/tracer && node server.js')
25 | }
26 | }
27 |
28 | module.exports = async function goTrace(schema, query, root, context, variables) {
29 |
30 | runTrace();
31 |
32 | // Initial object that will hold all the data we want to send to trace
33 | const rootQueryObj = { trace_id: uuidv4() };
34 |
35 | schema = applyMiddleware(schema, loggingMiddleware(context));
36 |
37 | const queryAST = parse(query);
38 | // Validate the incoming queryAST against the GraphQLSchema Object
39 | const errors = validate(schema, queryAST);
40 | if (errors.length === 0) {
41 | console.log(`Validation successful query can be executed`);
42 | } else {
43 | Object.keys(rootQueryObj).includes('errors') ? rootQueryObj['errors'].push(errors) : rootQueryObj['errors'] = [...errors];
44 | }
45 |
46 | let endTime;
47 | let response;
48 |
49 | // Execute the query against the schema
50 | const currentDate = new Date();
51 | const timestamp = currentDate. getTime()
52 | const dateAndTime = `${currentDate} | ${timestamp}`;
53 |
54 | rootQueryObj['dateAndTime'] = dateAndTime;
55 |
56 | const startTime = process.hrtime();
57 | const queryMetrics = await execute(schema, queryAST, null, null, variables)
58 | .then((result) => {
59 | endTime = process.hrtime(startTime);
60 | response = result;
61 | })
62 | .then(() => { return rootQueryObj })
63 | .catch(err => {
64 | // rootQueryObj.hasOwnProperty('errors')
65 | Object.keys(rootQueryObj).includes('errors') ? rootQueryObj['errors'].push(err.message) : rootQueryObj['errors'] = [...err.message];
66 | });
67 |
68 | rootQueryObj.totalDuration = JSON.parse((endTime[1] / 1e6).toFixed(2));
69 | rootQueryObj['response'] = response;
70 |
71 | try {
72 | await fetch('http://localhost:2929/socketio', {
73 | method: 'POST',
74 | headers: {
75 | 'Content-Type': 'application/json'
76 | },
77 | body: JSON.stringify(rootQueryObj)
78 | })
79 | } catch {
80 | setTimeout(() => {
81 | fetch('http://localhost:2929/socketio', {
82 | method: 'POST',
83 | headers: {
84 | 'Content-Type': 'application/json'
85 | },
86 | body: JSON.stringify(rootQueryObj)
87 | })
88 | }, 1000)
89 | }
90 |
91 | return response;
92 | }
--------------------------------------------------------------------------------
/tracer-npm-package/out/_next/static/chunks/365-19e3808453cf1bc5.js:
--------------------------------------------------------------------------------
1 | "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[365],{2024:function(t,e,n){n.d(e,{UQ:function(){return rt},KF:function(){return ct},Qd:function(){return st},Hk:function(){return ut}});n(894);var r=n(2846),i=n(4592),o=n(8554),a=n.n(o),s=n(4441),c=n(7751),u=n(7294);function l(t,e){if(null==t)return{};var n,r,i={},o=Object.keys(t);for(r=0;r=0||(i[n]=t[n]);return i}function f(){return(f=Object.assign||function(t){for(var e=1;e0?1:0)},{overflow:"hidden",height:i,transitionEnd:null==a?void 0:a.exit,transition:null!=(e=null==o?void 0:o.exit)?e:x(E.exit,s)})},enter:function(t){var e,n=t.animateOpacity,r=t.endingHeight,i=t.transition,o=t.transitionEnd,a=t.delay;return f({},n&&{opacity:1},{height:r,transitionEnd:null==o?void 0:o.enter,transition:null!=(e=null==i?void 0:i.enter)?e:v(E.enter,a)})}},k=u.forwardRef((function(t,e){var n=t.in,r=t.unmountOnExit,o=t.animateOpacity,d=void 0===o||o,h=t.startingHeight,p=void 0===h?0:h,g=t.endingHeight,m=void 0===g?"auto":g,y=t.style,b=t.className,v=t.transition,x=t.transitionEnd,E=l(t,w),k=u.useState(!1),_=k[0],M=k[1];u.useEffect((function(){var t=setTimeout((function(){M(!0)}));return function(){return clearTimeout(t)}}),[]),(0,i.ZK)({condition:Boolean(p>0&&r),message:"startingHeight and unmountOnExit are mutually exclusive. You can't use them together"});var T=parseFloat(p.toString())>0,P={startingHeight:p,endingHeight:m,animateOpacity:d,transition:_?v:{enter:{duration:0}},transitionEnd:a()(x,{enter:{overflow:"initial"},exit:r?void 0:{display:T?"block":"none"}})},C=!r||n,I=n||r?"enter":"exit";return u.createElement(s.M,{initial:!1,custom:P},C&&u.createElement(c.E.div,f({ref:e},E,{className:(0,i.cx)("chakra-collapse",b),style:f({overflow:"hidden",display:"block"},y),custom:P,variants:O,initial:!!r&&"exit",animate:I,exit:"exit"})))}));i.Ts&&(k.displayName="Collapse");var _=["unmountOnExit","in","className","transition","transitionEnd","delay"],M={initial:"exit",animate:"enter",exit:"exit",variants:{enter:function(t){var e,n=void 0===t?{}:t,r=n.transition,i=n.transitionEnd,o=n.delay;return{opacity:1,transition:null!=(e=null==r?void 0:r.enter)?e:v(b.enter,o),transitionEnd:null==i?void 0:i.enter}},exit:function(t){var e,n=void 0===t?{}:t,r=n.transition,i=n.transitionEnd,o=n.delay;return{opacity:0,transition:null!=(e=null==r?void 0:r.exit)?e:x(b.exit,o),transitionEnd:null==i?void 0:i.exit}}}},T=u.forwardRef((function(t,e){var n=t.unmountOnExit,r=t.in,o=t.className,a=t.transition,d=t.transitionEnd,h=t.delay,p=l(t,_),g=r||n?"enter":"exit",m=!n||r&&n,y={transition:a,transitionEnd:d,delay:h};return u.createElement(s.M,{custom:y},m&&u.createElement(c.E.div,f({ref:e,className:(0,i.cx)("chakra-fade",o),custom:y},M,{animate:g},p)))}));i.Ts&&(T.displayName="Fade");var P=["unmountOnExit","in","reverse","initialScale","className","transition","transitionEnd","delay"],C={initial:"exit",animate:"enter",exit:"exit",variants:{exit:function(t){var e,n=t.reverse,r=t.initialScale,i=t.transition,o=t.transitionEnd,a=t.delay;return f({opacity:0},n?{scale:r,transitionEnd:null==o?void 0:o.exit}:{transitionEnd:f({scale:r},null==o?void 0:o.exit)},{transition:null!=(e=null==i?void 0:i.exit)?e:x(b.exit,a)})},enter:function(t){var e,n=t.transitionEnd,r=t.transition,i=t.delay;return{opacity:1,scale:1,transition:null!=(e=null==r?void 0:r.enter)?e:v(b.enter,i),transitionEnd:null==n?void 0:n.enter}}}},I=u.forwardRef((function(t,e){var n=t.unmountOnExit,r=t.in,o=t.reverse,a=void 0===o||o,d=t.initialScale,h=void 0===d?.95:d,p=t.className,g=t.transition,m=t.transitionEnd,y=t.delay,b=l(t,P),v=!n||r&&n,x=r||n?"enter":"exit",w={initialScale:h,reverse:a,transition:g,transitionEnd:m,delay:y};return u.createElement(s.M,{custom:w},v&&u.createElement(c.E.div,f({ref:e,className:(0,i.cx)("chakra-offset-slide",p)},C,{animate:x,custom:w},b)))}));i.Ts&&(I.displayName="ScaleFade");var R=["direction","style","unmountOnExit","in","className","transition","transitionEnd","delay"],S={exit:{duration:.15,ease:d.easeInOut},enter:{type:"spring",damping:25,stiffness:180}},N={exit:function(t){var e,n=t.direction,r=t.transition,i=t.transitionEnd,o=t.delay;return f({},y({direction:n}).exit,{transition:null!=(e=null==r?void 0:r.exit)?e:x(S.exit,o),transitionEnd:null==i?void 0:i.exit})},enter:function(t){var e,n=t.direction,r=t.transitionEnd,i=t.transition,o=t.delay;return f({},y({direction:n}).enter,{transition:null!=(e=null==i?void 0:i.enter)?e:v(S.enter,o),transitionEnd:null==r?void 0:r.enter})}},j=u.forwardRef((function(t,e){var n=t.direction,r=void 0===n?"right":n,o=t.style,a=t.unmountOnExit,d=t.in,h=t.className,p=t.transition,g=t.transitionEnd,m=t.delay,b=l(t,R),v=y({direction:r}),x=Object.assign({position:"fixed"},v.position,o),w=!a||d&&a,E=d||a?"enter":"exit",O={transitionEnd:g,transition:p,direction:r,delay:m};return u.createElement(s.M,{custom:O},w&&u.createElement(c.E.div,f({},b,{ref:e,initial:"exit",className:(0,i.cx)("chakra-slide",h),animate:E,exit:"exit",custom:O,variants:N,style:x})))}));i.Ts&&(j.displayName="Slide");var A=["unmountOnExit","in","reverse","className","offsetX","offsetY","transition","transitionEnd","delay"],F={initial:"initial",animate:"enter",exit:"exit",variants:{initial:function(t){var e,n=t.offsetX,r=t.offsetY,i=t.transition,o=t.transitionEnd,a=t.delay;return{opacity:0,x:n,y:r,transition:null!=(e=null==i?void 0:i.exit)?e:x(b.exit,a),transitionEnd:null==o?void 0:o.exit}},enter:function(t){var e,n=t.transition,r=t.transitionEnd,i=t.delay;return{opacity:1,x:0,y:0,transition:null!=(e=null==n?void 0:n.enter)?e:v(b.enter,i),transitionEnd:null==r?void 0:r.enter}},exit:function(t){var e,n=t.offsetY,r=t.offsetX,i=t.transition,o=t.transitionEnd,a=t.reverse,s=t.delay,c={x:r,y:n};return f({opacity:0,transition:null!=(e=null==i?void 0:i.exit)?e:x(b.exit,s)},a?f({},c,{transitionEnd:null==o?void 0:o.exit}):{transitionEnd:f({},c,null==o?void 0:o.exit)})}}},D=u.forwardRef((function(t,e){var n=t.unmountOnExit,r=t.in,o=t.reverse,a=void 0===o||o,d=t.className,h=t.offsetX,p=void 0===h?0:h,g=t.offsetY,m=void 0===g?8:g,y=t.transition,b=t.transitionEnd,v=t.delay,x=l(t,A),w=!n||r&&n,E=r||n?"enter":"exit",O={offsetX:p,offsetY:m,reverse:a,transition:y,transitionEnd:b,delay:v};return u.createElement(s.M,{custom:O},w&&u.createElement(c.E.div,f({ref:e,className:(0,i.cx)("chakra-offset-slide",d),custom:O},F,{animate:E},x)))}));i.Ts&&(D.displayName="SlideFade");var Y=n(6450),$=n(242),H=n(7375);function B(){return(B=Object.assign||function(t){for(var e=1;e=0||(i[n]=t[n]);return i}var L=["onChange","defaultIndex","index","allowMultiple","allowToggle"],K=["isDisabled","isFocusable","id"],X=(0,$.n)(),z=X[0],q=(X[1],X[2]),Z=X[3];function G(t){var e=t.onChange,n=t.defaultIndex,r=t.index,o=t.allowMultiple,a=t.allowToggle,s=W(t,L);!function(t){var e=t.index||t.defaultIndex,n=!(0,i.o8)(e)&&!(0,i.kJ)(e)&&t.allowMultiple;(0,i.ZK)({condition:!!n,message:"If 'allowMultiple' is passed, then 'index' or 'defaultIndex' must be an array. You passed: "+typeof e+","})}(t),function(t){(0,i.ZK)({condition:!(!t.allowMultiple||!t.allowToggle),message:"If 'allowMultiple' is passed, 'allowToggle' will be ignored. Either remove 'allowToggle' or 'allowMultiple' depending on whether you want multiple accordions visible or not"})}(t);var c=q(),l=(0,u.useState)(-1),f=l[0],d=l[1];(0,H.zq)((function(){d(-1)}));var h=(0,H.Tx)({value:r,defaultValue:function(){return o?null!=n?n:[]:null!=n?n:-1},onChange:e}),p=h[0],g=h[1];return{index:p,setIndex:g,htmlProps:s,getAccordionItemProps:function(t){var e=!1;null!==t&&(e=(0,i.kJ)(p)?p.includes(t):p===t);return{isOpen:e,onChange:function(e){if(null!==t)if(o&&(0,i.kJ)(p)){var n=e?(0,i.jX)(p,t):(0,i.cl)(p,t);g(n)}else e?g(t):a&&g(-1)}}},focusedIndex:f,setFocusedIndex:d,descendants:c}}var Q=(0,Y.kr)({name:"AccordionContext",errorMessage:"useAccordionContext: `context` is undefined. Seems you forgot to wrap the accordion components in ``"}),U=Q[0],V=Q[1];function J(t){var e=t.isDisabled,n=t.isFocusable,r=t.id,o=W(t,K),a=V(),s=a.getAccordionItemProps,c=a.setFocusedIndex,l=(0,u.useRef)(null),f=(0,H.ZS)(r,"accordion-button","accordion-panel"),d=f[0],h=f[1];!function(t){(0,i.ZK)({condition:!(!t.isFocusable||t.isDisabled),message:"Using only 'isFocusable', this prop is reserved for situations where you pass 'isDisabled' but you still want the element to receive focus (A11y). Either remove it or pass 'isDisabled' as well.\n "})}(t);var p=Z({disabled:e&&!n}),g=p.register,m=p.index,y=p.descendants,b=s(-1===m?null:m),v=b.isOpen,x=b.onChange;!function(t){(0,i.ZK)({condition:t.isOpen&&!!t.isDisabled,message:"Cannot open a disabled accordion item"})}({isOpen:v,isDisabled:e});var w=(0,u.useCallback)((function(){null==x||x(!v),c(m)}),[m,c,v,x]),E=(0,u.useCallback)((function(t){var e={ArrowDown:function(){var t=y.nextEnabled(m);t&&(0,i.T_)(t.node)},ArrowUp:function(){var t=y.prevEnabled(m);t&&(0,i.T_)(t.node)},Home:function(){var t=y.firstEnabled();t&&(0,i.T_)(t.node)},End:function(){var t=y.lastEnabled();t&&(0,i.T_)(t.node)}}[(0,i.uh)(t)];e&&(t.preventDefault(),e(t))}),[y,m]),O=(0,u.useCallback)((function(){c(m)}),[c,m]),k=(0,u.useCallback)((function(t,n){return void 0===t&&(t={}),void 0===n&&(n=null),B({},t,{type:"button",ref:(0,Y.lq)(g,l,n),id:d,disabled:!!e,"aria-expanded":!!v,"aria-controls":h,onClick:(0,i.v0)(t.onClick,w),onFocus:(0,i.v0)(t.onFocus,O),onKeyDown:(0,i.v0)(t.onKeyDown,E)})}),[d,e,v,w,O,E,h,g]),_=(0,u.useCallback)((function(t,e){return void 0===t&&(t={}),void 0===e&&(e=null),B({},t,{ref:e,role:"region",id:h,"aria-labelledby":d,hidden:!v})}),[d,v,h]);return{isOpen:v,isDisabled:e,isFocusable:n,onOpen:function(){null==x||x(!0)},onClose:function(){null==x||x(!1)},getButtonProps:k,getPanelProps:_,htmlProps:o}}var tt=["children","reduceMotion"],et=["htmlProps","descendants"],nt=["htmlProps"],rt=(0,r.Gp)((function(t,e){var n=t.children,o=t.reduceMotion,a=W(t,tt),s=(0,r.jC)("Accordion",a),c=G((0,r.Lr)(a)),l=c.htmlProps,f=c.descendants,d=W(c,et),h=u.useMemo((function(){return B({},d,{reduceMotion:!!o})}),[d,o]);return u.createElement(z,{value:f},u.createElement(U,{value:h},u.createElement(r.Fo,{value:s},u.createElement(r.m$.div,B({ref:e},l,{className:(0,i.cx)("chakra-accordion",a.className)}),n))))}));i.Ts&&(rt.displayName="Accordion");var it=(0,Y.kr)({name:"AccordionItemContext",errorMessage:"useAccordionItemContext: `context` is undefined. Seems you forgot to wrap the accordion item parts in `` "}),ot=it[0],at=it[1],st=(0,r.Gp)((function(t,e){var n=t.children,o=t.className,a=J(t),s=a.htmlProps,c=W(a,nt),l=B({},(0,r.yK)().container,{overflowAnchor:"none"}),f=u.useMemo((function(){return c}),[c]);return u.createElement(ot,{value:f},u.createElement(r.m$.div,B({ref:e},s,{className:(0,i.cx)("chakra-accordion__item",o),__css:l}),(0,i.Pu)(n,{isExpanded:!!c.isOpen,isDisabled:!!c.isDisabled})))}));i.Ts&&(st.displayName="AccordionItem");var ct=(0,r.Gp)((function(t,e){var n=(0,at().getButtonProps)(t,e),o=B({display:"flex",alignItems:"center",width:"100%",outline:0},(0,r.yK)().button);return u.createElement(r.m$.button,B({},n,{className:(0,i.cx)("chakra-accordion__button",t.className),__css:o}))}));i.Ts&&(ct.displayName="AccordionButton");var ut=(0,r.Gp)((function(t,e){var n=V().reduceMotion,o=at(),a=o.getPanelProps,s=o.isOpen,c=a(t,e),l=(0,i.cx)("chakra-accordion__panel",t.className),f=(0,r.yK)();n||delete c.hidden;var d=u.createElement(r.m$.div,B({},c,{__css:f.panel,className:l}));return n?d:u.createElement(k,{in:s},d)}));i.Ts&&(ut.displayName="AccordionPanel");i.Ts},1440:function(t,e,n){n.d(e,{u:function(){return v}});var r=n(1662),i=n(6871),o=n(2846),a=n(4592),s=n(1358),c=n(7751),u=n(4441),l=n(7294),f=n(7375),d=n(6450);function h(){return(h=Object.assign||function(t){for(var e=1;e=0||(i[n]=t[n]);return i}var g={exit:{scale:.85,opacity:0,transition:{opacity:{duration:.15,easings:"easeInOut"},scale:{duration:.2,easings:"easeInOut"}}},enter:{scale:1,opacity:1,transition:{opacity:{easings:"easeOut",duration:.2},scale:{duration:.2,ease:[.175,.885,.4,1.1]}}}},m=["openDelay","closeDelay","closeOnClick","closeOnMouseDown","onOpen","onClose","placement","id","isOpen","defaultIsOpen","arrowSize","arrowShadowColor","arrowPadding","modifiers","isDisabled","gutter","offset","direction"];var y=["children","label","shouldWrapChildren","aria-label","hasArrow","bg","portalProps"],b=(0,o.m$)(c.E.div),v=(0,o.Gp)((function(t,e){var n=(0,o.mq)("Tooltip",t),c=(0,o.Lr)(t),v=(0,o.Fg)(),x=c.children,w=c.label,E=c.shouldWrapChildren,O=c["aria-label"],k=c.hasArrow,_=c.bg,M=c.portalProps,T=p(c,y);_&&(n.bg=_,n[r.j.arrowBg.var]=(0,a.K1)(v,"colors",_));var P,C=function(t){void 0===t&&(t={});var e=t,n=e.openDelay,i=void 0===n?0:n,o=e.closeDelay,s=void 0===o?0:o,c=e.closeOnClick,u=void 0===c||c,g=e.closeOnMouseDown,y=e.onOpen,b=e.onClose,v=e.placement,x=e.id,w=e.isOpen,E=e.defaultIsOpen,O=e.arrowSize,k=void 0===O?10:O,_=e.arrowShadowColor,M=e.arrowPadding,T=e.modifiers,P=e.isDisabled,C=e.gutter,I=e.offset,R=e.direction,S=p(e,m),N=(0,f.qY)({isOpen:w,defaultIsOpen:E,onOpen:y,onClose:b}),j=N.isOpen,A=N.onOpen,F=N.onClose,D=(0,r.D)({enabled:j,placement:v,arrowPadding:M,modifiers:T,gutter:C,offset:I,direction:R}),Y=D.referenceRef,$=D.getPopperProps,H=D.getArrowInnerProps,B=D.getArrowProps,W=(0,f.Me)(x,"tooltip"),L=l.useRef(null),K=l.useRef(),X=l.useRef(),z=l.useCallback((function(){P||(K.current=window.setTimeout(A,i))}),[P,A,i]),q=l.useCallback((function(){K.current&&clearTimeout(K.current),X.current=window.setTimeout(F,s)}),[s,F]),Z=l.useCallback((function(){u&&q()}),[u,q]),G=l.useCallback((function(){g&&q()}),[g,q]),Q=l.useCallback((function(t){j&&"Escape"===t.key&&q()}),[j,q]);(0,f.OR)("keydown",Q),l.useEffect((function(){return function(){clearTimeout(K.current),clearTimeout(X.current)}}),[]),(0,f.OR)("mouseleave",q,(function(){return L.current}));var U=l.useCallback((function(t,e){return void 0===t&&(t={}),void 0===e&&(e=null),h({},t,{ref:(0,d.lq)(L,e,Y),onMouseEnter:(0,a.v0)(t.onMouseEnter,z),onClick:(0,a.v0)(t.onClick,Z),onMouseDown:(0,a.v0)(t.onMouseDown,G),onFocus:(0,a.v0)(t.onFocus,z),onBlur:(0,a.v0)(t.onBlur,q),"aria-describedby":j?W:void 0})}),[z,q,G,j,W,Z,Y]),V=l.useCallback((function(t,e){var n;return void 0===t&&(t={}),void 0===e&&(e=null),$(h({},t,{style:h({},t.style,(n={},n[r.j.arrowSize.var]=k?(0,a.px)(k):void 0,n[r.j.arrowShadowColor.var]=_,n))}),e)}),[$,k,_]),J=l.useCallback((function(t,e){return void 0===t&&(t={}),void 0===e&&(e=null),h({ref:e},S,t,{id:W,role:"tooltip",style:h({},t.style,{position:"relative",transformOrigin:r.j.transformOrigin.varRef})})}),[S,W]);return{isOpen:j,show:z,hide:q,getTriggerProps:U,getTooltipProps:J,getTooltipPositionerProps:V,getArrowProps:B,getArrowInnerProps:H}}(h({},T,{direction:v.direction}));if((0,a.HD)(x)||E)P=l.createElement(o.m$.span,h({tabIndex:0},C.getTriggerProps()),x);else{var I=l.Children.only(x);P=l.cloneElement(I,C.getTriggerProps(I.props,I.ref))}var R=!!O,S=C.getTooltipProps({},e),N=R?(0,a.CE)(S,["role","id"]):S,j=(0,a.ei)(S,["role","id"]);return w?l.createElement(l.Fragment,null,P,l.createElement(u.M,null,C.isOpen&&l.createElement(i.h_,M,l.createElement(o.m$.div,h({},C.getTooltipPositionerProps(),{__css:{zIndex:n.zIndex,pointerEvents:"none"}}),l.createElement(b,h({variants:g},N,{initial:"exit",animate:"enter",exit:"exit",__css:n}),w,R&&l.createElement(s.TX,j,O),k&&l.createElement(o.m$.div,{"data-popper-arrow":!0,className:"chakra-tooltip__arrow-wrapper"},l.createElement(o.m$.div,{"data-popper-arrow-inner":!0,className:"chakra-tooltip__arrow",__css:{bg:n.bg}}))))))):l.createElement(l.Fragment,null,x)}));a.Ts&&(v.displayName="Tooltip")},9042:function(t,e,n){n.d(e,{iA:function(){return d},p3:function(){return g},Td:function(){return v},$R:function(){return m},Th:function(){return y},hr:function(){return p},Tr:function(){return b}});var r=n(2846),i=n(4592),o=n(7294);function a(){return(a=Object.assign||function(t){for(var e=1;e=0||(i[n]=t[n]);return i}var c=["className"],u=["placement"],l=["isNumeric"],f=["isNumeric"],d=(0,r.Gp)((function(t,e){var n=(0,r.jC)("Table",t),u=(0,r.Lr)(t),l=u.className,f=s(u,c);return o.createElement(r.Fo,{value:n},o.createElement(r.m$.table,a({role:"table",ref:e,__css:n.table,className:(0,i.cx)("chakra-table",l)},f)))}));i.Ts&&(d.displayName="Table");var h=(0,r.Gp)((function(t,e){var n=t.placement,i=void 0===n?"bottom":n,c=s(t,u),l=(0,r.yK)();return o.createElement(r.m$.caption,a({},c,{ref:e,__css:a({},l.caption,{captionSide:i})}))}));i.Ts&&(h.displayName="TableCaption");var p=(0,r.Gp)((function(t,e){var n=(0,r.yK)();return o.createElement(r.m$.thead,a({},t,{ref:e,__css:n.thead}))})),g=(0,r.Gp)((function(t,e){var n=(0,r.yK)();return o.createElement(r.m$.tbody,a({},t,{ref:e,__css:n.tbody}))})),m=(0,r.Gp)((function(t,e){var n=(0,r.yK)();return o.createElement(r.m$.tfoot,a({},t,{ref:e,__css:n.tfoot}))})),y=(0,r.Gp)((function(t,e){var n=t.isNumeric,i=s(t,l),c=(0,r.yK)();return o.createElement(r.m$.th,a({},i,{ref:e,__css:c.th,"data-is-numeric":n}))})),b=(0,r.Gp)((function(t,e){var n=(0,r.yK)();return o.createElement(r.m$.tr,a({role:"row"},t,{ref:e,__css:n.tr}))})),v=(0,r.Gp)((function(t,e){var n=t.isNumeric,i=s(t,f),c=(0,r.yK)();return o.createElement(r.m$.td,a({role:"gridcell"},i,{ref:e,__css:c.td,"data-is-numeric":n}))}))},3940:function(t,e,n){n.d(e,{$:function(){return s},A:function(){return Oe},B:function(){return me},C:function(){return x},D:function(){return rn},E:function(){return Qe},F:function(){return sn},G:function(){return i},H:function(){return $},I:function(){return an},J:function(){return Ge},K:function(){return W},L:function(){return X},M:function(){return g},N:function(){return v},O:function(){return ve},P:function(){return j},Q:function(){return U},R:function(){return Ut},S:function(){return ot},T:function(){return A},U:function(){return Jt},V:function(){return re},W:function(){return se},X:function(){return ie},Y:function(){return ye},Z:function(){return a},_:function(){return Pe},a:function(){return be},a0:function(){return zt},a1:function(){return _},a2:function(){return I},a3:function(){return qt},a4:function(){return S},a5:function(){return Ie},a6:function(){return Ce},a7:function(){return Re},a8:function(){return M},a9:function(){return l},aA:function(){return u},aB:function(){return tt},aC:function(){return G},aD:function(){return K},aE:function(){return Z},aF:function(){return q},aG:function(){return V},aH:function(){return Vt},aI:function(){return ke},aJ:function(){return we},aa:function(){return o},ab:function(){return on},ac:function(){return te},ad:function(){return N},ae:function(){return w},af:function(){return J},ag:function(){return at},ah:function(){return he},ai:function(){return Ze},aj:function(){return xn},ak:function(){return vn},al:function(){return un},am:function(){return ln},an:function(){return cn},ao:function(){return oe},ap:function(){return ae},aq:function(){return ee},ar:function(){return ue},as:function(){return pe},at:function(){return ge},au:function(){return bn},av:function(){return nt},aw:function(){return hn},ax:function(){return pn},ay:function(){return c},az:function(){return gn},b:function(){return d},c:function(){return Kt},d:function(){return Qt},e:function(){return lt},f:function(){return C},g:function(){return p},h:function(){return xe},i:function(){return h},j:function(){return R},k:function(){return f},l:function(){return Me},m:function(){return y},n:function(){return b},o:function(){return dn},p:function(){return rt},q:function(){return z},r:function(){return r},s:function(){return L},t:function(){return Q},u:function(){return Te},v:function(){return m},w:function(){return it},x:function(){return Ee},y:function(){return en},z:function(){return ne}});const r="undefined"===typeof window?function(t){return t()}:window.requestAnimationFrame;function i(t,e,n){const i=n||(t=>Array.prototype.slice.call(t));let o=!1,a=[];return function(...n){a=i(n),o||(o=!0,r.call(window,(()=>{o=!1,t.apply(e,a)})))}}function o(t,e){let n;return function(...r){return e?(clearTimeout(n),n=setTimeout(t,e,r)):t.apply(this,r),e}}const a=t=>"start"===t?"left":"end"===t?"right":"center",s=(t,e,n)=>"start"===t?e:"end"===t?n:(e+n)/2,c=(t,e,n,r)=>t===(r?"left":"right")?n:"center"===t?(e+n)/2:e;function u(){}const l=function(){let t=0;return function(){return t++}}();function f(t){return null===t||"undefined"===typeof t}function d(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)}function h(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}const p=t=>("number"===typeof t||t instanceof Number)&&isFinite(+t);function g(t,e){return p(t)?t:e}function m(t,e){return"undefined"===typeof t?e:t}const y=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100:t/e,b=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function v(t,e,n){if(t&&"function"===typeof t.call)return t.apply(n,e)}function x(t,e,n,r){let i,o,a;if(d(t))if(o=t.length,r)for(i=o-1;i>=0;i--)e.call(n,t[i],i);else for(i=0;in;)t=t[e.substr(n,r-n)],n=r+1,r=P(e,n);return t}function I(t){return t.charAt(0).toUpperCase()+t.slice(1)}const R=t=>"undefined"!==typeof t,S=t=>"function"===typeof t,N=(t,e)=>{if(t.size!==e.size)return!1;for(const n of t)if(!e.has(n))return!1;return!0},j=Math.PI,A=2*j,F=A+j,D=Number.POSITIVE_INFINITY,Y=j/180,$=j/2,H=j/4,B=2*j/3,W=Math.log10,L=Math.sign;function K(t){const e=Math.round(t);t=q(t,e,t/1e3)?e:t;const n=Math.pow(10,Math.floor(W(t))),r=t/n;return(r<=1?1:r<=2?2:r<=5?5:10)*n}function X(t){const e=[],n=Math.sqrt(t);let r;for(r=1;rt-e)).pop(),e}function z(t){return!isNaN(parseFloat(t))&&isFinite(t)}function q(t,e,n){return Math.abs(t-e)=t}function G(t,e,n){let r,i,o;for(r=0,i=t.length;rc&&u=Math.min(e,n)-r&&t<=Math.max(e,n)+r}const st=t=>0===t||1===t,ct=(t,e,n)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*A/n),ut=(t,e,n)=>Math.pow(2,-10*t)*Math.sin((t-e)*A/n)+1,lt={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*$),easeOutSine:t=>Math.sin(t*$),easeInOutSine:t=>-.5*(Math.cos(j*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>st(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>st(t)?t:ct(t,.075,.3),easeOutElastic:t=>st(t)?t:ut(t,.075,.3),easeInOutElastic(t){const e=.1125;return st(t)?t:t<.5?.5*ct(2*t,e,.45):.5+.5*ut(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-lt.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,n=2.75;return t<1/n?e*t*t:t<2/n?e*(t-=1.5/n)*t+.75:t<2.5/n?e*(t-=2.25/n)*t+.9375:e*(t-=2.625/n)*t+.984375},easeInOutBounce:t=>t<.5?.5*lt.easeInBounce(2*t):.5*lt.easeOutBounce(2*t-1)+.5},ft={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},dt="0123456789ABCDEF",ht=t=>dt[15&t],pt=t=>dt[(240&t)>>4]+dt[15&t],gt=t=>(240&t)>>4===(15&t);function mt(t){var e=function(t){return gt(t.r)&>(t.g)&>(t.b)&>(t.a)}(t)?ht:pt;return t?"#"+e(t.r)+e(t.g)+e(t.b)+(t.a<255?e(t.a):""):t}function yt(t){return t+.5|0}const bt=(t,e,n)=>Math.max(Math.min(t,n),e);function vt(t){return bt(yt(2.55*t),0,255)}function xt(t){return bt(yt(255*t),0,255)}function wt(t){return bt(yt(t/2.55)/100,0,1)}function Et(t){return bt(yt(100*t),0,100)}const Ot=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const kt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function _t(t,e,n){const r=e*Math.min(n,1-n),i=(e,i=(e+t/30)%12)=>n-r*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Mt(t,e,n){const r=(r,i=(r+t/60)%6)=>n-n*e*Math.max(Math.min(i,4-i,1),0);return[r(5),r(3),r(1)]}function Tt(t,e,n){const r=_t(t,1,.5);let i;for(e+n>1&&(i=1/(e+n),e*=i,n*=i),i=0;i<3;i++)r[i]*=1-e-n,r[i]+=e;return r}function Pt(t){const e=t.r/255,n=t.g/255,r=t.b/255,i=Math.max(e,n,r),o=Math.min(e,n,r),a=(i+o)/2;let s,c,u;return i!==o&&(u=i-o,c=a>.5?u/(2-i-o):u/(i+o),s=i===e?(n-r)/u+(n>16&255,o>>8&255,255&o]}return t}(),At.transparent=[0,0,0,0]);const e=At[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}function Dt(t,e,n){if(t){let r=Pt(t);r[e]=Math.max(0,Math.min(r[e]+r[e]*n,0===e?360:1)),r=It(r),t.r=r[0],t.g=r[1],t.b=r[2]}}function Yt(t,e){return t?Object.assign(e||{},t):t}function $t(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=xt(t[3]))):(e=Yt(t,{r:0,g:0,b:0,a:1})).a=xt(e.a),e}function Ht(t){return"r"===t.charAt(0)?function(t){const e=Ot.exec(t);let n,r,i,o=255;if(e){if(e[7]!==n){const t=+e[7];o=255&(e[8]?vt(t):255*t)}return n=+e[1],r=+e[3],i=+e[5],n=255&(e[2]?vt(n):n),r=255&(e[4]?vt(r):r),i=255&(e[6]?vt(i):i),{r:n,g:r,b:i,a:o}}}(t):St(t)}class Bt{constructor(t){if(t instanceof Bt)return t;const e=typeof t;let n;"object"===e?n=$t(t):"string"===e&&(n=function(t){var e,n=t.length;return"#"===t[0]&&(4===n||5===n?e={r:255&17*ft[t[1]],g:255&17*ft[t[2]],b:255&17*ft[t[3]],a:5===n?17*ft[t[4]]:255}:7!==n&&9!==n||(e={r:ft[t[1]]<<4|ft[t[2]],g:ft[t[3]]<<4|ft[t[4]],b:ft[t[5]]<<4|ft[t[6]],a:9===n?ft[t[7]]<<4|ft[t[8]]:255})),e}(t)||Ft(t)||Ht(t)),this._rgb=n,this._valid=!!n}get valid(){return this._valid}get rgb(){var t=Yt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=$t(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):this._rgb;var t}hexString(){return this._valid?mt(this._rgb):this._rgb}hslString(){return this._valid?function(t){if(!t)return;const e=Pt(t),n=e[0],r=Et(e[1]),i=Et(e[2]);return t.a<255?`hsla(${n}, ${r}%, ${i}%, ${wt(t.a)})`:`hsl(${n}, ${r}%, ${i}%)`}(this._rgb):this._rgb}mix(t,e){const n=this;if(t){const r=n.rgb,i=t.rgb;let o;const a=e===o?.5:e,s=2*a-1,c=r.a-i.a,u=((s*c===-1?s:(s+c)/(1+s*c))+1)/2;o=1-u,r.r=255&u*r.r+o*i.r+.5,r.g=255&u*r.g+o*i.g+.5,r.b=255&u*r.b+o*i.b+.5,r.a=a*r.a+(1-a)*i.a,n.rgb=r}return n}clone(){return new Bt(this.rgb)}alpha(t){return this._rgb.a=xt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=yt(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Dt(this._rgb,2,t),this}darken(t){return Dt(this._rgb,2,-t),this}saturate(t){return Dt(this._rgb,1,t),this}desaturate(t){return Dt(this._rgb,1,-t),this}rotate(t){return function(t,e){var n=Pt(t);n[0]=Rt(n[0]+e),n=It(n),t.r=n[0],t.g=n[1],t.b=n[2]}(this._rgb,t),this}}function Wt(t){return new Bt(t)}const Lt=t=>t instanceof CanvasGradient||t instanceof CanvasPattern;function Kt(t){return Lt(t)?t:Wt(t)}function Xt(t){return Lt(t)?t:Wt(t).saturate(.5).darken(.1).hexString()}const zt=Object.create(null),qt=Object.create(null);function Zt(t,e){if(!e)return t;const n=e.split(".");for(let r=0,i=n.length;rt.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>Xt(e.backgroundColor),this.hoverBorderColor=(t,e)=>Xt(e.borderColor),this.hoverColor=(t,e)=>Xt(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.describe(t)}set(t,e){return Gt(this,t,e)}get(t){return Zt(this,t)}describe(t,e){return Gt(qt,t,e)}override(t,e){return Gt(zt,t,e)}route(t,e,n,r){const i=Zt(this,t),o=Zt(this,n),a="_"+e;Object.defineProperties(i,{[a]:{value:i[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[a],e=o[r];return h(t)?Object.assign({},e,t):m(t,e)},set(t){this[a]=t}}})}}({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});function Ut(t,e,n,r,i){let o=e[i];return o||(o=e[i]=t.measureText(i).width,n.push(i)),o>r&&(r=o),r}function Vt(t,e,n,r){let i=(r=r||{}).data=r.data||{},o=r.garbageCollect=r.garbageCollect||[];r.font!==e&&(i=r.data={},o=r.garbageCollect=[],r.font=e),t.save(),t.font=e;let a=0;const s=n.length;let c,u,l,f,h;for(c=0;cn.length){for(c=0;c0&&t.stroke()}}function ne(t,e,n){return n=n||.5,!e||t&&t.x>e.left-n&&t.xe.top-n&&t.y0&&""!==o.strokeColor;let c,u;for(t.save(),t.font=i.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]);f(e.rotation)||t.rotate(e.rotation);e.color&&(t.fillStyle=e.color);e.textAlign&&(t.textAlign=e.textAlign);e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,o),c=0;cm(t[n],t[e[n]]):e=>t[e]:()=>t;for(const a of i)n[a]=+o(a)||0;return n}function pe(t){return he(t,{top:"y",right:"x",bottom:"y",left:"x"})}function ge(t){return he(t,["topLeft","topRight","bottomLeft","bottomRight"])}function me(t){const e=pe(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function ye(t,e){t=t||{},e=e||Qt.font;let n=m(t.size,e.size);"string"===typeof n&&(n=parseInt(n,10));let r=m(t.style,e.style);r&&!(""+r).match(fe)&&(console.warn('Invalid font style specified: "'+r+'"'),r="");const i={family:m(t.family,e.family),lineHeight:de(m(t.lineHeight,e.lineHeight),n),size:n,style:r,weight:m(t.weight,e.weight),string:""};return i.string=function(t){return!t||f(t.size)||f(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(i),i}function be(t,e,n,r){let i,o,a,s=!0;for(i=0,o=t.length;in&&0===t?0:t+e;return{min:a(r,-Math.abs(o)),max:a(i,o)}}function xe(t,e){return Object.assign(Object.create(t),e)}function we(t,e,n){n=n||(n=>t[n]1;)r=o+i>>1,n(r)?o=r:i=r;return{lo:o,hi:i}}const Ee=(t,e,n)=>we(t,n,(r=>t[r][e]we(t,n,(r=>t[r][e]>=n));function ke(t,e,n){let r=0,i=t.length;for(;rr&&t[i-1]>n;)i--;return r>0||i{const n="_onData"+I(e),r=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const i=r.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"===typeof t[n]&&t[n](...e)})),i}})})))}function Te(t,e){const n=t._chartjs;if(!n)return;const r=n.listeners,i=r.indexOf(e);-1!==i&&r.splice(i,1),r.length>0||(_e.forEach((e=>{delete t[e]})),delete t._chartjs)}function Pe(t){const e=new Set;let n,r;for(n=0,r=t.length;nt[0])){R(r)||(r=He("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:n,_fallback:r,_getTarget:i,override:i=>Ce([i,...t],e,n,r)};return new Proxy(o,{deleteProperty:(e,n)=>(delete e[n],delete e._keys,delete t[0][n],!0),get:(n,r)=>je(n,r,(()=>function(t,e,n,r){let i;for(const o of e)if(i=He(Se(o,t),n),R(i))return Ne(t,i)?Ye(n,r,t,i):i}(r,e,t,n))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>Be(t).includes(e),ownKeys:t=>Be(t),set(t,e,n){const r=t._storage||(t._storage=i());return t[e]=r[e]=n,delete t._keys,!0}})}function Ie(t,e,n,r){const i={_cacheable:!1,_proxy:t,_context:e,_subProxy:n,_stack:new Set,_descriptors:Re(t,r),setContext:e=>Ie(t,e,n,r),override:i=>Ie(t.override(i),e,n,r)};return new Proxy(i,{deleteProperty:(e,n)=>(delete e[n],delete t[n],!0),get:(t,e,n)=>je(t,e,(()=>function(t,e,n){const{_proxy:r,_context:i,_subProxy:o,_descriptors:a}=t;let s=r[e];S(s)&&a.isScriptable(e)&&(s=function(t,e,n,r){const{_proxy:i,_context:o,_subProxy:a,_stack:s}=n;if(s.has(t))throw new Error("Recursion detected: "+Array.from(s).join("->")+"->"+t);s.add(t),e=e(o,a||r),s.delete(t),Ne(t,e)&&(e=Ye(i._scopes,i,t,e));return e}(e,s,t,n));d(s)&&s.length&&(s=function(t,e,n,r){const{_proxy:i,_context:o,_subProxy:a,_descriptors:s}=n;if(R(o.index)&&r(t))e=e[o.index%e.length];else if(h(e[0])){const n=e,r=i._scopes.filter((t=>t!==n));e=[];for(const c of n){const n=Ye(r,i,t,c);e.push(Ie(n,o,a&&a[t],s))}}return e}(e,s,t,a.isIndexable));Ne(e,s)&&(s=Ie(s,i,o&&o[e],a));return s}(t,e,n))),getOwnPropertyDescriptor:(e,n)=>e._descriptors.allKeys?Reflect.has(t,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,n),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,n)=>Reflect.has(t,n),ownKeys:()=>Reflect.ownKeys(t),set:(e,n,r)=>(t[n]=r,delete e[n],!0)})}function Re(t,e={scriptable:!0,indexable:!0}){const{_scriptable:n=e.scriptable,_indexable:r=e.indexable,_allKeys:i=e.allKeys}=t;return{allKeys:i,scriptable:n,indexable:r,isScriptable:S(n)?n:()=>n,isIndexable:S(r)?r:()=>r}}const Se=(t,e)=>t?t+I(e):e,Ne=(t,e)=>h(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function je(t,e,n){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const r=n();return t[e]=r,r}function Ae(t,e,n){return S(t)?t(e,n):t}const Fe=(t,e)=>!0===t?e:"string"===typeof t?C(e,t):void 0;function De(t,e,n,r){for(const i of e){const e=Fe(n,i);if(e){t.add(e);const i=Ae(e._fallback,n,e);if(R(i)&&i!==n&&i!==r)return i}else if(!1===e&&R(r)&&n!==r)return null}return!1}function Ye(t,e,n,r){const i=e._rootScopes,o=Ae(e._fallback,n,r),a=[...t,...i],s=new Set;s.add(r);let c=$e(s,a,n,o||n);return null!==c&&((!R(o)||o===n||(c=$e(s,a,o,c),null!==c))&&Ce(Array.from(s),[""],i,o,(()=>function(t,e,n){const r=t._getTarget();e in r||(r[e]={});const i=r[e];if(d(i)&&h(n))return n;return i}(e,n,r))))}function $e(t,e,n,r){for(;n;)n=De(t,e,n,r);return n}function He(t,e){for(const n of e){if(!n)continue;const e=n[t];if(R(e))return e}}function Be(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const n of t)for(const t of Object.keys(n).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}const We=Number.EPSILON||1e-14,Le=(t,e)=>e"x"===t?"y":"x";function Xe(t,e,n,r){const i=t.skip?e:t,o=e,a=n.skip?e:n,s=tt(o,i),c=tt(a,o);let u=s/(s+c),l=c/(s+c);u=isNaN(u)?0:u,l=isNaN(l)?0:l;const f=r*u,d=r*l;return{previous:{x:o.x-f*(a.x-i.x),y:o.y-f*(a.y-i.y)},next:{x:o.x+d*(a.x-i.x),y:o.y+d*(a.y-i.y)}}}function ze(t,e="x"){const n=Ke(e),r=t.length,i=Array(r).fill(0),o=Array(r);let a,s,c,u=Le(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)ze(t,i);else{let n=r?t[t.length-1]:t[0];for(o=0,a=t.length;owindow.getComputedStyle(t,null);const Je=["top","right","bottom","left"];function tn(t,e,n){const r={};n=n?"-"+n:"";for(let i=0;i<4;i++){const o=Je[i];r[o]=parseFloat(t[e+"-"+o+n])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}function en(t,e){const{canvas:n,currentDevicePixelRatio:r}=e,i=Ve(n),o="border-box"===i.boxSizing,a=tn(i,"padding"),s=tn(i,"border","width"),{x:c,y:u,box:l}=function(t,e){const n=t.native||t,r=n.touches,i=r&&r.length?r[0]:n,{offsetX:o,offsetY:a}=i;let s,c,u=!1;if(((t,e,n)=>(t>0||e>0)&&(!n||!n.shadowRoot))(o,a,n.target))s=o,c=a;else{const t=e.getBoundingClientRect();s=i.clientX-t.left,c=i.clientY-t.top,u=!0}return{x:s,y:c,box:u}}(t,n),f=a.left+(l&&s.left),d=a.top+(l&&s.top);let{width:h,height:p}=e;return o&&(h-=a.width+s.width,p-=a.height+s.height),{x:Math.round((c-f)/h*n.width/r),y:Math.round((u-d)/p*n.height/r)}}const nn=t=>Math.round(10*t)/10;function rn(t,e,n,r){const i=Ve(t),o=tn(i,"margin"),a=Ue(i.maxWidth,t,"clientWidth")||D,s=Ue(i.maxHeight,t,"clientHeight")||D,c=function(t,e,n){let r,i;if(void 0===e||void 0===n){const o=Qe(t);if(o){const t=o.getBoundingClientRect(),a=Ve(o),s=tn(a,"border","width"),c=tn(a,"padding");e=t.width-c.width-s.width,n=t.height-c.height-s.height,r=Ue(a.maxWidth,o,"clientWidth"),i=Ue(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,n=t.clientHeight}return{width:e,height:n,maxWidth:r||D,maxHeight:i||D}}(t,e,n);let{width:u,height:l}=c;if("content-box"===i.boxSizing){const t=tn(i,"border","width"),e=tn(i,"padding");u-=e.width+t.width,l-=e.height+t.height}return u=Math.max(0,u-o.width),l=Math.max(0,r?Math.floor(u/r):l-o.height),u=nn(Math.min(u,a,c.maxWidth)),l=nn(Math.min(l,s,c.maxHeight)),u&&!l&&(l=nn(u/2)),{width:u,height:l}}function on(t,e,n){const r=e||1,i=Math.floor(t.height*r),o=Math.floor(t.width*r);t.height=i/r,t.width=o/r;const a=t.canvas;return a.style&&(n||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==r||a.height!==i||a.width!==o)&&(t.currentDevicePixelRatio=r,a.height=i,a.width=o,t.ctx.setTransform(r,0,0,r,0,0),!0)}const an=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(e){}return t}();function sn(t,e){const n=function(t,e){return Ve(t).getPropertyValue(e)}(t,e),r=n&&n.match(/^(\d+)(\.\d+)?px$/);return r?+r[1]:void 0}function cn(t,e,n,r){return{x:t.x+n*(e.x-t.x),y:t.y+n*(e.y-t.y)}}function un(t,e,n,r){return{x:t.x+n*(e.x-t.x),y:"middle"===r?n<.5?t.y:e.y:"after"===r?n<1?t.y:e.y:n>0?e.y:t.y}}function ln(t,e,n,r){const i={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=cn(t,i,n),s=cn(i,o,n),c=cn(o,e,n),u=cn(a,s,n),l=cn(s,c,n);return cn(u,l,n)}const fn=new Map;function dn(t,e,n){return function(t,e){e=e||{};const n=t+JSON.stringify(e);let r=fn.get(n);return r||(r=new Intl.NumberFormat(t,e),fn.set(n,r)),r}(e,n).format(t)}function hn(t,e,n){return t?function(t,e){return{x:n=>t+t+e-n,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,n):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function pn(t,e){let n,r;"ltr"!==e&&"rtl"!==e||(n=t.canvas.style,r=[n.getPropertyValue("direction"),n.getPropertyPriority("direction")],n.setProperty("direction",e,"important"),t.prevTextDirection=r)}function gn(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function mn(t){return"angle"===t?{between:rt,compare:et,normalize:nt}:{between:at,compare:(t,e)=>t-e,normalize:t=>t}}function yn({start:t,end:e,count:n,loop:r,style:i}){return{start:t%n,end:e%n,loop:r&&(e-t+1)%n===0,style:i}}function bn(t,e,n){if(!n)return[t];const{property:r,start:i,end:o}=n,a=e.length,{compare:s,between:c,normalize:u}=mn(r),{start:l,end:f,loop:d,style:h}=function(t,e,n){const{property:r,start:i,end:o}=n,{between:a,normalize:s}=mn(r),c=e.length;let u,l,{start:f,end:d,loop:h}=t;if(h){for(f+=c,d+=c,u=0,l=c;ub||c(i,y,g)&&0!==s(i,y),w=()=>!b||0===s(o,g)||c(o,y,g);for(let E=l,O=l;E<=f;++E)m=e[E%a],m.skip||(g=u(m[r]),g!==y&&(b=c(g,i,o),null===v&&x()&&(v=0===s(g,i)?E:O),null!==v&&w()&&(p.push(yn({start:v,end:E,loop:d,count:a,style:h})),v=null),O=E,y=g));return null!==v&&p.push(yn({start:v,end:f,loop:d,count:a,style:h})),p}function vn(t,e){const n=[],r=t.segments;for(let i=0;ii&&t[o%e].skip;)o--;return o%=e,{start:i,end:o}}(n,i,o,r);if(!0===r)return wn(t,[{start:a,end:s,loop:o}],n,e);return wn(t,function(t,e,n,r){const i=t.length,o=[];let a,s=e,c=t[e];for(a=e+1;a<=n;++a){const n=t[a%i];n.skip||n.stop?c.skip||(r=!1,o.push({start:e%i,end:(a-1)%i,loop:r}),e=s=n.stop?a:null):(s=a,c.skip&&(e=a)),c=n}return null!==s&&o.push({start:e%i,end:s%i,loop:r}),o}(n,a,s{const i=t.datasets.find((t=>t[n]===e[n]));return i&&e.data&&!r.includes(i)?(r.push(i),Object.assign(i,e),i):{...e}}))}function c(t,e="label"){const n={labels:[],datasets:[]};return a(n,t.labels),s(n,t.datasets,e),n}function u({height:t=150,width:e=300,redraw:n=!1,datasetIdKey:u,type:l,data:f,options:d,plugins:h=[],fallbackContent:p,...g},m){const y=(0,r.useRef)(null),b=(0,r.useRef)(),v=()=>{y.current&&(b.current=new i.kL(y.current,{type:l,data:c(f,u),options:d,plugins:h}),o(m,b.current))},x=()=>{o(m,null),b.current&&(b.current.destroy(),b.current=null)};return(0,r.useEffect)((()=>{var t,e;!n&&b.current&&d&&(t=b.current,e=d,t.options={...e})}),[n,d]),(0,r.useEffect)((()=>{!n&&b.current&&a(b.current.config.data,f.labels)}),[n,f.labels]),(0,r.useEffect)((()=>{!n&&b.current&&f.datasets&&s(b.current.config.data,f.datasets,u)}),[n,f.datasets]),(0,r.useEffect)((()=>{b.current&&(n?(x(),setTimeout(v)):b.current.update())}),[n,d,f.labels,f.datasets]),(0,r.useEffect)((()=>(v(),()=>x())),[]),r.createElement("canvas",Object.assign({ref:y,role:"img",height:t,width:e},g),p)}const l=(0,r.forwardRef)(u);function f(t,e){return i.kL.register(e),(0,r.forwardRef)(((e,n)=>r.createElement(l,Object.assign({},e,{ref:n,type:t}))))}const d=f("bar",i.vn)}}]);
--------------------------------------------------------------------------------
/tracer-npm-package/out/_next/static/chunks/651.e7ad805f32a091cd.js:
--------------------------------------------------------------------------------
1 | (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[651],{9651:function(e,t,r){"use strict";var n=r(2553),o=r(2012),a=r(9807),i=r(7690),u=r(9828);function c(e){var t=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=u(e);if(t){var o=u(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return i(this,r)}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=f(r(7294)),l=f(r(2717));function f(e){return e&&e.__esModule?e:{default:e}}var d={400:"Bad Request",404:"This page could not be found",405:"Method Not Allowed",500:"Internal Server Error"};function p(e){var t=e.res,r=e.err;return{statusCode:t&&t.statusCode?t.statusCode:r?r.statusCode:404}}var h=function(e){a(r,e);var t=c(r);function r(){return n(this,r),t.apply(this,arguments)}return o(r,[{key:"render",value:function(){var e=this.props.statusCode,t=this.props.title||d[e]||"An unexpected error has occurred";return s.default.createElement("div",{style:y.error},s.default.createElement(l.default,null,s.default.createElement("title",null,e?"".concat(e,": ").concat(t):"Application error: a client-side exception has occurred")),s.default.createElement("div",null,s.default.createElement("style",{dangerouslySetInnerHTML:{__html:"body { margin: 0 }"}}),e?s.default.createElement("h1",{style:y.h1},e):null,s.default.createElement("div",{style:y.desc},s.default.createElement("h2",{style:y.h2},this.props.title||e?t:s.default.createElement(s.default.Fragment,null,"Application error: a client-side exception has occurred (see the browser console for more information)"),"."))))}}]),r}(s.default.Component);h.displayName="ErrorPage",h.getInitialProps=p,h.origGetInitialProps=p,t.default=h;var y={error:{color:"#000",background:"#fff",fontFamily:'-apple-system, BlinkMacSystemFont, Roboto, "Segoe UI", "Fira Sans", Avenir, "Helvetica Neue", "Lucida Grande", sans-serif',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},desc:{display:"inline-block",textAlign:"left",lineHeight:"49px",height:"49px",verticalAlign:"middle"},h1:{display:"inline-block",borderRight:"1px solid rgba(0, 0, 0,.3)",margin:0,marginRight:"20px",padding:"10px 23px 10px 0",fontSize:"24px",fontWeight:500,verticalAlign:"top"},h2:{fontSize:"14px",fontWeight:"normal",lineHeight:"inherit",margin:0,padding:0}}},8e3:function(e,t,r){"use strict";var n;Object.defineProperty(t,"__esModule",{value:!0}),t.AmpStateContext=void 0;var o=((n=r(7294))&&n.__esModule?n:{default:n}).default.createContext({});t.AmpStateContext=o},5646:function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isInAmpMode=i,t.useAmp=function(){return i(o.default.useContext(a.AmpStateContext))};var n,o=(n=r(7294))&&n.__esModule?n:{default:n},a=r(8e3);function i(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.ampFirst,r=void 0!==t&&t,n=e.hybrid,o=void 0!==n&&n,a=e.hasQuery,i=void 0!==a&&a;return r||o&&i}},2717:function(e,t,r){"use strict";var n=r(1682);function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}Object.defineProperty(t,"__esModule",{value:!0}),t.defaultHead=f,t.default=void 0;var a,i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){var n=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,r):{};n.get||n.set?Object.defineProperty(t,r,n):t[r]=e[r]}return t.default=e,t}(r(7294)),u=(a=r(1585))&&a.__esModule?a:{default:a},c=r(8e3),s=r(5850),l=r(5646);function f(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=[i.default.createElement("meta",{charSet:"utf-8"})];return e||t.push(i.default.createElement("meta",{name:"viewport",content:"width=device-width"})),t}function d(e,t){return"string"===typeof t||"number"===typeof t?e:t.type===i.default.Fragment?e.concat(i.default.Children.toArray(t.props.children).reduce((function(e,t){return"string"===typeof t||"number"===typeof t?e:e.concat(t)}),[])):e.concat(t)}var p=["name","httpEquiv","charSet","itemProp"];function h(e,t){return e.reduce((function(e,t){var r=i.default.Children.toArray(t.props.children);return e.concat(r)}),[]).reduce(d,[]).reverse().concat(f(t.inAmpMode)).filter(function(){var e=new Set,t=new Set,r=new Set,n={};return function(o){var a=!0,i=!1;if(o.key&&"number"!==typeof o.key&&o.key.indexOf("$")>0){i=!0;var u=o.key.slice(o.key.indexOf("$")+1);e.has(u)?a=!1:e.add(u)}switch(o.type){case"title":case"base":t.has(o.type)?a=!1:t.add(o.type);break;case"meta":for(var c=0,s=p.length;c=i)&&Object.keys(t.O).every((function(e){return t.O[e](r[a])}))?r.splice(a--,1):(c=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[r,o,i]}}(),t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,{a:n}),n},t.d=function(e,n){for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce((function(n,r){return t.f[r](e,n),n}),[]))},t.u=function(e){return"static/chunks/"+e+".e7ad805f32a091cd.js"},t.miniCssF=function(e){return"static/css/2974ebc8daa97b04.css"},t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}(),t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},function(){var e={},n="_N_E:";t.l=function(r,o,i,u){if(e[r])e[r].push(o);else{var c,a;if(void 0!==i)for(var f=document.getElementsByTagName("script"),l=0;lJust give us a moment...
Loading...
--------------------------------------------------------------------------------
/tracer-npm-package/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@go-trace/tracer",
3 | "version": "1.0.5",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "@go-trace/tracer",
9 | "version": "1.0.5",
10 | "license": "MIT",
11 | "dependencies": {
12 | "express": "^4.17.1",
13 | "graphql": "^15.3.0",
14 | "graphql-middleware": "^6.1.12",
15 | "node-fetch": "^2.6.6",
16 | "socket.io": "^4.4.0",
17 | "uuid": "^8.3.2"
18 | }
19 | },
20 | "node_modules/@graphql-tools/batch-execute": {
21 | "version": "8.3.1",
22 | "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.3.1.tgz",
23 | "integrity": "sha512-63kHY8ZdoO5FoeDXYHnAak1R3ysMViMPwWC2XUblFckuVLMUPmB2ONje8rjr2CvzWBHAW8c1Zsex+U3xhKtGIA==",
24 | "dependencies": {
25 | "@graphql-tools/utils": "^8.5.1",
26 | "dataloader": "2.0.0",
27 | "tslib": "~2.3.0",
28 | "value-or-promise": "1.0.11"
29 | },
30 | "peerDependencies": {
31 | "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
32 | }
33 | },
34 | "node_modules/@graphql-tools/delegate": {
35 | "version": "8.4.3",
36 | "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-8.4.3.tgz",
37 | "integrity": "sha512-hKTJdJXJnKL0+2vpU+Kt7OHQTIXZ9mBmNBwHsYiG5WNArz/vNI7910r6TC2XMf/e7zhyyK+mXxMDBmDQkkJagA==",
38 | "dependencies": {
39 | "@graphql-tools/batch-execute": "^8.3.1",
40 | "@graphql-tools/schema": "^8.3.1",
41 | "@graphql-tools/utils": "^8.5.4",
42 | "dataloader": "2.0.0",
43 | "tslib": "~2.3.0",
44 | "value-or-promise": "1.0.11"
45 | },
46 | "peerDependencies": {
47 | "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
48 | }
49 | },
50 | "node_modules/@graphql-tools/merge": {
51 | "version": "8.2.1",
52 | "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.2.1.tgz",
53 | "integrity": "sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA==",
54 | "dependencies": {
55 | "@graphql-tools/utils": "^8.5.1",
56 | "tslib": "~2.3.0"
57 | },
58 | "peerDependencies": {
59 | "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
60 | }
61 | },
62 | "node_modules/@graphql-tools/schema": {
63 | "version": "8.3.1",
64 | "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.1.tgz",
65 | "integrity": "sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ==",
66 | "dependencies": {
67 | "@graphql-tools/merge": "^8.2.1",
68 | "@graphql-tools/utils": "^8.5.1",
69 | "tslib": "~2.3.0",
70 | "value-or-promise": "1.0.11"
71 | },
72 | "peerDependencies": {
73 | "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
74 | }
75 | },
76 | "node_modules/@graphql-tools/utils": {
77 | "version": "8.5.4",
78 | "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.4.tgz",
79 | "integrity": "sha512-ViupMJH590be75tCiyHs/wgJ2KPbWMzc+jopen6P6MliHWoqRlGWMMvYQE1hDj25v4fxObCVq20maQCow0T9nQ==",
80 | "dependencies": {
81 | "tslib": "~2.3.0"
82 | },
83 | "peerDependencies": {
84 | "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
85 | }
86 | },
87 | "node_modules/@types/component-emitter": {
88 | "version": "1.2.11",
89 | "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
90 | "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ=="
91 | },
92 | "node_modules/@types/cookie": {
93 | "version": "0.4.1",
94 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
95 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
96 | },
97 | "node_modules/@types/cors": {
98 | "version": "2.8.12",
99 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
100 | "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
101 | },
102 | "node_modules/@types/node": {
103 | "version": "16.11.12",
104 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz",
105 | "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw=="
106 | },
107 | "node_modules/accepts": {
108 | "version": "1.3.7",
109 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
110 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
111 | "dependencies": {
112 | "mime-types": "~2.1.24",
113 | "negotiator": "0.6.2"
114 | },
115 | "engines": {
116 | "node": ">= 0.6"
117 | }
118 | },
119 | "node_modules/array-flatten": {
120 | "version": "1.1.1",
121 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
122 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
123 | },
124 | "node_modules/base64-arraybuffer": {
125 | "version": "1.0.1",
126 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz",
127 | "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==",
128 | "engines": {
129 | "node": ">= 0.6.0"
130 | }
131 | },
132 | "node_modules/base64id": {
133 | "version": "2.0.0",
134 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
135 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
136 | "engines": {
137 | "node": "^4.5.0 || >= 5.9"
138 | }
139 | },
140 | "node_modules/body-parser": {
141 | "version": "1.19.0",
142 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
143 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
144 | "dependencies": {
145 | "bytes": "3.1.0",
146 | "content-type": "~1.0.4",
147 | "debug": "2.6.9",
148 | "depd": "~1.1.2",
149 | "http-errors": "1.7.2",
150 | "iconv-lite": "0.4.24",
151 | "on-finished": "~2.3.0",
152 | "qs": "6.7.0",
153 | "raw-body": "2.4.0",
154 | "type-is": "~1.6.17"
155 | },
156 | "engines": {
157 | "node": ">= 0.8"
158 | }
159 | },
160 | "node_modules/body-parser/node_modules/debug": {
161 | "version": "2.6.9",
162 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
163 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
164 | "dependencies": {
165 | "ms": "2.0.0"
166 | }
167 | },
168 | "node_modules/body-parser/node_modules/ms": {
169 | "version": "2.0.0",
170 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
171 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
172 | },
173 | "node_modules/bytes": {
174 | "version": "3.1.0",
175 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
176 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
177 | "engines": {
178 | "node": ">= 0.8"
179 | }
180 | },
181 | "node_modules/component-emitter": {
182 | "version": "1.3.0",
183 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
184 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
185 | },
186 | "node_modules/content-disposition": {
187 | "version": "0.5.3",
188 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
189 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
190 | "dependencies": {
191 | "safe-buffer": "5.1.2"
192 | },
193 | "engines": {
194 | "node": ">= 0.6"
195 | }
196 | },
197 | "node_modules/content-type": {
198 | "version": "1.0.4",
199 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
200 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
201 | "engines": {
202 | "node": ">= 0.6"
203 | }
204 | },
205 | "node_modules/cookie": {
206 | "version": "0.4.0",
207 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
208 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
209 | "engines": {
210 | "node": ">= 0.6"
211 | }
212 | },
213 | "node_modules/cookie-signature": {
214 | "version": "1.0.6",
215 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
216 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
217 | },
218 | "node_modules/cors": {
219 | "version": "2.8.5",
220 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
221 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
222 | "dependencies": {
223 | "object-assign": "^4",
224 | "vary": "^1"
225 | },
226 | "engines": {
227 | "node": ">= 0.10"
228 | }
229 | },
230 | "node_modules/dataloader": {
231 | "version": "2.0.0",
232 | "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz",
233 | "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ=="
234 | },
235 | "node_modules/debug": {
236 | "version": "4.3.3",
237 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
238 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
239 | "dependencies": {
240 | "ms": "2.1.2"
241 | },
242 | "engines": {
243 | "node": ">=6.0"
244 | },
245 | "peerDependenciesMeta": {
246 | "supports-color": {
247 | "optional": true
248 | }
249 | }
250 | },
251 | "node_modules/depd": {
252 | "version": "1.1.2",
253 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
254 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
255 | "engines": {
256 | "node": ">= 0.6"
257 | }
258 | },
259 | "node_modules/destroy": {
260 | "version": "1.0.4",
261 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
262 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
263 | },
264 | "node_modules/ee-first": {
265 | "version": "1.1.1",
266 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
267 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
268 | },
269 | "node_modules/encodeurl": {
270 | "version": "1.0.2",
271 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
272 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
273 | "engines": {
274 | "node": ">= 0.8"
275 | }
276 | },
277 | "node_modules/engine.io": {
278 | "version": "6.1.0",
279 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.0.tgz",
280 | "integrity": "sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw==",
281 | "dependencies": {
282 | "@types/cookie": "^0.4.1",
283 | "@types/cors": "^2.8.12",
284 | "@types/node": ">=10.0.0",
285 | "accepts": "~1.3.4",
286 | "base64id": "2.0.0",
287 | "cookie": "~0.4.1",
288 | "cors": "~2.8.5",
289 | "debug": "~4.3.1",
290 | "engine.io-parser": "~5.0.0",
291 | "ws": "~8.2.3"
292 | },
293 | "engines": {
294 | "node": ">=10.0.0"
295 | }
296 | },
297 | "node_modules/engine.io-parser": {
298 | "version": "5.0.2",
299 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.2.tgz",
300 | "integrity": "sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g==",
301 | "dependencies": {
302 | "base64-arraybuffer": "~1.0.1"
303 | },
304 | "engines": {
305 | "node": ">=10.0.0"
306 | }
307 | },
308 | "node_modules/engine.io/node_modules/cookie": {
309 | "version": "0.4.1",
310 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
311 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
312 | "engines": {
313 | "node": ">= 0.6"
314 | }
315 | },
316 | "node_modules/escape-html": {
317 | "version": "1.0.3",
318 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
319 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
320 | },
321 | "node_modules/etag": {
322 | "version": "1.8.1",
323 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
324 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
325 | "engines": {
326 | "node": ">= 0.6"
327 | }
328 | },
329 | "node_modules/express": {
330 | "version": "4.17.1",
331 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
332 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
333 | "dependencies": {
334 | "accepts": "~1.3.7",
335 | "array-flatten": "1.1.1",
336 | "body-parser": "1.19.0",
337 | "content-disposition": "0.5.3",
338 | "content-type": "~1.0.4",
339 | "cookie": "0.4.0",
340 | "cookie-signature": "1.0.6",
341 | "debug": "2.6.9",
342 | "depd": "~1.1.2",
343 | "encodeurl": "~1.0.2",
344 | "escape-html": "~1.0.3",
345 | "etag": "~1.8.1",
346 | "finalhandler": "~1.1.2",
347 | "fresh": "0.5.2",
348 | "merge-descriptors": "1.0.1",
349 | "methods": "~1.1.2",
350 | "on-finished": "~2.3.0",
351 | "parseurl": "~1.3.3",
352 | "path-to-regexp": "0.1.7",
353 | "proxy-addr": "~2.0.5",
354 | "qs": "6.7.0",
355 | "range-parser": "~1.2.1",
356 | "safe-buffer": "5.1.2",
357 | "send": "0.17.1",
358 | "serve-static": "1.14.1",
359 | "setprototypeof": "1.1.1",
360 | "statuses": "~1.5.0",
361 | "type-is": "~1.6.18",
362 | "utils-merge": "1.0.1",
363 | "vary": "~1.1.2"
364 | },
365 | "engines": {
366 | "node": ">= 0.10.0"
367 | }
368 | },
369 | "node_modules/express/node_modules/debug": {
370 | "version": "2.6.9",
371 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
372 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
373 | "dependencies": {
374 | "ms": "2.0.0"
375 | }
376 | },
377 | "node_modules/express/node_modules/ms": {
378 | "version": "2.0.0",
379 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
380 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
381 | },
382 | "node_modules/finalhandler": {
383 | "version": "1.1.2",
384 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
385 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
386 | "dependencies": {
387 | "debug": "2.6.9",
388 | "encodeurl": "~1.0.2",
389 | "escape-html": "~1.0.3",
390 | "on-finished": "~2.3.0",
391 | "parseurl": "~1.3.3",
392 | "statuses": "~1.5.0",
393 | "unpipe": "~1.0.0"
394 | },
395 | "engines": {
396 | "node": ">= 0.8"
397 | }
398 | },
399 | "node_modules/finalhandler/node_modules/debug": {
400 | "version": "2.6.9",
401 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
402 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
403 | "dependencies": {
404 | "ms": "2.0.0"
405 | }
406 | },
407 | "node_modules/finalhandler/node_modules/ms": {
408 | "version": "2.0.0",
409 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
410 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
411 | },
412 | "node_modules/forwarded": {
413 | "version": "0.2.0",
414 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
415 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
416 | "engines": {
417 | "node": ">= 0.6"
418 | }
419 | },
420 | "node_modules/fresh": {
421 | "version": "0.5.2",
422 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
423 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
424 | "engines": {
425 | "node": ">= 0.6"
426 | }
427 | },
428 | "node_modules/graphql": {
429 | "version": "15.8.0",
430 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz",
431 | "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==",
432 | "engines": {
433 | "node": ">= 10.x"
434 | }
435 | },
436 | "node_modules/graphql-middleware": {
437 | "version": "6.1.13",
438 | "resolved": "https://registry.npmjs.org/graphql-middleware/-/graphql-middleware-6.1.13.tgz",
439 | "integrity": "sha512-P2LDzGvcA+QgTxtqo1pFIlJ4KtHDbQkwMlh9nLYlfAByXPi9gLx0IZ8D2ZMD+LRjy6aQJUxmEBdoRCI1MxxeaA==",
440 | "dependencies": {
441 | "@graphql-tools/delegate": "^8.4.3",
442 | "@graphql-tools/schema": "^8.3.1"
443 | },
444 | "peerDependencies": {
445 | "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
446 | }
447 | },
448 | "node_modules/http-errors": {
449 | "version": "1.7.2",
450 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
451 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
452 | "dependencies": {
453 | "depd": "~1.1.2",
454 | "inherits": "2.0.3",
455 | "setprototypeof": "1.1.1",
456 | "statuses": ">= 1.5.0 < 2",
457 | "toidentifier": "1.0.0"
458 | },
459 | "engines": {
460 | "node": ">= 0.6"
461 | }
462 | },
463 | "node_modules/iconv-lite": {
464 | "version": "0.4.24",
465 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
466 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
467 | "dependencies": {
468 | "safer-buffer": ">= 2.1.2 < 3"
469 | },
470 | "engines": {
471 | "node": ">=0.10.0"
472 | }
473 | },
474 | "node_modules/inherits": {
475 | "version": "2.0.3",
476 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
477 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
478 | },
479 | "node_modules/ipaddr.js": {
480 | "version": "1.9.1",
481 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
482 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
483 | "engines": {
484 | "node": ">= 0.10"
485 | }
486 | },
487 | "node_modules/media-typer": {
488 | "version": "0.3.0",
489 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
490 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
491 | "engines": {
492 | "node": ">= 0.6"
493 | }
494 | },
495 | "node_modules/merge-descriptors": {
496 | "version": "1.0.1",
497 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
498 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
499 | },
500 | "node_modules/methods": {
501 | "version": "1.1.2",
502 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
503 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
504 | "engines": {
505 | "node": ">= 0.6"
506 | }
507 | },
508 | "node_modules/mime": {
509 | "version": "1.6.0",
510 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
511 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
512 | "bin": {
513 | "mime": "cli.js"
514 | },
515 | "engines": {
516 | "node": ">=4"
517 | }
518 | },
519 | "node_modules/mime-db": {
520 | "version": "1.51.0",
521 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
522 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
523 | "engines": {
524 | "node": ">= 0.6"
525 | }
526 | },
527 | "node_modules/mime-types": {
528 | "version": "2.1.34",
529 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
530 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
531 | "dependencies": {
532 | "mime-db": "1.51.0"
533 | },
534 | "engines": {
535 | "node": ">= 0.6"
536 | }
537 | },
538 | "node_modules/ms": {
539 | "version": "2.1.2",
540 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
541 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
542 | },
543 | "node_modules/negotiator": {
544 | "version": "0.6.2",
545 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
546 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
547 | "engines": {
548 | "node": ">= 0.6"
549 | }
550 | },
551 | "node_modules/node-fetch": {
552 | "version": "2.6.6",
553 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
554 | "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
555 | "dependencies": {
556 | "whatwg-url": "^5.0.0"
557 | },
558 | "engines": {
559 | "node": "4.x || >=6.0.0"
560 | }
561 | },
562 | "node_modules/object-assign": {
563 | "version": "4.1.1",
564 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
565 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
566 | "engines": {
567 | "node": ">=0.10.0"
568 | }
569 | },
570 | "node_modules/on-finished": {
571 | "version": "2.3.0",
572 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
573 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
574 | "dependencies": {
575 | "ee-first": "1.1.1"
576 | },
577 | "engines": {
578 | "node": ">= 0.8"
579 | }
580 | },
581 | "node_modules/parseurl": {
582 | "version": "1.3.3",
583 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
584 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
585 | "engines": {
586 | "node": ">= 0.8"
587 | }
588 | },
589 | "node_modules/path-to-regexp": {
590 | "version": "0.1.7",
591 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
592 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
593 | },
594 | "node_modules/proxy-addr": {
595 | "version": "2.0.7",
596 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
597 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
598 | "dependencies": {
599 | "forwarded": "0.2.0",
600 | "ipaddr.js": "1.9.1"
601 | },
602 | "engines": {
603 | "node": ">= 0.10"
604 | }
605 | },
606 | "node_modules/qs": {
607 | "version": "6.7.0",
608 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
609 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
610 | "engines": {
611 | "node": ">=0.6"
612 | }
613 | },
614 | "node_modules/range-parser": {
615 | "version": "1.2.1",
616 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
617 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
618 | "engines": {
619 | "node": ">= 0.6"
620 | }
621 | },
622 | "node_modules/raw-body": {
623 | "version": "2.4.0",
624 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
625 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
626 | "dependencies": {
627 | "bytes": "3.1.0",
628 | "http-errors": "1.7.2",
629 | "iconv-lite": "0.4.24",
630 | "unpipe": "1.0.0"
631 | },
632 | "engines": {
633 | "node": ">= 0.8"
634 | }
635 | },
636 | "node_modules/safe-buffer": {
637 | "version": "5.1.2",
638 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
639 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
640 | },
641 | "node_modules/safer-buffer": {
642 | "version": "2.1.2",
643 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
644 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
645 | },
646 | "node_modules/send": {
647 | "version": "0.17.1",
648 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
649 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
650 | "dependencies": {
651 | "debug": "2.6.9",
652 | "depd": "~1.1.2",
653 | "destroy": "~1.0.4",
654 | "encodeurl": "~1.0.2",
655 | "escape-html": "~1.0.3",
656 | "etag": "~1.8.1",
657 | "fresh": "0.5.2",
658 | "http-errors": "~1.7.2",
659 | "mime": "1.6.0",
660 | "ms": "2.1.1",
661 | "on-finished": "~2.3.0",
662 | "range-parser": "~1.2.1",
663 | "statuses": "~1.5.0"
664 | },
665 | "engines": {
666 | "node": ">= 0.8.0"
667 | }
668 | },
669 | "node_modules/send/node_modules/debug": {
670 | "version": "2.6.9",
671 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
672 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
673 | "dependencies": {
674 | "ms": "2.0.0"
675 | }
676 | },
677 | "node_modules/send/node_modules/debug/node_modules/ms": {
678 | "version": "2.0.0",
679 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
680 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
681 | },
682 | "node_modules/send/node_modules/ms": {
683 | "version": "2.1.1",
684 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
685 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
686 | },
687 | "node_modules/serve-static": {
688 | "version": "1.14.1",
689 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
690 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
691 | "dependencies": {
692 | "encodeurl": "~1.0.2",
693 | "escape-html": "~1.0.3",
694 | "parseurl": "~1.3.3",
695 | "send": "0.17.1"
696 | },
697 | "engines": {
698 | "node": ">= 0.8.0"
699 | }
700 | },
701 | "node_modules/setprototypeof": {
702 | "version": "1.1.1",
703 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
704 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
705 | },
706 | "node_modules/socket.io": {
707 | "version": "4.4.0",
708 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.0.tgz",
709 | "integrity": "sha512-bnpJxswR9ov0Bw6ilhCvO38/1WPtE3eA2dtxi2Iq4/sFebiDJQzgKNYA7AuVVdGW09nrESXd90NbZqtDd9dzRQ==",
710 | "dependencies": {
711 | "accepts": "~1.3.4",
712 | "base64id": "~2.0.0",
713 | "debug": "~4.3.2",
714 | "engine.io": "~6.1.0",
715 | "socket.io-adapter": "~2.3.3",
716 | "socket.io-parser": "~4.0.4"
717 | },
718 | "engines": {
719 | "node": ">=10.0.0"
720 | }
721 | },
722 | "node_modules/socket.io-adapter": {
723 | "version": "2.3.3",
724 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
725 | "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ=="
726 | },
727 | "node_modules/socket.io-parser": {
728 | "version": "4.0.4",
729 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
730 | "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
731 | "dependencies": {
732 | "@types/component-emitter": "^1.2.10",
733 | "component-emitter": "~1.3.0",
734 | "debug": "~4.3.1"
735 | },
736 | "engines": {
737 | "node": ">=10.0.0"
738 | }
739 | },
740 | "node_modules/statuses": {
741 | "version": "1.5.0",
742 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
743 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
744 | "engines": {
745 | "node": ">= 0.6"
746 | }
747 | },
748 | "node_modules/toidentifier": {
749 | "version": "1.0.0",
750 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
751 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
752 | "engines": {
753 | "node": ">=0.6"
754 | }
755 | },
756 | "node_modules/tr46": {
757 | "version": "0.0.3",
758 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
759 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
760 | },
761 | "node_modules/tslib": {
762 | "version": "2.3.1",
763 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
764 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
765 | },
766 | "node_modules/type-is": {
767 | "version": "1.6.18",
768 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
769 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
770 | "dependencies": {
771 | "media-typer": "0.3.0",
772 | "mime-types": "~2.1.24"
773 | },
774 | "engines": {
775 | "node": ">= 0.6"
776 | }
777 | },
778 | "node_modules/unpipe": {
779 | "version": "1.0.0",
780 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
781 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
782 | "engines": {
783 | "node": ">= 0.8"
784 | }
785 | },
786 | "node_modules/utils-merge": {
787 | "version": "1.0.1",
788 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
789 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
790 | "engines": {
791 | "node": ">= 0.4.0"
792 | }
793 | },
794 | "node_modules/uuid": {
795 | "version": "8.3.2",
796 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
797 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
798 | "bin": {
799 | "uuid": "dist/bin/uuid"
800 | }
801 | },
802 | "node_modules/value-or-promise": {
803 | "version": "1.0.11",
804 | "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz",
805 | "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==",
806 | "engines": {
807 | "node": ">=12"
808 | }
809 | },
810 | "node_modules/vary": {
811 | "version": "1.1.2",
812 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
813 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
814 | "engines": {
815 | "node": ">= 0.8"
816 | }
817 | },
818 | "node_modules/webidl-conversions": {
819 | "version": "3.0.1",
820 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
821 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
822 | },
823 | "node_modules/whatwg-url": {
824 | "version": "5.0.0",
825 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
826 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
827 | "dependencies": {
828 | "tr46": "~0.0.3",
829 | "webidl-conversions": "^3.0.0"
830 | }
831 | },
832 | "node_modules/ws": {
833 | "version": "8.2.3",
834 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
835 | "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
836 | "engines": {
837 | "node": ">=10.0.0"
838 | },
839 | "peerDependencies": {
840 | "bufferutil": "^4.0.1",
841 | "utf-8-validate": "^5.0.2"
842 | },
843 | "peerDependenciesMeta": {
844 | "bufferutil": {
845 | "optional": true
846 | },
847 | "utf-8-validate": {
848 | "optional": true
849 | }
850 | }
851 | }
852 | },
853 | "dependencies": {
854 | "@graphql-tools/batch-execute": {
855 | "version": "8.3.1",
856 | "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.3.1.tgz",
857 | "integrity": "sha512-63kHY8ZdoO5FoeDXYHnAak1R3ysMViMPwWC2XUblFckuVLMUPmB2ONje8rjr2CvzWBHAW8c1Zsex+U3xhKtGIA==",
858 | "requires": {
859 | "@graphql-tools/utils": "^8.5.1",
860 | "dataloader": "2.0.0",
861 | "tslib": "~2.3.0",
862 | "value-or-promise": "1.0.11"
863 | }
864 | },
865 | "@graphql-tools/delegate": {
866 | "version": "8.4.3",
867 | "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-8.4.3.tgz",
868 | "integrity": "sha512-hKTJdJXJnKL0+2vpU+Kt7OHQTIXZ9mBmNBwHsYiG5WNArz/vNI7910r6TC2XMf/e7zhyyK+mXxMDBmDQkkJagA==",
869 | "requires": {
870 | "@graphql-tools/batch-execute": "^8.3.1",
871 | "@graphql-tools/schema": "^8.3.1",
872 | "@graphql-tools/utils": "^8.5.4",
873 | "dataloader": "2.0.0",
874 | "tslib": "~2.3.0",
875 | "value-or-promise": "1.0.11"
876 | }
877 | },
878 | "@graphql-tools/merge": {
879 | "version": "8.2.1",
880 | "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.2.1.tgz",
881 | "integrity": "sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA==",
882 | "requires": {
883 | "@graphql-tools/utils": "^8.5.1",
884 | "tslib": "~2.3.0"
885 | }
886 | },
887 | "@graphql-tools/schema": {
888 | "version": "8.3.1",
889 | "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.1.tgz",
890 | "integrity": "sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ==",
891 | "requires": {
892 | "@graphql-tools/merge": "^8.2.1",
893 | "@graphql-tools/utils": "^8.5.1",
894 | "tslib": "~2.3.0",
895 | "value-or-promise": "1.0.11"
896 | }
897 | },
898 | "@graphql-tools/utils": {
899 | "version": "8.5.4",
900 | "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.4.tgz",
901 | "integrity": "sha512-ViupMJH590be75tCiyHs/wgJ2KPbWMzc+jopen6P6MliHWoqRlGWMMvYQE1hDj25v4fxObCVq20maQCow0T9nQ==",
902 | "requires": {
903 | "tslib": "~2.3.0"
904 | }
905 | },
906 | "@types/component-emitter": {
907 | "version": "1.2.11",
908 | "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
909 | "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ=="
910 | },
911 | "@types/cookie": {
912 | "version": "0.4.1",
913 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
914 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
915 | },
916 | "@types/cors": {
917 | "version": "2.8.12",
918 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
919 | "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
920 | },
921 | "@types/node": {
922 | "version": "16.11.12",
923 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz",
924 | "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw=="
925 | },
926 | "accepts": {
927 | "version": "1.3.7",
928 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
929 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
930 | "requires": {
931 | "mime-types": "~2.1.24",
932 | "negotiator": "0.6.2"
933 | }
934 | },
935 | "array-flatten": {
936 | "version": "1.1.1",
937 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
938 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
939 | },
940 | "base64-arraybuffer": {
941 | "version": "1.0.1",
942 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz",
943 | "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA=="
944 | },
945 | "base64id": {
946 | "version": "2.0.0",
947 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
948 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
949 | },
950 | "body-parser": {
951 | "version": "1.19.0",
952 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
953 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
954 | "requires": {
955 | "bytes": "3.1.0",
956 | "content-type": "~1.0.4",
957 | "debug": "2.6.9",
958 | "depd": "~1.1.2",
959 | "http-errors": "1.7.2",
960 | "iconv-lite": "0.4.24",
961 | "on-finished": "~2.3.0",
962 | "qs": "6.7.0",
963 | "raw-body": "2.4.0",
964 | "type-is": "~1.6.17"
965 | },
966 | "dependencies": {
967 | "debug": {
968 | "version": "2.6.9",
969 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
970 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
971 | "requires": {
972 | "ms": "2.0.0"
973 | }
974 | },
975 | "ms": {
976 | "version": "2.0.0",
977 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
978 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
979 | }
980 | }
981 | },
982 | "bytes": {
983 | "version": "3.1.0",
984 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
985 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
986 | },
987 | "component-emitter": {
988 | "version": "1.3.0",
989 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
990 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
991 | },
992 | "content-disposition": {
993 | "version": "0.5.3",
994 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
995 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
996 | "requires": {
997 | "safe-buffer": "5.1.2"
998 | }
999 | },
1000 | "content-type": {
1001 | "version": "1.0.4",
1002 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
1003 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
1004 | },
1005 | "cookie": {
1006 | "version": "0.4.0",
1007 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
1008 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
1009 | },
1010 | "cookie-signature": {
1011 | "version": "1.0.6",
1012 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1013 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
1014 | },
1015 | "cors": {
1016 | "version": "2.8.5",
1017 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
1018 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
1019 | "requires": {
1020 | "object-assign": "^4",
1021 | "vary": "^1"
1022 | }
1023 | },
1024 | "dataloader": {
1025 | "version": "2.0.0",
1026 | "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz",
1027 | "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ=="
1028 | },
1029 | "debug": {
1030 | "version": "4.3.3",
1031 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
1032 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
1033 | "requires": {
1034 | "ms": "2.1.2"
1035 | }
1036 | },
1037 | "depd": {
1038 | "version": "1.1.2",
1039 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
1040 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
1041 | },
1042 | "destroy": {
1043 | "version": "1.0.4",
1044 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
1045 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
1046 | },
1047 | "ee-first": {
1048 | "version": "1.1.1",
1049 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1050 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
1051 | },
1052 | "encodeurl": {
1053 | "version": "1.0.2",
1054 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1055 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
1056 | },
1057 | "engine.io": {
1058 | "version": "6.1.0",
1059 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.0.tgz",
1060 | "integrity": "sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw==",
1061 | "requires": {
1062 | "@types/cookie": "^0.4.1",
1063 | "@types/cors": "^2.8.12",
1064 | "@types/node": ">=10.0.0",
1065 | "accepts": "~1.3.4",
1066 | "base64id": "2.0.0",
1067 | "cookie": "~0.4.1",
1068 | "cors": "~2.8.5",
1069 | "debug": "~4.3.1",
1070 | "engine.io-parser": "~5.0.0",
1071 | "ws": "~8.2.3"
1072 | },
1073 | "dependencies": {
1074 | "cookie": {
1075 | "version": "0.4.1",
1076 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
1077 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
1078 | }
1079 | }
1080 | },
1081 | "engine.io-parser": {
1082 | "version": "5.0.2",
1083 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.2.tgz",
1084 | "integrity": "sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g==",
1085 | "requires": {
1086 | "base64-arraybuffer": "~1.0.1"
1087 | }
1088 | },
1089 | "escape-html": {
1090 | "version": "1.0.3",
1091 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1092 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
1093 | },
1094 | "etag": {
1095 | "version": "1.8.1",
1096 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1097 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
1098 | },
1099 | "express": {
1100 | "version": "4.17.1",
1101 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
1102 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
1103 | "requires": {
1104 | "accepts": "~1.3.7",
1105 | "array-flatten": "1.1.1",
1106 | "body-parser": "1.19.0",
1107 | "content-disposition": "0.5.3",
1108 | "content-type": "~1.0.4",
1109 | "cookie": "0.4.0",
1110 | "cookie-signature": "1.0.6",
1111 | "debug": "2.6.9",
1112 | "depd": "~1.1.2",
1113 | "encodeurl": "~1.0.2",
1114 | "escape-html": "~1.0.3",
1115 | "etag": "~1.8.1",
1116 | "finalhandler": "~1.1.2",
1117 | "fresh": "0.5.2",
1118 | "merge-descriptors": "1.0.1",
1119 | "methods": "~1.1.2",
1120 | "on-finished": "~2.3.0",
1121 | "parseurl": "~1.3.3",
1122 | "path-to-regexp": "0.1.7",
1123 | "proxy-addr": "~2.0.5",
1124 | "qs": "6.7.0",
1125 | "range-parser": "~1.2.1",
1126 | "safe-buffer": "5.1.2",
1127 | "send": "0.17.1",
1128 | "serve-static": "1.14.1",
1129 | "setprototypeof": "1.1.1",
1130 | "statuses": "~1.5.0",
1131 | "type-is": "~1.6.18",
1132 | "utils-merge": "1.0.1",
1133 | "vary": "~1.1.2"
1134 | },
1135 | "dependencies": {
1136 | "debug": {
1137 | "version": "2.6.9",
1138 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1139 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1140 | "requires": {
1141 | "ms": "2.0.0"
1142 | }
1143 | },
1144 | "ms": {
1145 | "version": "2.0.0",
1146 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1147 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1148 | }
1149 | }
1150 | },
1151 | "finalhandler": {
1152 | "version": "1.1.2",
1153 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
1154 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
1155 | "requires": {
1156 | "debug": "2.6.9",
1157 | "encodeurl": "~1.0.2",
1158 | "escape-html": "~1.0.3",
1159 | "on-finished": "~2.3.0",
1160 | "parseurl": "~1.3.3",
1161 | "statuses": "~1.5.0",
1162 | "unpipe": "~1.0.0"
1163 | },
1164 | "dependencies": {
1165 | "debug": {
1166 | "version": "2.6.9",
1167 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1168 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1169 | "requires": {
1170 | "ms": "2.0.0"
1171 | }
1172 | },
1173 | "ms": {
1174 | "version": "2.0.0",
1175 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1176 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1177 | }
1178 | }
1179 | },
1180 | "forwarded": {
1181 | "version": "0.2.0",
1182 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
1183 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
1184 | },
1185 | "fresh": {
1186 | "version": "0.5.2",
1187 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1188 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
1189 | },
1190 | "graphql": {
1191 | "version": "15.8.0",
1192 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz",
1193 | "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw=="
1194 | },
1195 | "graphql-middleware": {
1196 | "version": "6.1.13",
1197 | "resolved": "https://registry.npmjs.org/graphql-middleware/-/graphql-middleware-6.1.13.tgz",
1198 | "integrity": "sha512-P2LDzGvcA+QgTxtqo1pFIlJ4KtHDbQkwMlh9nLYlfAByXPi9gLx0IZ8D2ZMD+LRjy6aQJUxmEBdoRCI1MxxeaA==",
1199 | "requires": {
1200 | "@graphql-tools/delegate": "^8.4.3",
1201 | "@graphql-tools/schema": "^8.3.1"
1202 | }
1203 | },
1204 | "http-errors": {
1205 | "version": "1.7.2",
1206 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
1207 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
1208 | "requires": {
1209 | "depd": "~1.1.2",
1210 | "inherits": "2.0.3",
1211 | "setprototypeof": "1.1.1",
1212 | "statuses": ">= 1.5.0 < 2",
1213 | "toidentifier": "1.0.0"
1214 | }
1215 | },
1216 | "iconv-lite": {
1217 | "version": "0.4.24",
1218 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1219 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1220 | "requires": {
1221 | "safer-buffer": ">= 2.1.2 < 3"
1222 | }
1223 | },
1224 | "inherits": {
1225 | "version": "2.0.3",
1226 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1227 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
1228 | },
1229 | "ipaddr.js": {
1230 | "version": "1.9.1",
1231 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1232 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1233 | },
1234 | "media-typer": {
1235 | "version": "0.3.0",
1236 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1237 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
1238 | },
1239 | "merge-descriptors": {
1240 | "version": "1.0.1",
1241 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1242 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1243 | },
1244 | "methods": {
1245 | "version": "1.1.2",
1246 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1247 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1248 | },
1249 | "mime": {
1250 | "version": "1.6.0",
1251 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1252 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1253 | },
1254 | "mime-db": {
1255 | "version": "1.51.0",
1256 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
1257 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
1258 | },
1259 | "mime-types": {
1260 | "version": "2.1.34",
1261 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
1262 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
1263 | "requires": {
1264 | "mime-db": "1.51.0"
1265 | }
1266 | },
1267 | "ms": {
1268 | "version": "2.1.2",
1269 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1270 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1271 | },
1272 | "negotiator": {
1273 | "version": "0.6.2",
1274 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1275 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1276 | },
1277 | "node-fetch": {
1278 | "version": "2.6.6",
1279 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
1280 | "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
1281 | "requires": {
1282 | "whatwg-url": "^5.0.0"
1283 | }
1284 | },
1285 | "object-assign": {
1286 | "version": "4.1.1",
1287 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1288 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1289 | },
1290 | "on-finished": {
1291 | "version": "2.3.0",
1292 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1293 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1294 | "requires": {
1295 | "ee-first": "1.1.1"
1296 | }
1297 | },
1298 | "parseurl": {
1299 | "version": "1.3.3",
1300 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1301 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1302 | },
1303 | "path-to-regexp": {
1304 | "version": "0.1.7",
1305 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1306 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1307 | },
1308 | "proxy-addr": {
1309 | "version": "2.0.7",
1310 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1311 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1312 | "requires": {
1313 | "forwarded": "0.2.0",
1314 | "ipaddr.js": "1.9.1"
1315 | }
1316 | },
1317 | "qs": {
1318 | "version": "6.7.0",
1319 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
1320 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
1321 | },
1322 | "range-parser": {
1323 | "version": "1.2.1",
1324 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1325 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1326 | },
1327 | "raw-body": {
1328 | "version": "2.4.0",
1329 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
1330 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
1331 | "requires": {
1332 | "bytes": "3.1.0",
1333 | "http-errors": "1.7.2",
1334 | "iconv-lite": "0.4.24",
1335 | "unpipe": "1.0.0"
1336 | }
1337 | },
1338 | "safe-buffer": {
1339 | "version": "5.1.2",
1340 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1341 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1342 | },
1343 | "safer-buffer": {
1344 | "version": "2.1.2",
1345 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1346 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1347 | },
1348 | "send": {
1349 | "version": "0.17.1",
1350 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1351 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1352 | "requires": {
1353 | "debug": "2.6.9",
1354 | "depd": "~1.1.2",
1355 | "destroy": "~1.0.4",
1356 | "encodeurl": "~1.0.2",
1357 | "escape-html": "~1.0.3",
1358 | "etag": "~1.8.1",
1359 | "fresh": "0.5.2",
1360 | "http-errors": "~1.7.2",
1361 | "mime": "1.6.0",
1362 | "ms": "2.1.1",
1363 | "on-finished": "~2.3.0",
1364 | "range-parser": "~1.2.1",
1365 | "statuses": "~1.5.0"
1366 | },
1367 | "dependencies": {
1368 | "debug": {
1369 | "version": "2.6.9",
1370 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1371 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1372 | "requires": {
1373 | "ms": "2.0.0"
1374 | },
1375 | "dependencies": {
1376 | "ms": {
1377 | "version": "2.0.0",
1378 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1379 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1380 | }
1381 | }
1382 | },
1383 | "ms": {
1384 | "version": "2.1.1",
1385 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1386 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1387 | }
1388 | }
1389 | },
1390 | "serve-static": {
1391 | "version": "1.14.1",
1392 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1393 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1394 | "requires": {
1395 | "encodeurl": "~1.0.2",
1396 | "escape-html": "~1.0.3",
1397 | "parseurl": "~1.3.3",
1398 | "send": "0.17.1"
1399 | }
1400 | },
1401 | "setprototypeof": {
1402 | "version": "1.1.1",
1403 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1404 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1405 | },
1406 | "socket.io": {
1407 | "version": "4.4.0",
1408 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.0.tgz",
1409 | "integrity": "sha512-bnpJxswR9ov0Bw6ilhCvO38/1WPtE3eA2dtxi2Iq4/sFebiDJQzgKNYA7AuVVdGW09nrESXd90NbZqtDd9dzRQ==",
1410 | "requires": {
1411 | "accepts": "~1.3.4",
1412 | "base64id": "~2.0.0",
1413 | "debug": "~4.3.2",
1414 | "engine.io": "~6.1.0",
1415 | "socket.io-adapter": "~2.3.3",
1416 | "socket.io-parser": "~4.0.4"
1417 | }
1418 | },
1419 | "socket.io-adapter": {
1420 | "version": "2.3.3",
1421 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
1422 | "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ=="
1423 | },
1424 | "socket.io-parser": {
1425 | "version": "4.0.4",
1426 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
1427 | "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
1428 | "requires": {
1429 | "@types/component-emitter": "^1.2.10",
1430 | "component-emitter": "~1.3.0",
1431 | "debug": "~4.3.1"
1432 | }
1433 | },
1434 | "statuses": {
1435 | "version": "1.5.0",
1436 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1437 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1438 | },
1439 | "toidentifier": {
1440 | "version": "1.0.0",
1441 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1442 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
1443 | },
1444 | "tr46": {
1445 | "version": "0.0.3",
1446 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1447 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
1448 | },
1449 | "tslib": {
1450 | "version": "2.3.1",
1451 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
1452 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
1453 | },
1454 | "type-is": {
1455 | "version": "1.6.18",
1456 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1457 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1458 | "requires": {
1459 | "media-typer": "0.3.0",
1460 | "mime-types": "~2.1.24"
1461 | }
1462 | },
1463 | "unpipe": {
1464 | "version": "1.0.0",
1465 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1466 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1467 | },
1468 | "utils-merge": {
1469 | "version": "1.0.1",
1470 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1471 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1472 | },
1473 | "uuid": {
1474 | "version": "8.3.2",
1475 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
1476 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
1477 | },
1478 | "value-or-promise": {
1479 | "version": "1.0.11",
1480 | "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz",
1481 | "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg=="
1482 | },
1483 | "vary": {
1484 | "version": "1.1.2",
1485 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1486 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1487 | },
1488 | "webidl-conversions": {
1489 | "version": "3.0.1",
1490 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1491 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
1492 | },
1493 | "whatwg-url": {
1494 | "version": "5.0.0",
1495 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1496 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
1497 | "requires": {
1498 | "tr46": "~0.0.3",
1499 | "webidl-conversions": "^3.0.0"
1500 | }
1501 | },
1502 | "ws": {
1503 | "version": "8.2.3",
1504 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
1505 | "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
1506 | "requires": {}
1507 | }
1508 | }
1509 | }
1510 |
--------------------------------------------------------------------------------
/tracer-npm-package/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@go-trace/tracer",
3 | "main": "goTrace.js",
4 | "keywords": ["graphql", "tracing", "end to end testing", "resolvers", "api", "GUI", "performance monitoring", "testing", "GQL"],
5 | "author": "Grace Yun, Pat Constant, Eddy Kwon, Alex Hager",
6 | "license": "MIT",
7 | "version": "1.0.7",
8 | "description": "Lightweight resolver-level GraphQL query tracing tool",
9 | "repository": {
10 | "type": "git",
11 | "url": "git+https://github.com/oslabs-beta/trace.git"
12 | },
13 | "bugs": {
14 | "url": "https://github.com/oslabs-beta/trace/issues"
15 | },
16 | "homepage": "https://github.com/oslabs-beta/trace#readme",
17 | "dependencies": {
18 | "graphql": "^15.3.0",
19 | "express": "^4.17.1",
20 | "graphql-middleware": "^6.1.12",
21 | "node-fetch": "^2.6.6",
22 | "socket.io": "^4.4.0",
23 | "uuid": "^8.3.2"
24 | },
25 | "scripts": {
26 | "start": "node server.js"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/tracer-npm-package/server.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | const app = express();
3 | const http = require('http').Server(app);
4 | const io = require('socket.io')(http);
5 |
6 | app.io = io;
7 |
8 | app.use(express.static('out'))
9 | app.use(express.json())
10 |
11 | app.post('/socketio', (req, res) => {
12 | console.log(req.body)
13 | req.app.io.emit('data', req.body)
14 | res.end()
15 | })
16 |
17 | io.on('connection', function(socket) {
18 | console.log('App connected');
19 | console.log(socket.id);
20 |
21 | socket.on('disconnect', function () {
22 | console.log('App disconnected');
23 | });
24 | });
25 |
26 | http.listen(2929, function() {
27 | console.log('listening on *:2929');
28 | });
--------------------------------------------------------------------------------