First auth steps done

This commit is contained in:
Fergal Moran
2023-01-30 20:19:52 +00:00
parent f0e118f5bf
commit bbea613655
15 changed files with 225 additions and 37 deletions

7
.env
View File

@@ -1,5 +1,12 @@
NEXT_PUBLIC_API_URL=https://otherway.dev.fergl.ie:3000 NEXT_PUBLIC_API_URL=https://otherway.dev.fergl.ie:3000
#auth
NEXTAUTH_URL=https://otherway.dev.fergl.ie:3000
GOOGLE_CLIENT_ID=47147490249-adhc8cbko4nvigrfoodo17oa3qfsg4pd.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=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
#calendar api
GOOGLE_CALENDAR_PROJECT_ID=47147490249 GOOGLE_CALENDAR_PROJECT_ID=47147490249
GOOGLE_CALENDAR_ID=geh501qel59lf3505v2huebo18@group.calendar.google.com GOOGLE_CALENDAR_ID=geh501qel59lf3505v2huebo18@group.calendar.google.com
GOOGLE_CALENDAR_API_KEY=AIzaSyAMvrSrwqvz9o4Y8b-0zneU-REWDIzuKR0 GOOGLE_CALENDAR_API_KEY=AIzaSyAMvrSrwqvz9o4Y8b-0zneU-REWDIzuKR0

View File

@@ -18,6 +18,7 @@
"eslint": "8.32.0", "eslint": "8.32.0",
"eslint-config-next": "13.1.5", "eslint-config-next": "13.1.5",
"next": "13.1.5", "next": "13.1.5",
"next-auth": "^4.19.0",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
"react-icons": "^4.7.1", "react-icons": "^4.7.1",

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -0,0 +1,8 @@
import { LoginPage } from "@/components/auth";
import React from "react";
const Login = async () => {
return <LoginPage />;
};
export default Login;

View File

@@ -1,6 +1,9 @@
"use client";
import "./globals.css"; import "./globals.css";
import { Inter } from "@next/font/google"; import { Inter } from "@next/font/google";
import { NavBar } from "@/components/layout"; import { NavBar } from "@/components/layout";
import { SessionProvider } from "next-auth/react";
const inter = Inter({ subsets: ["latin"] }); const inter = Inter({ subsets: ["latin"] });
@@ -13,10 +16,12 @@ export default function RootLayout({
<html lang="en" data-theme="bumblebee"> <html lang="en" data-theme="bumblebee">
<head /> <head />
<body className={`${inter.className} h-screen`}> <body className={`${inter.className} h-screen`}>
<NavBar /> <SessionProvider>
<div className="-mt-[4rem] px-8 grid h-full bg-gradient-to-br from-primary to-secondary pt-20"> <NavBar />
{children} <div className="-mt-[4rem] grid h-full bg-gradient-to-br from-primary to-secondary px-8 pt-20">
</div> {children}
</div>
</SessionProvider>
</body> </body>
</html> </html>
); );

View File

