diff --git a/.prettierrc.js b/.prettierrc.js index 8ef85f8..bcb2209 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,4 +1,5 @@ module.exports = { singleQuote: true, - trailingComma: "all", + trailingComma: 'all', + endOfLine: 'auto', }; diff --git a/components/Dashboard/GuildsInsideContainer.js b/components/Dashboard/GuildsInsideContainer.js index 52def0a..5417047 100644 --- a/components/Dashboard/GuildsInsideContainer.js +++ b/components/Dashboard/GuildsInsideContainer.js @@ -1,10 +1,14 @@ -import "twin.macro"; +import 'twin.macro'; + +const React = require('react'); export default function GuildsInsideContainer(props) { + const { guilds } = props; + return (

Guild inside

-

{props.guilds.length}

+

{guilds.length}

); } diff --git a/components/Dashboard/GuildsOwnedContainer.js b/components/Dashboard/GuildsOwnedContainer.js index d8da7f1..6e39b0f 100644 --- a/components/Dashboard/GuildsOwnedContainer.js +++ b/components/Dashboard/GuildsOwnedContainer.js @@ -1,10 +1,13 @@ -import "twin.macro"; +import 'twin.macro'; + +const React = require('react'); export default function GuildsOwnedContainer(props) { + const { matches } = props; return (

Guilds owned

-

{props.matches.length}

+

{matches.length}

); } diff --git a/components/Dropdown.js b/components/Dropdown.js index fb5e1ec..4b00f77 100644 --- a/components/Dropdown.js +++ b/components/Dropdown.js @@ -1,18 +1,10 @@ import React from 'react'; -import Popper from 'popper.js'; -import { useRouter } from 'next/router'; -import { signIn, signOut, useSession, getSession } from 'next-auth/client'; +import { signOut } from 'next-auth/client'; import 'twin.macro'; -const Dropdown = ({ color }) => { - const router = useRouter(); +const Dropdown = () => { // dropdown props const popoverDropdownRef = React.createRef(); - // bg colors - let bgColor; - color === 'white' - ? (bgColor = 'bg-gray-800') - : (bgColor = 'bg-' + color + '-500'); return ( <> @@ -46,13 +38,13 @@ const Dropdown = ({ color }) => { Something else here
- Logout - +
diff --git a/components/Guilds/Guild.js b/components/Guilds/Guild.js new file mode 100644 index 0000000..6da6b7f --- /dev/null +++ b/components/Guilds/Guild.js @@ -0,0 +1,23 @@ +import React from 'react'; +import 'twin.macro'; + +export default function Guild(props) { + const { guild } = props; + return ( +
+ { + e.target.onerror = null; + e.target.src = 'https://i.imgur.com/2O78wUO.jpg'; + }} + alt="userIMG" + /> +
+

{guild.name}

+

{guild.id}

+
+
+ ); +} diff --git a/components/Guilds/Table.js b/components/Guilds/Table.js new file mode 100644 index 0000000..fa7da47 --- /dev/null +++ b/components/Guilds/Table.js @@ -0,0 +1,17 @@ +import React from 'react'; +import 'twin.macro'; +import Guild from './Guild'; + +export default function UserContainer(props) { + const { guilds } = props; + + const guildItem = guilds.map((guild) => ( + + )); + + return ( +
+ {guildItem} +
+ ); +} diff --git a/components/Navbar.js b/components/Navbar.js index c108e63..9ca35bf 100644 --- a/components/Navbar.js +++ b/components/Navbar.js @@ -1,44 +1,60 @@ -import Dropdown from './Dropdown'; import React from 'react'; import { useRouter } from 'next/router'; import 'twin.macro'; import { useSession } from 'next-auth/client'; +import Dropdown from './Dropdown'; export default function Navbar(props) { const router = useRouter(); - const [session, loading] = useSession(); + const [session] = useSession(); + + const { page, setShowResults, showResults } = props; + return ( <> {session && ( <>
{ e.target.onerror = null; e.target.src = 'https://i.imgur.com/2O78wUO.jpg'; }} + alt="userIMG" /> -

{props.session.user.name}

+

{session.user.name}

- {props.showResults ? : null} + {showResults ? : null}
)} @@ -46,7 +62,7 @@ export default function Navbar(props) { <>
diff --git a/components/UserContainer.js b/components/UserContainer.js index 4ded468..26e563e 100644 --- a/components/UserContainer.js +++ b/components/UserContainer.js @@ -1,20 +1,24 @@ -import React from "react"; -import "twin.macro"; +import React from 'react'; +import 'twin.macro'; export default function UserContainer(props) { + const { session } = props; + const { user } = session; + return (
{ e.target.onerror = null; - e.target.src = "https://i.imgur.com/2O78wUO.jpg"; + e.target.src = 'https://i.imgur.com/2O78wUO.jpg'; }} + alt="userIMG" />

- {props.session.user.name} - #{props.session.user.discriminator} + {user.name} + #{user.discriminator}

); diff --git a/middlewares/database.js b/middlewares/database.js deleted file mode 100644 index 1a599dc..0000000 --- a/middlewares/database.js +++ /dev/null @@ -1,14 +0,0 @@ -import { MongoClient } from "mongodb"; - -const client = new MongoClient(process.env.DATABASE_URL, { - useNewUrlParser: true, - useUnifiedTopology: true, -}); - -export default async function database(req, res, next) { - if (!client.isConnected()) await client.connect(); - req.dbClient = client; - req.db = client.db(process.env.DB_NAME); - await setUpDb(req.db); - return next(); -} diff --git a/middlewares/middleware.js b/middlewares/middleware.js deleted file mode 100644 index 0ab9019..0000000 --- a/middlewares/middleware.js +++ /dev/null @@ -1,9 +0,0 @@ -import nextConnect from "next-connect"; -import database from "./database"; -import session from "./session"; - -const middleware = nextConnect(); - -middleware.use(database).use(session); - -export default middleware; diff --git a/middlewares/session.js b/middlewares/session.js index b45e2c0..a0c005f 100644 --- a/middlewares/session.js +++ b/middlewares/session.js @@ -1,5 +1,5 @@ -import session from "express-session"; -import connectMongo from "connect-mongo"; +import session from 'express-session'; +import connectMongo from 'connect-mongo'; const MongoStore = connectMongo(session); diff --git a/next.config.js b/next.config.js index 4a490ed..c4d2d34 100644 --- a/next.config.js +++ b/next.config.js @@ -1,9 +1,11 @@ -const withCSS = require("@zeit/next-css"); +const withCSS = require('@zeit/next-css'); + module.exports = withCSS({ webpack: (config, { isServer }) => { // Fixes npm packages that depend on `fs` module if (!isServer) { - config.node = { fs: "empty" }; + // eslint-disable-next-line no-param-reassign + config.node = { fs: 'empty' }; } return config; diff --git a/package.json b/package.json index 9be70fd..37d8555 100644 --- a/package.json +++ b/package.json @@ -17,13 +17,14 @@ "eslint-config-airbnb": "^18.2.1", "eslint-config-prettier": "^7.0.0", "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.3.0", "eslint-plugin-react": "^7.21.5", + "express-session": "^1.17.1", "mongodb": "^3.6.3", "next": "10.0.3", "next-auth": "^3.1.0", "next-connect": "^0.9.1", - "popper.js": "^1.16.1", "prettier": "^2.2.1", "react": "17.0.1", "react-dom": "17.0.1", diff --git a/pages/_app.js b/pages/_app.js index dc0b04b..9ea3b6e 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -1,5 +1,7 @@ -import { GlobalStyles } from "twin.macro"; -import { Provider } from "next-auth/client"; +/* eslint-disable react/jsx-props-no-spreading */ +import React from 'react'; +import { GlobalStyles } from 'twin.macro'; +import { Provider } from 'next-auth/client'; function App({ Component, pageProps }) { return ( diff --git a/pages/_document.js b/pages/_document.js index 95959b2..72fc0ae 100644 --- a/pages/_document.js +++ b/pages/_document.js @@ -1,5 +1,7 @@ -import Document from "next/document"; -import { ServerStyleSheet } from "styled-components"; +/* eslint-disable react/jsx-props-no-spreading */ +import React from 'react'; +import Document from 'next/document'; +import { ServerStyleSheet } from 'styled-components'; export default class MyDocument extends Document { static async getInitialProps(ctx) { diff --git a/pages/api/auth/[...nextauth].js b/pages/api/auth/[...nextauth].js index a82c9e0..bac18a5 100644 --- a/pages/api/auth/[...nextauth].js +++ b/pages/api/auth/[...nextauth].js @@ -1,3 +1,4 @@ +/* eslint-disable no-param-reassign */ import NextAuth from 'next-auth'; import Providers from 'next-auth/providers'; @@ -17,13 +18,13 @@ const options = { }, pages: { signIn: '/auth/signin', + error: '/auth/error', }, secret: 'hfsrhgksgnsgnsghlwsngkljshgsh', callbacks: { - jwt: async (token, user, account, profile, isNewUser) => { - const isSignIn = user ? true : false; + jwt: async (token, user, account, profile) => { // Add auth_time to token on signin in - if (isSignIn) { + if (user) { token.accessToken = account.accessToken; token.id = profile.id; token.discriminator = profile.discriminator; @@ -37,7 +38,7 @@ const options = { return session; }, - redirect: async (url, _) => { + redirect: async (url) => { if (url === '/api/auth/signin') { return Promise.resolve('/dashboard'); } diff --git a/pages/api/data.js b/pages/api/data.js deleted file mode 100644 index 352f67f..0000000 --- a/pages/api/data.js +++ /dev/null @@ -1,16 +0,0 @@ -import { getSession } from "next-auth/client"; - -export default async (req, res) => { - const session = await getSession({ req }); - - if (session) { - res.status(200).json({ - message: "You can access this content because you are signed in.", - }); - } else { - res.status(403).json({ - message: - "You must be sign in to view the protected content on this page.", - }); - } -}; diff --git a/pages/api/uploadAvatar.js b/pages/api/uploadAvatar.js index 0403dfe..17a435c 100644 --- a/pages/api/uploadAvatar.js +++ b/pages/api/uploadAvatar.js @@ -1,6 +1,5 @@ import Cors from 'cors'; import axios from 'axios'; -import { getSession } from 'next-auth/client'; // Initializing the cors middleware const cors = Cors({ @@ -25,10 +24,12 @@ async function handler(req, res) { // Run the middleware await runMiddleware(req, res, cors); + const { body } = req; + // Rest of the API logic if (req.method === 'PATCH') { - const image = req.body.image; - let user = await axios + const { image } = body; + const user = await axios .patch( 'https://discord.com/api/users/@me', { @@ -36,13 +37,12 @@ async function handler(req, res) { }, { headers: { - Authorization: `Bot ` + process.env.DISCORD_CLIENT_TOKEN, + Authorization: `Bot ${process.env.DISCORD_CLIENT_TOKEN}`, }, }, ) - .then((user) => { - return user.data; - }) + .then((changedUser) => changedUser.data) + .catch((err) => console.log(err)); res.send(user); } else { diff --git a/pages/api/userGuilds.js b/pages/api/userGuilds.js index 27f90b9..4620f54 100644 --- a/pages/api/userGuilds.js +++ b/pages/api/userGuilds.js @@ -1,6 +1,5 @@ import Cors from 'cors'; import axios from 'axios'; -import { getSession } from 'next-auth/client'; // Initializing the cors middleware const cors = Cors({ @@ -24,21 +23,16 @@ function runMiddleware(req, res, fn) { async function handler(req, res) { // Run the middleware await runMiddleware(req, res, cors); - + const { query } = req; + const { token } = query; // Rest of the API logic if (req.method === 'GET') { - const token = req.query.token; - console.log(token); - - let guilds = await axios + const guilds = await axios .get('https://discord.com/api/users/@me/guilds', { headers: { - Authorization: `Bearer ` + token, + Authorization: `Bearer ${token}`, }, }) - .then((guilds) => { - return guilds; - }) .catch((err) => console.log(err)); res.send(guilds.data); } else { diff --git a/pages/api/users.js b/pages/api/users.js index f68988a..c60e995 100644 --- a/pages/api/users.js +++ b/pages/api/users.js @@ -1,16 +1,13 @@ -import nextConnect from "next-connect"; -import middleware from "../../middlewares/middleware"; +import nextConnect from 'next-connect'; const handler = nextConnect(); -handler.use(middleware); // see how we're reusing our middleware - // POST /api/users handler.post(async (req, res) => { const { name, avatar, email } = req.body; await req.db - .collection("users") + .collection('users') .insertOne({ name, avatar, email }) .then(() => { res.status(201); diff --git a/pages/auth/error.js b/pages/auth/error.js new file mode 100644 index 0000000..e150927 --- /dev/null +++ b/pages/auth/error.js @@ -0,0 +1,40 @@ +import React from 'react'; +import Head from 'next/head'; +import { useRouter } from 'next/router'; + +import { signIn } from 'next-auth/client'; +import 'twin.macro'; + +export default function error() { + const router = useRouter(); + return ( + <> +
+ + Login + + + +
+
+

Sorry, there was an error

+

Error: {router.query.error}

+ +
+
+
+ + ); +} diff --git a/pages/auth/signin.js b/pages/auth/signin.js index 5846959..75ac6de 100644 --- a/pages/auth/signin.js +++ b/pages/auth/signin.js @@ -1,6 +1,6 @@ import React from 'react'; import Head from 'next/head'; -import { signIn, signOut, useSession, getSession } from 'next-auth/client'; +import { signIn } from 'next-auth/client'; import 'twin.macro'; console.log(signIn); @@ -26,8 +26,9 @@ export default function SignIn() { tw="mt-3 mx-12 text-lg font-semibold bg-gray-800 w-full text-white rounded-lg px-6 py-3 block shadow-xl hover:text-white hover:bg-black" + type="button" > - + Login diff --git a/pages/dashboard/guilds.js b/pages/dashboard/guilds.js new file mode 100644 index 0000000..54b231a --- /dev/null +++ b/pages/dashboard/guilds.js @@ -0,0 +1,72 @@ +import React from 'react'; +import Head from 'next/head'; +import axios from 'axios'; +import { useRouter } from 'next/router'; +import { useSession, getSession } from 'next-auth/client'; +import Navbar from '../../components/Navbar'; +import Table from '../../components/Guilds/Table'; + +import 'twin.macro'; + +export default function Dashboard({ guilds }) { + const [showResults, setShowResults] = React.useState(false); + const router = useRouter(); + const page = router.pathname; + const newTitle = page.split('/'); + const title = newTitle[2].charAt(0).toUpperCase() + newTitle[2].slice(1); + + const [session, loading] = useSession(); + + if (loading) { + return

Loading...

; + } + + const toggle = () => { + setShowResults(!showResults); + }; + + return ( +
+ + Guilds + + + +
+ + +
+
+ + + + + + ); +} + +export async function getServerSideProps(ctx) { + const session = await getSession(ctx); + if (!session) { + ctx.res.writeHead(302, { Location: '/' }); + ctx.res.end(); + return {}; + } + const res = await axios.get('http://localhost:3000/api/userGuilds', { + params: { token: session.user.accessToken }, + }); + const { data } = res; + return { + props: { + guilds: data, + }, + }; +} diff --git a/pages/dashboard/index.js b/pages/dashboard/index.js index f3f4ff6..0b1bfdf 100644 --- a/pages/dashboard/index.js +++ b/pages/dashboard/index.js @@ -1,16 +1,17 @@ +import React from 'react'; import Head from 'next/head'; import axios from 'axios'; -import { useState } from 'react'; import { useRouter } from 'next/router'; +import { useSession, getSession } from 'next-auth/client'; import Navbar from '../../components/Navbar'; import UserContainer from '../../components/UserContainer'; import GuildsOwnedContainer from '../../components/Dashboard/GuildsOwnedContainer'; import GuildsInsideContainer from '../../components/Dashboard/GuildsInsideContainer'; -import { signIn, signOut, useSession, getSession } from 'next-auth/client'; + import 'twin.macro'; export default function Dashboard({ guilds }) { - const [showResults, setShowResults] = useState(false); + const [showResults, setShowResults] = React.useState(false); const router = useRouter(); const page = router.pathname; const newTitle = page.split('/'); @@ -67,7 +68,7 @@ export async function getServerSideProps(ctx) { const res = await axios.get('http://localhost:3000/api/userGuilds', { params: { token: session.user.accessToken }, }); - const data = res.data; + const { data } = res; return { props: { guilds: data, diff --git a/pages/index.js b/pages/index.js index 768dab6..bfb86ba 100644 --- a/pages/index.js +++ b/pages/index.js @@ -1,14 +1,14 @@ +/* eslint-disable react/react-in-jsx-scope */ import Head from 'next/head'; import { useState } from 'react'; +import { useSession } from 'next-auth/client'; import Navbar from '../components/Navbar'; -import { signIn, signOut, useSession, getSession } from 'next-auth/client'; import 'twin.macro'; export default function Home() { const [showResults, setShowResults] = useState(false); const title = 'Home'; const [session, loading] = useSession(); - if (loading) { return

Loading...

; } diff --git a/public/favicon.ico b/public/favicon.ico index 4965832..0663fa9 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/tailwind.config.js b/tailwind.config.js index 3134875..dfe61ef 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -2,12 +2,12 @@ module.exports = { theme: { extend: { colors: { - Darkest: "#1C2030", - Dark: "#1E2233", - Light: "#23283D", + Darkest: '#1C2030', + Dark: '#1E2233', + Light: '#23283D', }, minWidth: { - screen: "100vw", + screen: '100vw', }, }, }, diff --git a/yarn.lock b/yarn.lock index 4970809..dc19ee2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -144,7 +144,15 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== -"@babel/runtime@7.12.5", "@babel/runtime@^7.7.2": +"@babel/runtime-corejs3@^7.10.2": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz#ffee91da0eb4c6dae080774e94ba606368e414f4" + integrity sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.12.5", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.7.2": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== @@ -666,6 +674,14 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + arity-n@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" @@ -686,7 +702,7 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-includes@^3.1.1: +array-includes@^3.1.1, array-includes@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== @@ -744,6 +760,11 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + ast-types@0.13.2: version "0.13.2" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" @@ -769,6 +790,11 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +axe-core@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.1.tgz#70a7855888e287f7add66002211a423937063eaf" + integrity sha512-5Kgy8Cz6LPC9DJcNb3yjAXTu3XihQgEdnIg50c//zOC/MyLP0Clg+Y8Sh9ZjjnvBrDZU4DgXS9C3T9r4/scGZQ== + axios@^0.21.0: version "0.21.0" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.0.tgz#26df088803a2350dff2c27f96fef99fe49442aca" @@ -776,6 +802,11 @@ axios@^0.21.0: dependencies: follow-redirects "^1.10.0" +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -1467,6 +1498,16 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -1484,6 +1525,11 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js-pure@^3.0.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.8.1.tgz#23f84048f366fdfcf52d3fd1c68fec349177d119" + integrity sha512-Se+LaxqXlVXGvmexKGPvnUIYC1jwXu1H6Pkyb3uBM5d8/NELMYCHs/4/roD7721NxrTLyv7e5nXd5/QLBO+10g== + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1724,6 +1770,11 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" +damerau-levenshtein@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + data-uri-to-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.0.tgz#8a3088a5efd3f53c3682343313c6895d498eb8d7" @@ -1731,6 +1782,13 @@ data-uri-to-buffer@3.0.0: dependencies: buffer-from "^1.1.1" +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" @@ -1738,13 +1796,6 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "2.1.2" -debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1828,6 +1879,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -2016,6 +2072,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.0.tgz#a26da8e832b16a9753309f25e35e3c0efb9a066a" + integrity sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -2199,6 +2260,23 @@ eslint-plugin-import@^2.22.1: resolve "^1.17.0" tsconfig-paths "^3.9.0" +eslint-plugin-jsx-a11y@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== + dependencies: + "@babel/runtime" "^7.11.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^4.0.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^3.1.0" + language-tags "^1.0.5" + eslint-plugin-prettier@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz#61e295349a65688ffac0b7808ef0a8244bdd8d40" @@ -2378,6 +2456,20 @@ expand-template@^2.0.3: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +express-session@^1.17.1: + version "1.17.1" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.1.tgz#36ecbc7034566d38c8509885c044d461c11bf357" + integrity sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q== + dependencies: + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~2.0.0" + on-headers "~1.0.2" + parseurl "~1.3.3" + safe-buffer "5.2.0" + uid-safe "~2.1.5" + ext@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" @@ -3348,6 +3440,14 @@ jsonwebtoken@^8.5.1: array-includes "^3.1.1" object.assign "^4.1.1" +jsx-ast-utils@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + dependencies: + array-includes "^3.1.2" + object.assign "^4.1.2" + jwa@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" @@ -3399,6 +3499,18 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4147,6 +4259,11 @@ object.values@^1.1.1: es-abstract "^1.18.0-next.1" has "^1.0.3" +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -4307,6 +4424,11 @@ parse5@^6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -4423,11 +4545,6 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" -popper.js@^1.16.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -4788,6 +4905,11 @@ querystring@0.2.0, querystring@^0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -5098,6 +5220,11 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" +safe-buffer@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -6037,6 +6164,13 @@ typeorm@^0.2.24: yargonaut "^1.1.2" yargs "^16.0.3" +uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"