@@ -14,7 +14,7 @@ export default async function Home() {
) : ( ) : (
<div> <div>
<h1 className="text-xl font-extrabold font-title text-primary-content md:text-2xl lg:text-4xl"> <h1 className="text-xl font-extrabold font-title text-primary-content md:text-2xl lg:text-4xl">
Upcoming Radio Otherway Shows Upcoming Shows
</h1> </h1>
<div className="mt-4 overflow-x-auto"> <div className="mt-4 overflow-x-auto">
@@ -29,11 +29,7 @@ export default async function Home() {
<tbody> <tbody>
{results.events.map((r: any) => ( {results.events.map((r: any) => (
<tr key={r.id}> <tr key={r.id}>
<td> <td>{new Date(r.start.dateTime).toLocaleString("en-IE")}</td>
{new Date(r.start.dateTime).toLocaleString(
"en-IE"
)}
</td>
<td>{r.summary}</td> <td>{r.summary}</td>
<td> <td>
<button className="btn">Remind me</button> <button className="btn">Remind me</button>

View File

@@ -0,0 +1,19 @@
"use client";
import React from "react";
import { signIn } from "next-auth/react";
const LoginPage = () => {
return (
<div className="flex justify-center w-1/2 place-items-center bg-base-200">
<div className="px-10 py-24">
<h2 className="mb-2 text-2xl font-semibold text-center">Login </h2>
<div key="{provider.name}">
<button onClick={() => signIn("google")}>Sign in with Google</button>
</div>
</div>
</div>
);
};
export default LoginPage;

View File

@@ -0,0 +1,3 @@
import LoginPage from "./LoginPage";
export { LoginPage };

View File

@@ -1,15 +1,18 @@
"use client";
import { signOut, useSession } from "next-auth/react";
import React from "react"; import React from "react";
import { BiLogInCircle } from "react-icons/bi"; import { BiLogInCircle } from "react-icons/bi";
const Navbar = () => { const Navbar = () => {
const { data: session, status } = useSession();
return ( return (
<div className="sticky top-0 z-30 flex h-16 w-full justify-center bg-base-100 bg-opacity-90 text-base-content shadow-sm backdrop-blur transition-all duration-100"> <div className="sticky top-0 z-30 flex justify-center w-full h-16 transition-all duration-100 shadow-sm bg-base-100 bg-opacity-90 text-base-content backdrop-blur">
<nav className="navbar w-full"> <nav className="w-full navbar">
<div className="navbar-start"> <div className="navbar-start">
<div className="dropdown"> <div className="dropdown">
<label tabIndex={0} className="btn-ghost btn lg:hidden"> <label tabIndex={0} className="btn-ghost btn lg:hidden">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
className="h-5 w-5" className="w-5 h-5"
fill="none" fill="none"
viewBox="0 0 24 24" viewBox="0 0 24 24"
stroke="currentColor" stroke="currentColor"
@@ -24,24 +27,24 @@ const Navbar = () => {
</label> </label>
<ul <ul
tabIndex={0} tabIndex={0}
className="dropdown-content menu rounded-box menu-compact mt-3 w-52 bg-base-100 p-2 shadow" className="p-2 mt-3 shadow dropdown-content menu rounded-box menu-compact w-52 bg-base-100"
> >
<li> <li>
<a className="btn-ghost drawer-button btn normal-case"> <a className="normal-case btn-ghost drawer-button btn">
Item 1 Item 1
</a> </a>
</li> </li>
<li> <li>
<a className="btn-ghost drawer-button btn normal-case"> <a className="normal-case btn-ghost drawer-button btn">
Item 3 Item 3
</a> </a>
</li> </li>
</ul> </ul>
</div> </div>
<a className="btn-ghost btn text-xl normal-case">Radio::Otherway</a> <a className="text-xl normal-case btn-ghost btn">Radio::Otherway</a>
</div> </div>
<div className="navbar-center hidden lg:flex"> <div className="hidden navbar-center lg:flex">
<ul className="menu menu-horizontal px-1"> <ul className="px-1 menu menu-horizontal">
<li> <li>
<a>Coming Up</a> <a>Coming Up</a>
</li> </li>
@@ -51,10 +54,17 @@ const Navbar = () => {
</ul> </ul>
</div> </div>
<div className="navbar-end"> <div className="navbar-end">
<a className="btn gap-4"> {status === "authenticated" ? (
<BiLogInCircle className="inline-block h-5 w-5 stroke-current md:h-6 md:w-6" /> <button className="gap-4 btn" onClick={() => signOut()}>
<span>Login</span> <BiLogInCircle className="inline-block w-5 h-5 stroke-current md:h-6 md:w-6" />
</a> <span>Logout</span>
</button>
) : (
<a className="gap-4 btn">
<BiLogInCircle className="inline-block w-5 h-5 stroke-current md:h-6 md:w-6" />
<span>Login</span>
</a>
)}
</div> </div>
</nav> </nav>
</div> </div>

View File

@@ -0,0 +1,10 @@
import React from "react";
interface IErrorTextProps extends React.PropsWithChildren {
styleClass: string;
}
const ErrorText = ({ styleClass, children }: IErrorTextProps) => {
return <p className={`text-center text-error ${styleClass}`}>{children}</p>;
};
export default ErrorText;

View File

@@ -0,0 +1,48 @@
import React from "react";
interface IInputTextProps {
labelTitle: string;
labelStyle?: string;
type: string;
containerStyle: string;
defaultValue: string;
placeholder?: string;
updateFormValue: (type: string, value: string) => void;
updateType: string;
}
const InputText = ({
labelTitle,
labelStyle = "",
type,
containerStyle,
defaultValue,
placeholder = "",
updateFormValue,
updateType,
}: IInputTextProps) => {
const [value, setValue] = React.useState(defaultValue);
const updateInputValue = (val: string) => {
setValue(val);
updateFormValue(updateType, val);
};
return (
<div className={`form-control w-full ${containerStyle}`}>
<label className="label">
<span className={"label-text text-base-content " + labelStyle}>
{labelTitle}
</span>
</label>
<input
type={type || "text"}
value={value}
placeholder={placeholder || ""}
onChange={(e) => updateInputValue(e.target.value)}
className="w-full input-bordered input "
/>
</div>
);
};
export default InputText;

View File

@@ -0,0 +1,4 @@
import ErrorText from "./ErrorText";
import InputText from "./InputText";
export { ErrorText, InputText };

View File

@@ -0,0 +1,13 @@
import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";
export const authOptions = {
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
}),
],
};
export default NextAuth(authOptions);

View File

@@ -1,13 +0,0 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next'
type Data = {
name: string
}
export default function handler(
req: NextApiRequest,
res: NextApiResponse<Data>
) {
res.status(200).json({ name: 'John Doe' })
}

View File

@@ -2,7 +2,7 @@
# yarn lockfile v1 # yarn lockfile v1
"@babel/runtime@^7.20.7": "@babel/runtime@^7.16.3", "@babel/runtime@^7.20.7":
version "7.20.13" version "7.20.13"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
@@ -156,6 +156,11 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@panva/hkdf@^1.0.1":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.0.2.tgz#bab0f09d09de9fd83628220d496627681bc440d6"
integrity sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==
"@pkgr/utils@^2.3.1": "@pkgr/utils@^2.3.1":
version "2.3.1" version "2.3.1"
resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03"
@@ -563,6 +568,11 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
cookie@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
cross-spawn@^7.0.2, cross-spawn@^7.0.3: cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3" version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -1636,6 +1646,11 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
jose@^4.10.0, jose@^4.9.3:
version "4.11.2"
resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23"
integrity sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==
js-sdsl@^4.1.4: js-sdsl@^4.1.4:
version "4.3.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711"
@@ -1798,6 +1813,21 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
next-auth@^4.19.0:
version "4.19.0"
resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.19.0.tgz#c6b73d546ef2103c9eaa4713c076718ec8c3c4c1"
integrity sha512-56Pc/Ni0cxfrVDAz2KeWdj+VXvABbHF1grgFR4+ktXbRmKQOiMU9uyMwhasBQkbL+pRrWujO0Ib/bwkP0oZS4g==
dependencies:
"@babel/runtime" "^7.16.3"
"@panva/hkdf" "^1.0.1"
cookie "^0.5.0"
jose "^4.9.3"
oauth "^0.9.15"
openid-client "^5.1.0"
preact "^10.6.3"
preact-render-to-string "^5.1.19"
uuid "^8.3.2"
next@13.1.5: next@13.1.5:
version "13.1.5" version "13.1.5"
resolved "https://registry.yarnpkg.com/next/-/next-13.1.5.tgz#d0c230ccecf18414db78d180537d0474c53fdf73" resolved "https://registry.yarnpkg.com/next/-/next-13.1.5.tgz#d0c230ccecf18414db78d180537d0474c53fdf73"
@@ -1850,11 +1880,21 @@ normalize-range@^0.1.2:
resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
oauth@^0.9.15:
version "0.9.15"
resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==
object-assign@^4.1.1: object-assign@^4.1.1:
version "4.1.1" version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
object-hash@^2.0.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5"
integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
object-hash@^3.0.0: object-hash@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
@@ -1923,6 +1963,11 @@ object.values@^1.1.6:
define-properties "^1.1.4" define-properties "^1.1.4"
es-abstract "^1.20.4" es-abstract "^1.20.4"
oidc-token-hash@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz#ae6beec3ec20f0fd885e5400d175191d6e2f10c6"
integrity sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==
once@^1.3.0: once@^1.3.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -1947,6 +1992,16 @@ open@^8.4.0:
is-docker "^2.1.1" is-docker "^2.1.1"
is-wsl "^2.2.0" is-wsl "^2.2.0"
openid-client@^5.1.0:
version "5.3.2"
resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.3.2.tgz#fcc2c16f9681fa5f03ee0581b0935f88fc49f11f"
integrity sha512-nXXt+cna0XHOw+WqjMZOmuXw/YZEMwfWD2lD7tCsFtsBjMQGVXA+NZABA3upYBET1suhIsmfd7GnxG4jCAnvYQ==
dependencies:
jose "^4.10.0"
lru-cache "^6.0.0"
object-hash "^2.0.1"
oidc-token-hash "^5.0.1"
optionator@^0.9.1: optionator@^0.9.1:
version "0.9.1" version "0.9.1"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
@@ -2082,6 +2137,18 @@ postcss@^8.4.18, postcss@^8.4.21:
picocolors "^1.0.0" picocolors "^1.0.0"
source-map-js "^1.0.2" source-map-js "^1.0.2"
preact-render-to-string@^5.1.19:
version "5.2.6"
resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604"
integrity sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==
dependencies:
pretty-format "^3.8.0"
preact@^10.6.3:
version "10.11.3"
resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19"
integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==
prelude-ls@^1.2.1: prelude-ls@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -2097,6 +2164,11 @@ prettier@^2.8.3:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632"
integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==
pretty-format@^3.8.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385"
integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==
prop-types@^15.8.1: prop-types@^15.8.1:
version "15.8.1" version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
@@ -2539,6 +2611,11 @@ util-deprecate@^1.0.2:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
uuid@^9.0.0: uuid@^9.0.0:
version "9.0.0" version "9.0.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"