diff --git a/api/characters.js b/api/characters.js new file mode 100644 index 00000000..83882ed9 --- /dev/null +++ b/api/characters.js @@ -0,0 +1,37 @@ +import axios from "./index"; + +export const fetchCharacters = async (page) => { + try { + const response = await axios.get(`/character/?page=${page}`); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +}; + +export const fetchFilteredCharacters = async (name) => { + try { + const response = await axios.get(`/character/?name=${name}`); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +}; + +export const fetchCharacterById = async (id) => { + try { + const response = await axios.get(`/character/${id}`); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +} diff --git a/api/episodes.js b/api/episodes.js new file mode 100644 index 00000000..4cb284c8 --- /dev/null +++ b/api/episodes.js @@ -0,0 +1,37 @@ +import axios from "./index"; + +export const fetchEpisodes = async (page) => { + try { + const response = await axios.get(`/episode/?page=${page}`); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +}; + +export const fetchFilteredEpisodes = async (name) => { + try { + const response = await axios.get(`/episode/?name=${name}`); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +}; + +export const fetchEpisodeById = async (id) => { + try { + const response = await axios.get(`/episode/${id}`); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +}; diff --git a/api/index.js b/api/index.js new file mode 100644 index 00000000..d61ec6fa --- /dev/null +++ b/api/index.js @@ -0,0 +1,5 @@ +import axios from "axios"; + +axios.defaults.baseURL = process.env.baseUrl; + +export default axios; diff --git a/api/joke.js b/api/joke.js new file mode 100644 index 00000000..0fdfa4c3 --- /dev/null +++ b/api/joke.js @@ -0,0 +1,16 @@ +import axios from "axios"; + +export const fetchJoke = async () => { + try { + // fetching jokes and blocking nsfw, racist and sexist jokes + const response = await axios.get( + "https://v2.jokeapi.dev/joke/Any?blacklistFlags=nsfw,racist,sexist" + ); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +}; diff --git a/api/locations.js b/api/locations.js new file mode 100644 index 00000000..d853ddd8 --- /dev/null +++ b/api/locations.js @@ -0,0 +1,37 @@ +import axios from "./index"; + +export const fetchLocations = async (page) => { + try { + const response = await axios.get(`/location/?page=${page}`); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +}; + +export const fetchFilteredLocations = async (name) => { + try { + const response = await axios.get(`/location/?name=${name}`); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +}; + +export const fetchLocationById = async (id) => { + try { + const response = await axios.get(`/location/${id}`); + return response?.data; + } catch (error) { + return { + error: true, + response: error?.message ?? "Something went wrong", + }; + } +} \ No newline at end of file diff --git a/components/CustomButton/index.js b/components/CustomButton/index.js new file mode 100644 index 00000000..25368291 --- /dev/null +++ b/components/CustomButton/index.js @@ -0,0 +1,12 @@ +import React from "react"; +import { Button } from "./styles"; + +function CustomButton({ children, action, disabled, theme, size }) { + return ( + + ); +} + +export default CustomButton; diff --git a/components/CustomButton/styles.js b/components/CustomButton/styles.js new file mode 100644 index 00000000..ff8e3f42 --- /dev/null +++ b/components/CustomButton/styles.js @@ -0,0 +1,28 @@ +import styled from "styled-components"; + +export const Button = styled.button` + padding: 1em 1.5em; + border: ${({ theme }) => (theme === "ghost" ? "1px solid #000000" : "none")}; + border-radius: 8px; + font-size: ${({ size }) => + size === "small" ? "0.7rem" : size === "big" ? "1.2rem" : "1rem"}; + font-weight: 600; + cursor: pointer; + opacity: ${({ disabled }) => (disabled ? "0.5" : "1")}; + pointer-events: ${({ disabled }) => (disabled ? "none" : "auto")}; + background-color: ${({ theme }) => + theme === "ghost" + ? "#fff" + : theme === "success" + ? "#00ff00" + : theme === "danger" + ? "#e97777" + : "#1e90ff"}; + color: ${({ theme }) => (theme === "ghost" ? "#000000" : "#fff")}; + transition: all 0.2s ease-in-out; + + &:hover { + opacity: 0.8; + color: ${({ theme }) => (theme === "ghost" ? "#000000" : "#ffffff")}; + } +`; diff --git a/components/CustomModal/index.js b/components/CustomModal/index.js new file mode 100644 index 00000000..afe91d3e --- /dev/null +++ b/components/CustomModal/index.js @@ -0,0 +1,16 @@ +import React from "react"; +import { ModalWrapper } from "./styles"; + +function CustomModal({ children, isVisible }) { + return ( + <> + {isVisible && ( + +
{children}
+
+ )} + + ); +} + +export default CustomModal; diff --git a/components/CustomModal/styles.js b/components/CustomModal/styles.js new file mode 100644 index 00000000..67ca59f3 --- /dev/null +++ b/components/CustomModal/styles.js @@ -0,0 +1,38 @@ +import styled, { keyframes } from "styled-components"; + +const zoomIn = keyframes` + from { + transform: scale(0); + } + to { + transform: scale(1); + } +`; + +export const ModalWrapper = styled.div` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 100; + + .modal { + width: 100%; + max-width: 500px; + background-color: #fff; + border-radius: 5px; + padding: 20px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + position: relative; + color: #000000; + animation: ${zoomIn} 0.3s ease-in-out; + } +`; diff --git a/components/Header/index.js b/components/Header/index.js new file mode 100644 index 00000000..7ec90766 --- /dev/null +++ b/components/Header/index.js @@ -0,0 +1,36 @@ +import { useContext } from "react"; +import { HeaderWrapper, SwitchContainer, Slider, Input } from "./styles"; +import { MainWrapper } from "../Wrapper"; +import Image from "next/image"; +import logo from "../../images/logo.png"; +import { useRouter } from "next/router"; + +const Header = () => { + const { darkMode, setDarkMode, isLogged } = useContext(MainWrapper); + const router = useRouter(); + + return ( + +
router.push(!isLogged ? "/" : "/dashlist")} + > + Picture of the author + Rick and Morty Data +
+
+ Dark mode: {!darkMode ? "off" : "on"} + + setDarkMode(!darkMode)} + /> + + +
+
+ ); +}; + +export default Header; diff --git a/components/Header/styles.js b/components/Header/styles.js new file mode 100644 index 00000000..7860cfab --- /dev/null +++ b/components/Header/styles.js @@ -0,0 +1,101 @@ +import styled from "styled-components"; + +export const HeaderWrapper = styled.div` + height: 70px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 0.5em; + background: ${({ darkMode }) => (darkMode ? "#393E46" : "#ece8dd")}; + border-bottom: 1px solid ${({ darkMode }) => (darkMode ? "#ece8dd" : "#8080802c")}; + + .title { + display: flex; + align-items: center; + cursor: pointer; + + img { + width: 70px; + height: 70px; + + @media (max-width: 768px) { + width: 50px; + height: 50px; + } + } + + span { + font-size: 1.2em; + font-weight: 600; + + @media (max-width: 768px) { + font-size: 0.7em; + } + } + } + + .darkmode-area { + display: flex; + align-items: center; + span { + margin-right: 1em; + + @media (max-width: 768px) { + font-size: 0.7em; + } + } + } +`; + +export const SwitchContainer = styled.label` + position: relative; + display: inline-block; + width: 65px; + height: 24px; +`; + +export const Slider = styled.span` + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 34px; + + &:before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 50%; + } +`; + +export const Input = styled.input` + opacity: 0; + width: 0; + height: 0; + + &:checked + ${Slider} { + background-color: #cdf0ea; + } + + &:focus + ${Slider} { + box-shadow: 0 0 1px #cdf0ea; + } + + &:checked + ${Slider}:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); + } +`; diff --git a/components/Login/Enter.js b/components/Login/Enter.js new file mode 100644 index 00000000..3eb0e532 --- /dev/null +++ b/components/Login/Enter.js @@ -0,0 +1,60 @@ +import React, { useRef, useEffect, useState, useContext } from "react"; +import { FormsWrapper } from "./styles"; +import { useRouter } from "next/router"; +import { FadeTransition } from "../../styles/globalStyled"; +import { MainWrapper } from "../Wrapper"; +import useCustomSnackbar from "../../helpers/useCustomSnackbar"; +import CustomButton from "../CustomButton"; + +function Enter({ onLoginState }) { + const loginRef = useRef(); + const passwordRef = useRef(); + const router = useRouter(); + const [localUserData, setLocalUserData] = useState({}); + const { setIsLogged } = useContext(MainWrapper); + const { openCustomSnackbar } = useCustomSnackbar(); + + useEffect(() => { + const localUser = JSON.parse(localStorage.getItem("userData")); + if (localUser) { + setLocalUserData(localUser); + } + }, []); + + const loginUser = () => { + const { value: login } = loginRef.current; + const { value: password } = passwordRef.current; + + if (!login || !password) { + openCustomSnackbar("Please fill all the forms!"); + return; + } + + if (login !== localUserData.login || password !== localUserData.password) { + openCustomSnackbar("Wrong login or password!"); + return; + } + + setIsLogged(true); + openCustomSnackbar("User logged in!"); + router.push("/dashlist"); + }; + + return ( + + +

Log on your account

+
+ + + Enter + onLoginState("start")}> + Return + +
+
+
+ ); +} + +export default Enter; diff --git a/components/Login/Register.js b/components/Login/Register.js new file mode 100644 index 00000000..adf6e5e2 --- /dev/null +++ b/components/Login/Register.js @@ -0,0 +1,59 @@ +import React, { useRef } from "react"; +import { FormsWrapper } from "./styles"; +import { FadeTransition } from "../../styles/globalStyled"; +import useCustomSnackbar from "../../helpers/useCustomSnackbar"; +import CustomButton from "../CustomButton"; + +function Register({ onLoginState }) { + const loginRef = useRef(); + const passwordRef = useRef(); + const repeatPasswordRef = useRef(); + const { openCustomSnackbar } = useCustomSnackbar(); + + const registerUser = () => { + const { value: login } = loginRef.current; + const { value: password } = passwordRef.current; + const { value: repeatPassword } = repeatPasswordRef.current; + + if (!login || !password || !repeatPassword) { + openCustomSnackbar("Please fill all the forms!"); + return; + } + + if (password !== repeatPassword) { + openCustomSnackbar("Passwords are not the same!"); + return; + } + + const userData = { + login, + password, + }; + localStorage.setItem("userData", JSON.stringify(userData)); + openCustomSnackbar("User successfully registered!"); + onLoginState("start"); + }; + + return ( + + +

Fill all the forms to register

+
+ + + + Register + onLoginState("start")}> + Return + +
+
+
+ ); +} + +export default Register; diff --git a/components/Login/index.js b/components/Login/index.js new file mode 100644 index 00000000..fbb7abcb --- /dev/null +++ b/components/Login/index.js @@ -0,0 +1,47 @@ +import React, { useState } from "react"; +import { LoginWrapper } from "./styles"; +import Enter from "./Enter"; +import Register from "./Register"; +import { FadeTransition } from "../../styles/globalStyled"; +import CustomButton from "../CustomButton"; + +function Login() { + const [loginView, setLoginView] = useState("start"); + + const onData = (data) => { + setLoginView(data); + }; + + return ( + +
+ {loginView === "start" ? ( + +

Rick and Morty Data App

+ Search for your favourite character data +
+ setLoginView("login")} + > + Login + + setLoginView("register")} + theme="ghost" + > + Register + +
+
+ ) : loginView === "register" ? ( + + ) : ( + + )} +
+
+ + ); +} + +export default Login; diff --git a/components/Login/styles.js b/components/Login/styles.js new file mode 100644 index 00000000..65dade2c --- /dev/null +++ b/components/Login/styles.js @@ -0,0 +1,77 @@ +import styled from "styled-components"; + +export const LoginWrapper = styled.div` + display: flex; + justify-content: center; + height: 92.9vh; + width: 100%; + + div { + margin-bottom: 5em; + } + + .login-area { + height: 100%; + width: 65%; + padding: 1.3em; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + + @media (max-width: 559px) { + text-align: center; + } + + .login-choice-btn { + display: flex; + justify-content: center; + margin-top: 1.5em; + gap: 1em; + } + } + + .video-area { + height: 100%; + width: 100%; + padding: 1.3em; + background: url("https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/8929ac19-120e-4d6a-8b86-c23fbd654d92/das2gen-d2698547-a948-47e1-9a24-98247a9631e1.gif?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7InBhdGgiOiJcL2ZcLzg5MjlhYzE5LTEyMGUtNGQ2YS04Yjg2LWMyM2ZiZDY1NGQ5MlwvZGFzMmdlbi1kMjY5ODU0Ny1hOTQ4LTQ3ZTEtOWEyNC05ODI0N2E5NjMxZTEuZ2lmIn1dXSwiYXVkIjpbInVybjpzZXJ2aWNlOmZpbGUuZG93bmxvYWQiXX0.NPIOSM6ZjLXSMJAQha-Q4Jz3bu6i6EowqYc-gSYvG0s"); + background-size: cover; + + @media (max-width: 559px) { + display: none; + } + } +`; + +export const FormsWrapper = styled.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-top: 3em; + + div { + display: flex; + flex-direction: column; + margin-top: 2em; + + input { + margin: 0.3em 0; + padding: 1em; + border-radius: 5px; + border: 1px solid #1e90ff; + font-size: 1rem; + font-weight: 600; + color: #1e90ff; + + &:focus { + outline: none; + } + } + + button { + margin-top: 1em; + } + } +`; diff --git a/components/MainMenu/CharList/CharDetail/index.js b/components/MainMenu/CharList/CharDetail/index.js new file mode 100644 index 00000000..b650a718 --- /dev/null +++ b/components/MainMenu/CharList/CharDetail/index.js @@ -0,0 +1,117 @@ +/* eslint-disable @next/next/no-img-element */ +import React, { useEffect, useState, useContext } from "react"; +import { fetchCharacterById } from "../../../../api/characters"; +import { DetailWrapper } from "./styles"; +import { FadeTransition } from "../../../../styles/globalStyled"; +import { MainWrapper } from "../../../Wrapper"; +import { getContentFromEndpoints } from "../../../../helpers"; +import { formatDate } from "../../../../helpers"; + +function CharDetail({ onDetailsReturn }) { + const [character, setCharacter] = useState({}); + const [isError, setIsError] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [errorMessage, setErrorMessage] = useState(""); + const [episodes, setEpisodes] = useState([]); + const { characterId, setEpisodeId, setCurrentNavigation } = + useContext(MainWrapper); + + const goToEpisodeDetail = (id) => { + setEpisodeId(id); + setCurrentNavigation("episodes"); + onDetailsReturn(false); + }; + + useEffect(() => { + const fetchDataById = async () => { + setIsLoading(true); + const data = await fetchCharacterById(characterId); + if (data.error) { + setIsError(true); + setIsLoading(false); + setErrorMessage( + `Looks like the server is down, please try again later. (${data.response})` + ); + return; + } + setCharacter(data); + const episodes = data.episode; + const episodesUrl = await getContentFromEndpoints( + episodes, + "episode" + ); + setEpisodes(episodesUrl); + setIsLoading(false); + }; + fetchDataById(); + }, [characterId]); + + return ( + +
+ +
+ {isError ? ( +
+

{errorMessage}

+
+ ) : ( + <> + {isLoading ? ( +
+

Loading...

+
+ ) : ( + +
+

{character.name}

+ {character.name} +
+

+ Status: {character?.status ?? ""} +

+

+ Species: {character?.species ?? ""} +

+

+ Type: {character?.type ?? ""} +

+

+ Gender: {character?.gender ?? ""} +

+

+ Created: {formatDate(character?.created) ?? ""} +

+

+ Origin: {character?.origin?.name ?? ""} +

+

+ Location: {character?.location?.name ?? ""} +

+
+
+

Featured in the following episodes

+
+ {episodes && + episodes.map((episode, i) => ( + + ))} +
+
+
+
+ )} + + )} +
+ ); +} + +export default CharDetail; diff --git a/components/MainMenu/CharList/CharDetail/styles.js b/components/MainMenu/CharList/CharDetail/styles.js new file mode 100644 index 00000000..b58d2552 --- /dev/null +++ b/components/MainMenu/CharList/CharDetail/styles.js @@ -0,0 +1,106 @@ +import styled from "styled-components"; + +export const DetailWrapper = styled.div` + width: 100%; + height: 100%; + display: flex; + align-items: center; + flex-direction: column; + + .return-btn { + display: flex; + justify-content: flex-start; + width: 100%; + + button { + background-color: #f5f5f5; + border: none; + border-radius: 0.5em; + padding: 0.5em; + font-size: 1rem; + font-weight: bold; + color: #000; + + &:hover { + cursor: pointer; + background: #000; + color: #fff; + } + } + } + + .before-content { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 90%; + font-size: 2rem; + } + + .character-card { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 1em; + + h1 { + font-size: 2rem; + margin-bottom: 0.5em; + } + + img { + border-radius: 50%; + } + + .character-description { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 1em; + gap: 0.7em; + + p { + span { + font-weight: bold; + } + } + } + + .episodes { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 2em; + + .episodes-number-box { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + gap: 0.8em; + margin-top: 1em; + width: 50%; + + button { + background-color: #f5f5f5; + border: none; + border-radius: 0.5em; + padding: 0.5em; + font-size: 1rem; + font-weight: bold; + color: #000; + cursor: pointer; + transition: all 0.2s ease-in-out; + + &:hover { + scale: 1.2; + } + } + } + } + } +`; diff --git a/components/MainMenu/CharList/index.js b/components/MainMenu/CharList/index.js new file mode 100644 index 00000000..56b023e8 --- /dev/null +++ b/components/MainMenu/CharList/index.js @@ -0,0 +1,217 @@ +/* eslint-disable @next/next/no-img-element */ +import React, { useEffect, useState, useRef, useCallback } from "react"; +import { + fetchCharacters, + fetchFilteredCharacters, +} from "../../../api/characters"; +import { useContext } from "react"; +import { + CharListWrapper, + Table, + TableHead, + TableRow, + TableHeading, + TableData, +} from "./styles"; +import { MainWrapper } from "../../Wrapper"; +import CharDetail from "./CharDetail"; +import useCustomSnackbar from "../../../helpers/useCustomSnackbar"; +import { pagination } from "../../../helpers"; +import CustomButton from "../../CustomButton"; +import { FadeTransition } from "../../../styles/globalStyled"; + +function CharList() { + const [page, setPage] = useState(1); + const [characters, setCharacters] = useState([]); + const [isFiltering, setIsFiltering] = useState(false); + const filtertRef = useRef(); + const { openCustomSnackbar } = useCustomSnackbar(); + const [isError, setIsError] = useState(false); + const [isCharSelected, setIsCharSelected] = useState(false); + const [errorMessage, setErrorMessage] = useState( + "Could not find your character, please try again or reload" + ); + const { currentNavigation, setCharacterId } = useContext(MainWrapper); + + const fetchCharData = useCallback(async () => { + const response = await fetchCharacters(page); + + if (response.error) { + setIsError(true); + console.log(response?.error); + return; + } + if (!response?.results) { + setIsError(true); + return; + } + + setCharacters(response?.results); + }, [page]); + + const handlePagination = (target) => { + const pageUpdate = pagination(target, page); + setPage(pageUpdate); + }; + + const filterCharacters = async () => { + setIsError(false); + const filterData = filtertRef.current.value; + if (!filterData) { + openCustomSnackbar("Fill the search form to filter"); + return; + } + const response = await fetchFilteredCharacters(filterData); + if (response.error) { + setIsError(true); + setErrorMessage( + "Could not find your character, please try again or reload" + ); + console.log(response?.error); + return; + } + if (!response?.results) { + setIsError(true); + return; + } + setCharacters(response?.results); + setIsFiltering(true); + }; + + const clearFilters = () => { + filtertRef.current.value = ""; + setIsFiltering(false); + setIsError(false); + fetchCharData(); + }; + + const selectChar = (id) => { + setIsCharSelected(true); + setCharacterId(id); + }; + + const returnToCharList = (data) => { + setIsCharSelected(data); + setCharacterId(0); + }; + + useEffect(() => { + fetchCharData(); + }, [fetchCharData, page]); + + useEffect(() => { + const detectNavigation = () => { + if (currentNavigation === "characters") { + setIsCharSelected(true); + } + }; + detectNavigation(); + }, [currentNavigation]); + + return ( + <> + {isCharSelected ? ( + + + + ) : ( + + +
+

+ Search for your favourite character! +

+ +
+ + Search + + {isFiltering && ( + + Clear filters + + )} +
+
+
+ {isError ? ( +
+

{errorMessage}

+ Reload +
+ ) : ( +
+ + + + Photo + Name + Species + Status + Gender + + + + {characters.map((char) => ( + + +
+ {char.name} +
+
+ + {char.name} + + {char.species} + {char.status} + {char.gender} + + + +
+ ))} + +
+ {!isFiltering && !isError && ( +
+ handlePagination("prev")} + className="prev" + > + Prev + + handlePagination("next")} + className="next" + > + Next + +
+ )} +
+ )} +
+
+
+ )} + + ); +} + +export default CharList; diff --git a/components/MainMenu/CharList/styles.js b/components/MainMenu/CharList/styles.js new file mode 100644 index 00000000..7c082aa9 --- /dev/null +++ b/components/MainMenu/CharList/styles.js @@ -0,0 +1,183 @@ +import styled, { keyframes } from "styled-components"; + +const fade = keyframes` + from { + opacity: 0; + } + to { + opacity: 1; + } +`; + +export const CharListWrapper = styled.div` + width: 100%; + height: 100%; + + .title-search { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + input { + margin-top: 0.4em; + padding: 0.3em; + border-radius: 5px; + border: 1px solid #1e90ff; + font-size: 1rem; + font-weight: 600; + color: #1e90ff; + + &:focus { + outline: none; + } + } + + .search-btns { + display: flex; + justify-content: center; + align-items: center; + gap: 1em; + margin-top: 0.4em; + + button { + margin-top: 1em; + } + } + } + + .main-box { + width: 100%; + height: 90%; + padding: 0 2em; + + .error-box { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin-top: 3em; + + button { + margin-top: 1em; + } + } + } + + .table { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + .table-btns { + display: flex; + justify-content: center; + align-items: center; + gap: 1em; + margin: 2em 0; + } + } +`; + +export const Table = styled.table` + width: 70%; + border-collapse: collapse; + font-family: Arial, sans-serif; + margin-top: 3em; + + @media (max-width: 1020px) { + width: 95%; + } +`; + +export const TableHead = styled.thead` + @media (max-width: 600px) { + font-size: 0.6rem; + } +`; + +export const TableRow = styled.tr` + &:nth-child(even) { + } +`; + +export const TableHeading = styled.th` + padding: 12px; + border: 1px solid #ddd; + text-align: left; + font-weight: bold; +`; + +export const TableData = styled.td` + padding: 0.8em; + border: 1px solid #ddd; + text-align: left; + font-size: 1.2rem; + width: 160px; + + @media (max-width: 1020px) { + padding: 0.2em; + font-size: 0.7rem; + text-align: center; + height: 70px; + } + + @media (max-width: 600px) { + padding: 0em; + font-size: 0.6rem; + text-align: center; + } + + .picture { + display: flex; + justify-content: center; + align-items: center; + + img { + width: 100%; + height: 100%; + animation: ${fade} 0.5s ease-in-out; + + @media (max-width: 1020px) { + width: 50px; + height: 50px; + } + + @media (max-width: 600px) { + width: 35px; + height: 35px; + } + } + } + button { + background: #1e90ff; + border: 1px solid #fff; + padding: 1em; + border-radius: 5px; + color: #ffffff; + font-weight: 600; + font-size: 1rem; + cursor: pointer; + width: 100%; + + @media (max-width: 1020px) { + width: 100%; + height: 100%; + font-size: 0.8rem; + padding: 0; + border: none; + border-radius: 0; + } + + @media (max-width: 600px) { + font-size: 0.6rem; + } + + &:hover { + background: #fff; + color: #1e90ff; + } + } +`; diff --git a/components/MainMenu/EpisodeList/EpisodeDetail/index.js b/components/MainMenu/EpisodeList/EpisodeDetail/index.js new file mode 100644 index 00000000..2388f85b --- /dev/null +++ b/components/MainMenu/EpisodeList/EpisodeDetail/index.js @@ -0,0 +1,120 @@ +/* eslint-disable @next/next/no-img-element */ +import React, { useEffect, useState } from "react"; +import { useContext } from "react"; +import { fetchEpisodeById } from "../../../../api/episodes"; +import { DetailWrapper } from "./styles"; +import { FadeTransition } from "../../../../styles/globalStyled"; +import { MainWrapper } from "../../../Wrapper"; +import { getContentFromEndpoints } from "../../../../helpers"; +import { formatDate } from "../../../../helpers"; + +function EpisodeDetail({ onDetailsReturn }) { + const [character, setCharacter] = useState({}); + const [isError, setIsError] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [errorMessage, setErrorMessage] = useState(""); + const [charactersPictures, setCharactersPictures] = useState([]); + const { setCurrentNavigation, episodeId, setCharacterId } = + useContext(MainWrapper); + + const goToCharDetail = (id) => { + setCharacterId(id); + setCurrentNavigation("characters"); + onDetailsReturn(false); + }; + + useEffect(() => { + const fetchDataById = async () => { + setIsLoading(true); + const data = await fetchEpisodeById(episodeId); + if (data.error) { + setIsError(true); + setIsLoading(false); + setErrorMessage( + `Looks like the server is down, please try again later. (${data.response})` + ); + return; + } + setCharacter(data); + setIsLoading(false); + + const characterUrls = data?.characters; + const characterPics = await getContentFromEndpoints( + characterUrls, + "image" + ); + setCharactersPictures(characterPics); + }; + fetchDataById(); + }, [episodeId]); + + return ( + +
+ +
+ {isError ? ( +
+

{errorMessage}

+
+ ) : ( + <> + {isLoading ? ( +
+

Loading...

+
+ ) : ( + +
+

{character.name}

+
+

+ Air Date: {character?.air_date ?? ""} +

+

+ Episode: {character?.episode ?? ""} +

+

+ Created: {formatDate(character?.created) ?? ""} +

+
+
+

Characters in this episode

+
+ {charactersPictures && + charactersPictures.map((character, i) => ( +
+ character { + goToCharDetail(character?.id); + }} + /> +
+ ))} + {charactersPictures.length === 0 && ( +

+ There are no registered charactersPictures in this + location. +

+ )} +
+
+
+
+ )} + + )} +
+ ); +} + +export default EpisodeDetail; diff --git a/components/MainMenu/EpisodeList/EpisodeDetail/styles.js b/components/MainMenu/EpisodeList/EpisodeDetail/styles.js new file mode 100644 index 00000000..1af1d0f2 --- /dev/null +++ b/components/MainMenu/EpisodeList/EpisodeDetail/styles.js @@ -0,0 +1,102 @@ +import styled from "styled-components"; + +export const DetailWrapper = styled.div` + width: 100%; + height: 100%; + display: flex; + align-items: center; + flex-direction: column; + + .return-btn { + display: flex; + justify-content: flex-start; + width: 100%; + + button { + background-color: #f5f5f5; + border: none; + border-radius: 0.5em; + padding: 0.5em; + font-size: 1rem; + font-weight: bold; + color: #000; + + &:hover { + cursor: pointer; + background: #000; + color: #fff; + } + } + } + + .before-content { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 90%; + font-size: 2rem; + } + + .character-card { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 1em; + + h1 { + font-size: 2rem; + margin-bottom: 0.5em; + } + + .character-description { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 1em; + gap: 0.7em; + + p { + span { + font-weight: bold; + } + } + } + + .episodes { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 2em; + + .characters-list-box { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + gap: 0.8em; + margin-top: 2em; + width: 50%; + + img { + border-radius: 50%; + width: 100px; + transition: 0.3s; + cursor: pointer; + + &:hover { + scale: 1.3; + } + } + + p { + font-size: 1.5rem; + text-align: center; + } + } + } + } +`; diff --git a/components/MainMenu/EpisodeList/index.js b/components/MainMenu/EpisodeList/index.js new file mode 100644 index 00000000..bee7a451 --- /dev/null +++ b/components/MainMenu/EpisodeList/index.js @@ -0,0 +1,206 @@ +/* eslint-disable @next/next/no-img-element */ +import React, { + useEffect, + useState, + useRef, + useCallback, + useContext, +} from "react"; +import { fetchEpisodes, fetchFilteredEpisodes } from "../../../api/episodes"; +import { + EpisodeListWrapper, + Table, + TableHead, + TableRow, + TableHeading, + TableData, +} from "./styles"; +import LocationDetail from "./EpisodeDetail"; +import { MainWrapper } from "../../Wrapper"; +import useCustomSnackbar from "../../../helpers/useCustomSnackbar"; +import { pagination } from "../../../helpers"; +import CustomButton from "../../CustomButton"; +import { FadeTransition } from "../../../styles/globalStyled"; + +function EpisodeList() { + const [page, setPage] = useState(1); + const [characters, setCharacters] = useState([]); + const [isFiltering, setIsFiltering] = useState(false); + const filtertRef = useRef(); + const { openCustomSnackbar } = useCustomSnackbar(); + const [isError, setIsError] = useState(false); + const [isCharSelected, setIsCharSelected] = useState(false); + const [errorMessage, setErrorMessage] = useState( + "Could not load episodes, please try again or reload" + ); + const { currentNavigation, setEpisodeId } = useContext(MainWrapper); + + const fetchCharData = useCallback(async () => { + const response = await fetchEpisodes(page); + + if (response.error) { + setIsError(true); + console.log(response?.error); + return; + } + if (!response?.results) { + setIsError(true); + return; + } + + setCharacters(response?.results); + }, [page]); + + const handlePagination = (target) => { + const pageUpdate = pagination(target, page); + setPage(pageUpdate); + }; + + const filterCharacters = async () => { + setIsError(false); + const filterData = filtertRef.current.value; + if (!filterData) { + openCustomSnackbar("Fill the search form to filter"); + return; + } + const response = await fetchFilteredEpisodes(filterData); + if (response.error) { + setIsError(true); + setErrorMessage( + "Could not find your episode, please try again or reload" + ); + console.log(response.error); + return; + } + if (!response?.results) { + setIsError(true); + return; + } + setCharacters(response?.results); + setIsFiltering(true); + }; + + const clearFilters = () => { + filtertRef.current.value = ""; + setIsFiltering(false); + setIsError(false); + fetchCharData(); + }; + + const selectChar = (id) => { + setIsCharSelected(true); + setEpisodeId(id); + }; + + const returnToEpisodeList = (data) => { + setIsCharSelected(data); + setEpisodeId(0); + }; + + useEffect(() => { + fetchCharData(); + }, [fetchCharData, page]); + + useEffect(() => { + const detectNavigation = () => { + if (currentNavigation === "episodes") { + setIsCharSelected(true); + } + }; + detectNavigation(); + }, [currentNavigation]); + + return ( + <> + {isCharSelected ? ( + + + + ) : ( + + +
+

+ Search for your favourite episode! +

+ +
+ + Search + + {isFiltering && ( + + Clear filters + + )} +
+
+
+ {isError ? ( +
+

{errorMessage}

+ Reload +
+ ) : ( +
+ + + + Name + Air date + Episode + + + + {characters.map((char) => ( + + + {char.name} + + {char.air_date} + {char.episode} + + + + + ))} + +
+ {!isFiltering && !isError && ( +
+ handlePagination("prev")} + className="prev" + > + Prev + + handlePagination("next")} + className="next" + > + Next + +
+ )} +
+ )} +
+
+
+ )} + + ); +} + +export default EpisodeList; diff --git a/components/MainMenu/EpisodeList/styles.js b/components/MainMenu/EpisodeList/styles.js new file mode 100644 index 00000000..4adc0b97 --- /dev/null +++ b/components/MainMenu/EpisodeList/styles.js @@ -0,0 +1,179 @@ +import styled, { keyframes } from "styled-components"; + +const fade = keyframes` + from { + opacity: 0; + } + to { + opacity: 1; + } +`; + +export const EpisodeListWrapper = styled.div` + width: 100%; + height: 100%; + + .title-search { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + input { + margin-top: 0.4em; + padding: 0.3em; + border-radius: 5px; + border: 1px solid #1e90ff; + font-size: 1rem; + font-weight: 600; + color: #1e90ff; + + &:focus { + outline: none; + } + } + + .search-btns { + display: flex; + justify-content: center; + align-items: center; + gap: 1em; + margin-top: 0.4em; + } + } + + .main-box { + width: 100%; + height: 90%; + padding: 0 2em; + + .error-box { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin-top: 3em; + + button { + margin-top: 1em; + } + } + } + + .table { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + .table-btns { + display: flex; + justify-content: center; + align-items: center; + gap: 1em; + margin: 2em 0; + } + } +`; + +export const Table = styled.table` + width: 70%; + border-collapse: collapse; + font-family: Arial, sans-serif; + margin-top: 3em; + + @media (max-width: 1020px) { + width: 95%; + } +`; + +export const TableHead = styled.thead` + @media (max-width: 600px) { + font-size: 0.6rem; + } +`; + +export const TableRow = styled.tr` + &:nth-child(even) { + } +`; + +export const TableHeading = styled.th` + padding: 12px; + border: 1px solid #ddd; + text-align: left; + font-weight: bold; +`; + +export const TableData = styled.td` + padding: 0.8em; + border: 1px solid #ddd; + text-align: left; + font-size: 1.2rem; + width: 160px; + + @media (max-width: 1020px) { + padding: 0.2em; + font-size: 0.7rem; + text-align: center; + height: 70px; + } + + @media (max-width: 600px) { + padding: 0em; + font-size: 0.6rem; + text-align: center; + } + + .picture { + display: flex; + justify-content: center; + align-items: center; + + img { + width: 100%; + height: 100%; + animation: ${fade} 0.5s ease-in-out; + + @media (max-width: 1020px) { + width: 50px; + height: 50px; + } + + @media (max-width: 600px) { + width: 35px; + height: 35px; + } + } + } + button { + background: #1e90ff; + border: 1px solid #fff; + padding: 1em; + border-radius: 5px; + color: #ffffff; + font-weight: 600; + font-size: 1rem; + cursor: pointer; + width: 100%; + + @media (max-width: 1020px) { + width: 100%; + height: 100%; + font-size: 0.8rem; + padding: 0; + border: none; + border-radius: 0; + } + + @media (max-width: 600px) { + font-size: 0.6rem; + } + + &:hover { + background: #fff; + color: #1e90ff; + } + } +`; diff --git a/components/MainMenu/LocationList/LocationDetail/index.js b/components/MainMenu/LocationList/LocationDetail/index.js new file mode 100644 index 00000000..ae5c229a --- /dev/null +++ b/components/MainMenu/LocationList/LocationDetail/index.js @@ -0,0 +1,116 @@ +/* eslint-disable @next/next/no-img-element */ +import React, { useEffect, useState } from "react"; +import { useContext } from "react"; +import { fetchLocationById } from "../../../../api/locations"; +import { DetailWrapper } from "./styles"; +import { FadeTransition } from "../../../../styles/globalStyled"; +import { MainWrapper } from "../../../Wrapper"; +import { getContentFromEndpoints } from "../../../../helpers"; +import { formatDate } from "../../../../helpers"; + +function LocationDetail({ onDetailsReturn }) { + const [character, setCharacter] = useState({}); + const [isError, setIsError] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [errorMessage, setErrorMessage] = useState(""); + const [residents, setResidents] = useState([]); + const { locationId, setCharacterId, setCurrentNavigation } = + useContext(MainWrapper); + + const goToCharDetail = (id) => { + onDetailsReturn(false); + setCurrentNavigation("characters"); + setCharacterId(id); + }; + + useEffect(() => { + const fetchDataById = async () => { + setIsLoading(true); + const data = await fetchLocationById(locationId); + if (data.error) { + setIsError(true); + setIsLoading(false); + setErrorMessage( + `Looks like the server is down, please try again later. (${data.response})` + ); + return; + } + setCharacter(data); + + const residentsUrl = data?.residents; + const residentsData = await getContentFromEndpoints( + residentsUrl, + "image" + ); + setResidents(residentsData); + setIsLoading(false); + }; + fetchDataById(); + }, [locationId]); + + return ( + +
+ +
+ {isError ? ( +
+

{errorMessage}

+
+ ) : ( + <> + {isLoading ? ( +
+

Loading...

+
+ ) : ( + +
+

{character.name}

+
+

+ Type: {character?.type ?? ""} +

+

+ Dimension: {character?.dimension ?? ""} +

+

+ Created: {formatDate(character?.created) ?? ""} +

+
+
+

Residents

+
+ {residents && + residents.map((resident, i) => ( +
+ resident { + goToCharDetail(resident?.id); + }} + /> +
+ ))} + {residents.length === 0 && ( +

There are no registered residents in this location.

+ )} +
+
+
+
+ )} + + )} +
+ ); +} + +export default LocationDetail; diff --git a/components/MainMenu/LocationList/LocationDetail/styles.js b/components/MainMenu/LocationList/LocationDetail/styles.js new file mode 100644 index 00000000..21d633c9 --- /dev/null +++ b/components/MainMenu/LocationList/LocationDetail/styles.js @@ -0,0 +1,102 @@ +import styled from "styled-components"; + +export const DetailWrapper = styled.div` + width: 100%; + height: 100%; + display: flex; + align-items: center; + flex-direction: column; + + .return-btn { + display: flex; + justify-content: flex-start; + width: 100%; + + button { + background-color: #f5f5f5; + border: none; + border-radius: 0.5em; + padding: 0.5em; + font-size: 1rem; + font-weight: bold; + color: #000; + + &:hover { + cursor: pointer; + background: #000; + color: #fff; + } + } + } + + .before-content { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 90%; + font-size: 2rem; + } + + .character-card { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 1em; + + h1 { + font-size: 2rem; + margin-bottom: 0.5em; + } + + .character-description { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 1em; + gap: 0.7em; + + p { + span { + font-weight: bold; + } + } + } + + .episodes { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 2em; + + .residents-list-box { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + gap: 0.8em; + margin-top: 2em; + width: 50%; + + img { + border-radius: 50%; + width: 100px; + transition: 0.3s; + cursor: pointer; + + &:hover { + scale: 1.3; + } + } + + p { + font-size: 1.5rem; + text-align: center; + } + } + } + } +`; diff --git a/components/MainMenu/LocationList/index.js b/components/MainMenu/LocationList/index.js new file mode 100644 index 00000000..ba34b81d --- /dev/null +++ b/components/MainMenu/LocationList/index.js @@ -0,0 +1,196 @@ +/* eslint-disable @next/next/no-img-element */ +import React, { + useEffect, + useState, + useRef, + useCallback, + useContext, +} from "react"; +import { fetchLocations, fetchFilteredLocations } from "../../../api/locations"; +import { + LocationListWrapper, + Table, + TableHead, + TableRow, + TableHeading, + TableData, +} from "./styles"; +import { MainWrapper } from "../../Wrapper"; +import LocationDetail from "./LocationDetail"; +import useCustomSnackbar from "../../../helpers/useCustomSnackbar"; +import { pagination } from "../../../helpers"; +import CustomButton from "../../CustomButton"; +import { FadeTransition } from "../../../styles/globalStyled"; + +function LocationList() { + const [page, setPage] = useState(1); + const [characters, setCharacters] = useState([]); + const [isFiltering, setIsFiltering] = useState(false); + const filtertRef = useRef(); + const { openCustomSnackbar } = useCustomSnackbar(); + const [isError, setIsError] = useState(false); + const [isCharSelected, setIsCharSelected] = useState(false); + const [errorMessage, setErrorMessage] = useState( + "Could not load locations, please try again or reload" + ); + const { setLocationId } = useContext(MainWrapper); + + const fetchCharData = useCallback(async () => { + const response = await fetchLocations(page); + + if (response.error) { + setIsError(true); + setErrorMessage( + `Looks like the server is down, please try again later. (${response.response})` + ); + return; + } + if (!response?.results) { + setIsError(true); + return; + } + + setCharacters(response?.results); + }, [page]); + + const handlePagination = (target) => { + const pageUpdate = pagination(target, page); + setPage(pageUpdate); + }; + + const filterCharacters = async () => { + setIsError(false); + const filterData = filtertRef.current.value; + if (!filterData) { + openCustomSnackbar("Fill the search form to filter"); + return; + } + const response = await fetchFilteredLocations(filterData); + if (response.error) { + setIsError(true); + setErrorMessage( + "Could not find your location, please try again or reload" + ); + return; + } + if (!response?.results) { + setIsError(true); + return; + } + setCharacters(response?.results); + setIsFiltering(true); + }; + + const clearFilters = () => { + filtertRef.current.value = ""; + setIsFiltering(false); + setIsError(false); + fetchCharData(); + }; + + const selectChar = (id) => { + setIsCharSelected(true); + setLocationId(id); + }; + + const returnToLocationList = (data) => { + setIsCharSelected(data); + setLocationId(0); + }; + + useEffect(() => { + fetchCharData(); + }, [fetchCharData, page]); + + return ( + <> + {isCharSelected ? ( + + + + ) : ( + + +
+

+ Search for an iconic location! +

+ +
+ + Search + + {isFiltering && ( + + Clear filters + + )} +
+
+
+ {isError ? ( +
+

{errorMessage}

+ Reload +
+ ) : ( +
+ + + + Name + Type + Dimension + + + + {characters.map((char) => ( + + + {char.name} + + {char.type} + {char.dimension} + + + + + ))} + +
+ {!isFiltering && !isError && ( +
+ handlePagination("prev")} + disabled={page === 1} + > + Prev + + handlePagination("next")} + disabled={page === 7} + > + Next + +
+ )} +
+ )} +
+
+
+ )} + + ); +} + +export default LocationList; diff --git a/components/MainMenu/LocationList/styles.js b/components/MainMenu/LocationList/styles.js new file mode 100644 index 00000000..ab65090e --- /dev/null +++ b/components/MainMenu/LocationList/styles.js @@ -0,0 +1,179 @@ +import styled, { keyframes } from "styled-components"; + +const fade = keyframes` + from { + opacity: 0; + } + to { + opacity: 1; + } +`; + +export const LocationListWrapper = styled.div` + width: 100%; + height: 100%; + + .title-search { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + input { + margin-top: 0.4em; + padding: 0.3em; + border-radius: 5px; + border: 1px solid #1e90ff; + font-size: 1rem; + font-weight: 600; + color: #1e90ff; + + &:focus { + outline: none; + } + } + + .search-btns { + display: flex; + justify-content: center; + align-items: center; + gap: 1em; + margin-top: 1em; + } + } + + .main-box { + width: 100%; + height: 90%; + padding: 0 2em; + + .error-box { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin-top: 3em; + + button { + margin-top: 1em; + } + } + } + + .table { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + .table-btns { + display: flex; + justify-content: center; + align-items: center; + gap: 1em; + margin: 2em 0; + } + } +`; + +export const Table = styled.table` + width: 70%; + border-collapse: collapse; + font-family: Arial, sans-serif; + margin-top: 3em; + + @media (max-width: 1020px) { + width: 95%; + } +`; + +export const TableHead = styled.thead` + @media (max-width: 600px) { + font-size: 0.6rem; + } +`; + +export const TableRow = styled.tr` + &:nth-child(even) { + } +`; + +export const TableHeading = styled.th` + padding: 12px; + border: 1px solid #ddd; + text-align: left; + font-weight: bold; +`; + +export const TableData = styled.td` + padding: 0.8em; + border: 1px solid #ddd; + text-align: left; + font-size: 1.2rem; + width: 160px; + + @media (max-width: 1020px) { + padding: 0.2em; + font-size: 0.7rem; + text-align: center; + height: 70px; + } + + @media (max-width: 600px) { + padding: 0em; + font-size: 0.6rem; + text-align: center; + } + + .picture { + display: flex; + justify-content: center; + align-items: center; + + img { + width: 100%; + height: 100%; + animation: ${fade} 0.5s ease-in-out; + + @media (max-width: 1020px) { + width: 50px; + height: 50px; + } + + @media (max-width: 600px) { + width: 35px; + height: 35px; + } + } + } + button { + background: #1e90ff; + border: 1px solid #fff; + padding: 1em; + border-radius: 5px; + color: #ffffff; + font-weight: 600; + font-size: 1rem; + cursor: pointer; + width: 100%; + + @media (max-width: 1020px) { + width: 100%; + height: 100%; + font-size: 0.8rem; + padding: 0; + border: none; + border-radius: 0; + } + + @media (max-width: 600px) { + font-size: 0.6rem; + } + + &:hover { + background: #fff; + color: #1e90ff; + } + } +`; diff --git a/components/MainMenu/index.js b/components/MainMenu/index.js new file mode 100644 index 00000000..4af297ac --- /dev/null +++ b/components/MainMenu/index.js @@ -0,0 +1,112 @@ +import React, { useContext, useState, useCallback, useEffect } from "react"; +import { MenuWrapper } from "./styles"; +import { MainWrapper } from "../Wrapper"; +import CharList from "./CharList"; +import LocationList from "./LocationList"; +import EpisodeList from "./EpisodeList"; +import { useRouter } from "next/router"; +import CustomButton from "../CustomButton"; +import CustomModal from "../CustomModal"; + +function MainMenu() { + const { darkMode, currentNavigation, setCurrentNavigation, setIsLogged } = + useContext(MainWrapper); + const [currentMenuView, setCurrentMenuView] = useState("charList"); + const [isModalVisible, setIsModalVisible] = useState(false); + const router = useRouter(); + + const handleMenuView = useCallback((view) => { + const views = { + charList: , + locationList: , + episodeList: , + rickJokes: "/rickjokes", + }; + + return views[view]; + }, []); + + const switchMenus = useCallback( + (view) => { + const changeNav = () => { + setCurrentNavigation(""); + }; + changeNav(); + if (view === "rickJokes") { + router.push(view.toLowerCase()); + return; + } + setCurrentMenuView(view); + }, + [setCurrentNavigation, router] + ); + + const logOut = () => { + setIsLogged(false); + router.push("/"); + } + + useEffect(() => { + const autoNavigation = () => { + if (currentNavigation === "") return; + if (currentNavigation === "characters") { + setCurrentMenuView("charList"); + } else if ("episodes") { + setCurrentMenuView("episodeList"); + } else if ("locations") { + setCurrentMenuView("locationList"); + } + }; + autoNavigation(); + }, [currentNavigation]); + + return ( + + + Are you sure you want to log out? +
+ setIsModalVisible(false)}> + Cancel + + + Confirm + +
+
+
+
+ switchMenus("charList")} + > + Characters List + + switchMenus("locationList")} + > + Locations List + + switchMenus("episodeList")} + > + Episodes List + + switchMenus("rickJokes")} + > + Rick tells jokes + +
+ setIsModalVisible(true)}> + Log out + +
+
{handleMenuView(currentMenuView)}
+
+ ); +} + +export default MainMenu; diff --git a/components/MainMenu/styles.js b/components/MainMenu/styles.js new file mode 100644 index 00000000..35d75009 --- /dev/null +++ b/components/MainMenu/styles.js @@ -0,0 +1,68 @@ +import styled from "styled-components"; + +export const MenuWrapper = styled.div` + width: 100%; + height: 93vh; + display: flex; + + .modal-btns { + display: flex; + gap: 1em; + margin-top: 1em; + } + + @media (max-width: 1000px) { + flex-direction: column; + } + + .side-menu { + width: 15%; + border-right: 1px solid + ${({ darkMode }) => (darkMode ? "#ece8dd" : "#8080802c")}; + display: flex; + flex-direction: column; + justify-content: space-between; + padding: 1em; + + @media (max-width: 1000px) { + flex-direction: row; + width: 100%; + border-right: none; + } + + .nav-buttons { + display: flex; + flex-direction: column; + gap: 1em; + + @media (max-width: 1000px) { + flex-direction: row; + flex-wrap: wrap; + gap: 0.5em; + } + } + + button { + @media (max-width: 1000px) { + padding: 0.5em; + font-size: 0.9rem; + } + + @media (max-width: 400px) { + padding: 0.3em; + font-size: 0.8rem; + } + } + } + + .content { + width: 85%; + height: 100%; + padding: 1em; + overflow-y: scroll; + + @media (max-width: 1000px) { + width: 100%; + } + } +`; diff --git a/components/RickJokesPage/index.js b/components/RickJokesPage/index.js new file mode 100644 index 00000000..2ace629b --- /dev/null +++ b/components/RickJokesPage/index.js @@ -0,0 +1,111 @@ +import React, { useState, useCallback, useEffect } from "react"; +import { RickJokesPageContainer } from "./styles"; +import { fetchJoke } from "../../api/joke"; +import rick1 from "../../images/rick-state-1.gif"; +import rick2 from "../../images/rick-state-2.gif"; +import rick3 from "../../images/rick-state-3.gif"; +import rick4 from "../../images/rick-state-4.gif"; +import rick5 from "../../images/rick-state-5.gif"; +import Image from "next/image"; +import { useRouter } from "next/router"; + +function RickJokesPage() { + const [joke, setJoke] = useState({}); + const [jokeText, setJokeText] = useState(""); + const [question, setQuestion] = useState(""); + const [currentRickReaction, setCurrentRickReaction] = useState(rick1); + const [isLoading, setIsLoading] = useState(false); + const [completedJoke, setCompletedJoke] = useState(false); + const [jokeCounter, setJokeCounter] = useState(0); + const [confirmLeave, setConfirmLeave] = useState(false); + const [leaveBtnText, setLeaveBtnText] = useState("Return to dashlist"); + const router = useRouter(); + + const fetchJokeData = useCallback(async () => { + setIsLoading(true); + const jokes = await fetchJoke(); + setJoke(jokes); + setIsLoading(false); + setCompletedJoke(false); + setJokeCounter(jokeCounter + 1); + setConfirmLeave(false); + setLeaveBtnText("Return to dashlist"); + }, [jokeCounter]); + + const handleJokes = () => { + if (completedJoke) { + fetchJokeData(); + return; + } + if (joke?.setup) { + setJokeText(joke?.delivery); + setCurrentRickReaction(rick3); + setQuestion("Tell me another joke!"); + setIsLoading(false); + setCompletedJoke(true); + console.log("wtst?"); + return; + } + fetchJokeData(); + }; + + const returnToDashList = () => { + if (confirmLeave) { + router.push("/dashlist"); + return; + } + setConfirmLeave(true); + setLeaveBtnText("Yes, take me to dashlist!"); + setCurrentRickReaction(rick5); + setJokeText( + `Are you sure you want to leave? ${ + jokeCounter > 0 + ? "Don't you want to hear more jokes?" + : "Don't you want to hear some jokes?" + }` + ); + }; + + useEffect(() => { + const handleJokeText = () => { + if (joke?.type === "single") { + setJokeText(joke?.joke); + setCurrentRickReaction(rick3); + setQuestion("Tell me another joke!"); + setCompletedJoke(true); + return; + } + if (joke?.setup && joke?.delivery) { + setJokeText(joke?.setup); + setCurrentRickReaction(rick2); + setQuestion("What's the punchline?"); + } + }; + handleJokeText(); + }, [joke]); + + useEffect(() => { + if (isLoading) { + setCurrentRickReaction(rick4); + } + }, [isLoading]); + + return ( + +
+ + + {jokeText || "Wanna hear a joke?"} + + + {currentRickReaction} +
+ + +
+ ); +} + +export default RickJokesPage; diff --git a/components/RickJokesPage/styles.js b/components/RickJokesPage/styles.js new file mode 100644 index 00000000..0a8588c4 --- /dev/null +++ b/components/RickJokesPage/styles.js @@ -0,0 +1,68 @@ +import styled from "styled-components"; + +export const RickJokesPageContainer = styled.div` + width: 30%; + height: 92.9vh; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin: 0 auto; + + .rick-reactions-box { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + .rick-message-baloon-box { + position: relative; + background-color: #fff; + border-radius: 10px; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 20px; + color: black; + padding: 1.5em; + + ::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -10px; + width: 0; + height: 0; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 10px solid #fff; + } + } + + img { + width: 350px; + height: 350px; + border-radius: 50%; + } + } + button { + width: 300px; + height: 50px; + background-color: #fff; + border: 1px solid #000; + border-radius: 10px; + font-size: 1.2rem; + font-weight: 600; + cursor: pointer; + transition: all 0.1s ease-in-out; + margin-top: 1em; + opacity: ${({ isLoading }) => (isLoading ? "0.5" : "1")}; + pointer-events: ${({ isLoading }) => (isLoading ? "none" : "auto")}; + + :hover { + background-color: #000; + color: #fff; + } + } +`; diff --git a/components/Wrapper/index.js b/components/Wrapper/index.js new file mode 100644 index 00000000..8c336e7b --- /dev/null +++ b/components/Wrapper/index.js @@ -0,0 +1,49 @@ +import React, { createContext, useState } from "react"; +import { DarkWrapper } from "./styles"; + +export const MainWrapper = createContext({ + darkMode: false, + setDarkMode: () => {}, + isLogged: false, + setIsLogged: () => {}, + currentNavigation: "", + setCurrentNavigation: () => {}, + characterId: 0, + setCharacterId: () => {}, + locationId: 0, + setLocationId: () => {}, + episodeId: 0, + setEpisodeId: () => {}, +}); + +function Wrapper({ children }) { + const [darkMode, setDarkMode] = useState(true); + const [isLogged, setIsLogged] = useState(false); + const [currentNavigation, setCurrentNavigation] = useState(""); + const [characterId, setCharacterId] = useState(0); + const [locationId, setLocationId] = useState(0); + const [episodeId, setEpisodeId] = useState(0); + + return ( + + {children} + + ); +} + +export default Wrapper; diff --git a/components/Wrapper/styles.js b/components/Wrapper/styles.js new file mode 100644 index 00000000..38b82407 --- /dev/null +++ b/components/Wrapper/styles.js @@ -0,0 +1,7 @@ +import styled from "styled-components"; + +export const DarkWrapper = styled.div` + background: ${({ darkMode }) => (darkMode ? "#393E46" : "#ece8dd")}; + color: ${({ darkMode }) => (darkMode ? "#ece8dd" : "#393E46")}; + transition: all 0.5s ease; +`; diff --git a/cypress.config.js b/cypress.config.js new file mode 100644 index 00000000..3dfee284 --- /dev/null +++ b/cypress.config.js @@ -0,0 +1,10 @@ +const { defineConfig } = require("cypress"); + +module.exports = defineConfig({ + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + baseUrl = "http://localhost:3000"; + }, + }, +}); diff --git a/cypress/e2e/DetailsNavigation.cy.js b/cypress/e2e/DetailsNavigation.cy.js new file mode 100644 index 00000000..1d106ed8 --- /dev/null +++ b/cypress/e2e/DetailsNavigation.cy.js @@ -0,0 +1,27 @@ +describe("DetailsNavigation", () => { + beforeEach(() => { + cy.visit("http://localhost:3000"); + const userData = { + login: "testinguser", + password: "12345", + }; + localStorage.setItem("userData", JSON.stringify(userData)); + cy.get("button:contains('Login')").click(); + cy.get("button:contains('Return')").click(); + cy.get("button:contains('Login')").click(); + cy.get('input[placeholder="Login"]').type("testinguser"); + cy.get('input[placeholder="Password"]').type("12345"); + cy.get("button:contains('Enter')").click(); + }); + + it("should be able to navigate from characters to episodes without using the menu navigation", () => { + cy.get("[data-testid=table-characters-more-info-1]") + .should("exist") + .should("have.text", "More info") + .click(); + cy.wait(2000) + cy.contains("S01E01").click(); + cy.wait(2000) + cy.get("[data-testid=character-picture-1]").should("be.visible").click(); + }); +}); diff --git a/cypress/e2e/ListsPage.cy.js b/cypress/e2e/ListsPage.cy.js new file mode 100644 index 00000000..ba867b05 --- /dev/null +++ b/cypress/e2e/ListsPage.cy.js @@ -0,0 +1,71 @@ +describe("ListsPage", () => { + beforeEach(() => { + cy.visit("http://localhost:3000"); + const userData = { + login: "testinguser", + password: "12345", + }; + localStorage.setItem("userData", JSON.stringify(userData)); + cy.get("button:contains('Login')").click(); + cy.get("button:contains('Return')").click(); + cy.get("button:contains('Login')").click(); + cy.get('input[placeholder="Login"]').type("testinguser"); + cy.get('input[placeholder="Password"]').type("12345"); + cy.get("button:contains('Enter')").click(); + }); + + it("should be able to navigate to a list, use pagination and search filter", () => { + cy.get("[data-testid=characters-page-title]").should( + "have.text", + "Search for your favourite character!" + ); + cy.get("[data-testid=character-search-input]") + .should("exist") + .type("rick sanchez"); + cy.get("button:contains('Search')").click(); + cy.get("[data-testid=table-characters-name]").should("contain", "Rick"); + cy.wait(2000); + cy.get("button:contains('Clear filters')").click(); + cy.get("button:contains('Prev')").should("have.prop", "disabled", true); + cy.get("button:contains('Next')").click(); + cy.wait(2000); + cy.get("button:contains('Prev')") + .should("have.prop", "disabled", false) + .click(); + cy.wait(2000); + + cy.get("button:contains('Locations List')").should("be.visible").click(); + cy.get("[data-testid=locations-page-title]").should( + "have.text", + "Search for an iconic location!" + ); + cy.get("[data-testid=location-search-input]").should("exist").type("earth"); + cy.get("button:contains('Search')").click(); + cy.get("[data-testid=table-locations-name]").should("contain", "Earth"); + cy.wait(2000); + cy.get("button:contains('Clear filters')").click(); + cy.get("button:contains('Prev')").should("have.prop", "disabled", true); + cy.get("button:contains('Next')").click(); + cy.wait(2000); + cy.get("button:contains('Prev')") + .should("have.prop", "disabled", false) + .click(); + + cy.get("button:contains('Episodes List')").should("be.visible").click(); + cy.get("[data-testid=episodes-page-title]").should( + "have.text", + "Search for your favourite episode!" + ); + cy.get("[data-testid=episode-search-input]").should("exist").type("pilot"); + cy.get("button:contains('Search')").click(); + cy.get("[data-testid=table-episodes-name]").should("contain", "Pilot"); + cy.wait(2000); + cy.get("button:contains('Clear filters')").click(); + cy.get("button:contains('Prev')").should("have.prop", "disabled", true); + cy.get("button:contains('Next')").click(); + cy.wait(2000); + cy.get("button:contains('Prev')") + .should("have.prop", "disabled", false) + .click(); + }); +}); diff --git a/cypress/e2e/LoginPage.cy.js b/cypress/e2e/LoginPage.cy.js new file mode 100644 index 00000000..961a16dc --- /dev/null +++ b/cypress/e2e/LoginPage.cy.js @@ -0,0 +1,49 @@ +describe("Login", () => { + + beforeEach(() => { + cy.visit("http://localhost:3000"); + }); + + it("should change colors on darkmode switch button", () => { + cy.wait(2000); + cy.get("[data-testid=darkmode-switch]").click(); + cy.get("[data-testid=darkmode-text]").should("have.text", "Dark mode: off"); + cy.get("[data-testid=darkmode-wrapper]").should( + "have.css", + "background-color", + "rgb(236, 232, 221)" + ); + + cy.wait(2000); + cy.get("[data-testid=darkmode-switch]").click(); + cy.get("[data-testid=darkmode-text]").should("have.text", "Dark mode: on"); + cy.get("[data-testid=darkmode-wrapper]").should( + "have.css", + "background-color", + "rgb(57, 62, 70)" + ); + }); + + it("should be able to register a user and log on the application", () => { + cy.get("button:contains('Register')").click(); + cy.wait(2000); + cy.get("button:contains('Return')").click(); + cy.wait(2000); + cy.get("button:contains('Register')").click(); + cy.get('input[placeholder="Login"]').type("testinguser"); + cy.get('input[placeholder="Password"]').type("12345"); + cy.get('input[placeholder="Repeat password"]').type("12345"); + cy.get("button:contains('Register')").click(); + cy.contains("User successfully registered!").should("be.visible"); + + cy.get("button:contains('Login')").click(); + cy.wait(2000); + cy.get("button:contains('Return')").click(); + cy.wait(2000); + cy.get("button:contains('Login')").click(); + cy.get('input[placeholder="Login"]').type("testinguser"); + cy.get('input[placeholder="Password"]').type("12345"); + cy.get("button:contains('Enter')").click(); + cy.contains("User logged in!").should("be.visible"); + }); +}); diff --git a/cypress/e2e/MainManuNavigation.cy.js b/cypress/e2e/MainManuNavigation.cy.js new file mode 100644 index 00000000..96da9b6c --- /dev/null +++ b/cypress/e2e/MainManuNavigation.cy.js @@ -0,0 +1,38 @@ +describe("MainManuNavigation.cy", () => { + beforeEach(() => { + cy.visit("http://localhost:3000"); + const userData = { + login: "testinguser", + password: "12345", + }; + localStorage.setItem("userData", JSON.stringify(userData)); + }); + + it("should be able to navigate through the lists", () => { + cy.get("button:contains('Login')").click(); + cy.get("button:contains('Return')").click(); + cy.get("button:contains('Login')").click(); + cy.get('input[placeholder="Login"]').type("testinguser"); + cy.get('input[placeholder="Password"]').type("12345"); + cy.get("button:contains('Enter')").click(); + cy.get("button:contains('Locations List')").should("be.visible").click(); + cy.wait(2000); + cy.get("button:contains('Episodes List')").should("be.visible").click(); + cy.wait(2000); + cy.get("button:contains('Characters List')").should("be.visible").click(); + cy.wait(2000); + cy.get("button:contains('Rick tells jokes')").should("be.visible").click(); + cy.wait(2000); + cy.get("button:contains('Return to dashlist')").click(); + cy.wait(2000); + cy.get("button:contains('Yes, take me to dashlist')").should("be.visible").click(); + cy.wait(2000); + cy.get("button:contains('Log out')").should("be.visible").click(); + cy.wait(2000); + cy.get("button:contains('Cancel')").should("be.visible").click(); + cy.wait(2000); + cy.get("button:contains('Log out')").should("be.visible").click(); + cy.wait(2000); + cy.get("button:contains('Confirm')").should("be.visible").click(); + }); +}); diff --git a/cypress/e2e/RickJokes.cy.js b/cypress/e2e/RickJokes.cy.js new file mode 100644 index 00000000..e13063fb --- /dev/null +++ b/cypress/e2e/RickJokes.cy.js @@ -0,0 +1,53 @@ +describe("RickJokes", () => { + beforeEach(() => { + cy.visit("http://localhost:3000"); + const userData = { + login: "testinguser", + password: "12345", + }; + localStorage.setItem("userData", JSON.stringify(userData)); + cy.get("button:contains('Login')").click(); + cy.get("button:contains('Return')").click(); + cy.get("button:contains('Login')").click(); + cy.get('input[placeholder="Login"]').type("testinguser"); + cy.get('input[placeholder="Password"]').type("12345"); + cy.get("button:contains('Enter')").click(); + }); + + it("should be able to navigate to rickjokes route and read some jokes", () => { + cy.get("button:contains('Rick tells jokes')").should("be.visible").click(); + cy.get("[data-testid=joke-text-box]"); + cy.get("[data-testid=rick-reactions]").should("be.visible"); + cy.get("[data-testid=joke-action-btn]") + .should("be.visible") + .should("contain", "Yeah, tell me a joke!") + .click(); + cy.wait(3000); + cy.get("[data-testid=joke-action-btn]").then(($jokeGenerator) => { + if ($jokeGenerator.text().includes("What's the punchline?")) { + $jokeGenerator.click(); + cy.wait(5000) + cy.get("[data-testid=leave-rickjokes]") + .should("be.visible") + .should("have.text", "Return to dashlist") + .click(); + cy.wait(3000); + cy.get("[data-testid=leave-rickjokes]") + .should("be.visible") + .should("have.text", "Yes, take me to dashlist!") + .click(); + } else { + cy.wait(5000) + cy.get("[data-testid=leave-rickjokes]") + .should("be.visible") + .should("have.text", "Return to dashlist") + .click(); + cy.wait(3000); + cy.get("[data-testid=leave-rickjokes]") + .should("be.visible") + .should("have.text", "Yes, take me to dashlist!") + .click(); + } + }); + }); +}); diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 00000000..02e42543 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 00000000..66ea16ef --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) \ No newline at end of file diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js new file mode 100644 index 00000000..0e7290a1 --- /dev/null +++ b/cypress/support/e2e.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') \ No newline at end of file diff --git a/helpers/index.js b/helpers/index.js new file mode 100644 index 00000000..819f0fd5 --- /dev/null +++ b/helpers/index.js @@ -0,0 +1,40 @@ +import axios from "axios"; + +export const pagination = (direction, page) => { + switch (direction) { + case "prev": + return page === 1 ? page : page - 1; + case "next": + return page + 1; + default: + return page; + } +} + +export const getContentFromEndpoints = async (endpoints, currentName) => { + const requests = endpoints.map((endpoint) => + axios.get(endpoint).catch(() => "") + ); + let imageUrls = []; + try { + const responses = await Promise.all(requests); + responses.forEach((response) => { + if (response !== "") { + const imagesList = { + id: response?.data?.id, + content: response?.data?.[currentName], + }; + imageUrls.push(imagesList); + } + }); + } catch (error) { + console.log(error); + } + return imageUrls; +} + +export const formatDate = (target) => { + const date = new Date(target); + const options = { month: "2-digit", day: "2-digit", year: "numeric" }; + return date.toLocaleDateString("en-US", options); +}; \ No newline at end of file diff --git a/helpers/useCustomSnackbar.js b/helpers/useCustomSnackbar.js new file mode 100644 index 00000000..bfdbf9aa --- /dev/null +++ b/helpers/useCustomSnackbar.js @@ -0,0 +1,29 @@ +import { useSnackbar } from "react-simple-snackbar"; + +function useCustomSnackbar() { + const options = { + position: "top-center", + style: { + backgroundColor: "midnightblue", + border: "2px solid lightgreen", + color: "lightblue", + fontFamily: "Menlo, monospace", + fontSize: "20px", + textAlign: "center", + }, + closeStyle: { + color: "lightcoral", + fontSize: "16px", + }, + }; + + const [openSnackbar] = useSnackbar(options); + + function openCustomSnackbar(message) { + openSnackbar(message); + } + + return { openCustomSnackbar }; +} + +export default useCustomSnackbar; diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 00000000..aab1cb22 Binary files /dev/null and b/images/logo.png differ diff --git a/images/rick-state-1.gif b/images/rick-state-1.gif new file mode 100644 index 00000000..29fa494b Binary files /dev/null and b/images/rick-state-1.gif differ diff --git a/images/rick-state-2.gif b/images/rick-state-2.gif new file mode 100644 index 00000000..96c86321 Binary files /dev/null and b/images/rick-state-2.gif differ diff --git a/images/rick-state-3.gif b/images/rick-state-3.gif new file mode 100644 index 00000000..7f111f1d Binary files /dev/null and b/images/rick-state-3.gif differ diff --git a/images/rick-state-4.gif b/images/rick-state-4.gif new file mode 100644 index 00000000..60068d65 Binary files /dev/null and b/images/rick-state-4.gif differ diff --git a/images/rick-state-5.gif b/images/rick-state-5.gif new file mode 100644 index 00000000..efe2927d Binary files /dev/null and b/images/rick-state-5.gif differ diff --git a/next.config.js b/next.config.js index ae887958..366eb948 100644 --- a/next.config.js +++ b/next.config.js @@ -2,6 +2,12 @@ const nextConfig = { reactStrictMode: true, swcMinify: true, + compiler: { + styledComponents: true, + }, + env: { + baseUrl: "https://rickandmortyapi.com/api" + } } module.exports = nextConfig diff --git a/package.json b/package.json index d6d970b0..dbce0ee1 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,19 @@ "lint": "next lint" }, "dependencies": { + "axios": "^1.2.2", "next": "13.0.6", "react": "18.2.0", - "react-dom": "18.2.0" + "react-dom": "18.2.0", + "react-simple-snackbar": "^1.1.11", + "styled-components": "^5.3.6" }, "devDependencies": { + "cypress": "^12.3.0", "eslint": "8.29.0", "eslint-config-next": "13.0.6" + }, + "resolutions": { + "styled-components": "^5" } } diff --git a/pages/_app.js b/pages/_app.js index 23d1ca6c..8bde9cea 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -1,6 +1,29 @@ - +import "../styles/global.css"; +import Head from "next/head"; +import Header from "../components/Header/index"; +import Wrapper from "../components/Wrapper"; +import SnackbarProvider from "react-simple-snackbar"; +import { useRouter } from "next/router"; + function MyApp({ Component, pageProps }) { - return + const router = useRouter(); + const { route } = router; + const routeName = route.replace(/[^a-zA-Z ]/g, ""); + const routeNameCapitalized = "| " + routeName.charAt(0).toUpperCase() + routeName.slice(1); + + return ( + <> + + Rick and Morty Data {route !== "/" ? routeNameCapitalized : ""} + + + +
+ + + + + ); } -export default MyApp +export default MyApp; diff --git a/pages/dashlist.js b/pages/dashlist.js new file mode 100644 index 00000000..9bb1e197 --- /dev/null +++ b/pages/dashlist.js @@ -0,0 +1,19 @@ +import React, { useContext, useEffect } from "react"; +import MainMenu from "../components/MainMenu"; +import { MainWrapper } from "../components/Wrapper"; +import { useRouter } from "next/router"; + +function Charlist() { + const router = useRouter(); + const { isLogged } = useContext(MainWrapper); + + useEffect(() => { + if (!isLogged) { + router.push("/"); + } + }, [isLogged, router]); + + return ; +} + +export default Charlist; diff --git a/pages/index.js b/pages/index.js index f80b4ce2..90b53efc 100644 --- a/pages/index.js +++ b/pages/index.js @@ -1,8 +1,5 @@ +import Login from "../components/Login"; export default function Home() { - return ( -
-

Hello, World!

-
- ) + return ; } diff --git a/pages/rickjokes.js b/pages/rickjokes.js new file mode 100644 index 00000000..84c48808 --- /dev/null +++ b/pages/rickjokes.js @@ -0,0 +1,19 @@ +import React, { useContext, useEffect } from "react"; +import RickJokesPage from "../components/RickJokesPage"; +import { MainWrapper } from "../components/Wrapper"; +import { useRouter } from "next/router"; + +function RickJokes() { + const router = useRouter(); + const { isLogged } = useContext(MainWrapper); + + useEffect(() => { + if (!isLogged) { + router.push("/"); + } + }, [isLogged, router]); + + return ; +} + +export default RickJokes; diff --git a/styles/global.css b/styles/global.css new file mode 100644 index 00000000..1a8616aa --- /dev/null +++ b/styles/global.css @@ -0,0 +1,12 @@ +@import url('https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); + +* { + font-family: 'Rubik', sans-serif; + margin: 0; + padding: 0; + box-sizing: border-box; +} + +a { + text-decoration: none; +} \ No newline at end of file diff --git a/styles/globalStyled.js b/styles/globalStyled.js new file mode 100644 index 00000000..e5e1d708 --- /dev/null +++ b/styles/globalStyled.js @@ -0,0 +1,14 @@ +import styled, { keyframes } from "styled-components"; + +const fade = keyframes` + from { + opacity: 0; + } + to { + opacity: 1; + } +`; + +export const FadeTransition = styled.div` + animation: ${fade} 0.5s ease; +`; diff --git a/yarn.lock b/yarn.lock index 904d3d1c..8d3abed2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,87 @@ # yarn lockfile v1 +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" + integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" + integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== + "@babel/runtime-corejs3@^7.10.2": version "7.20.6" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz#63dae945963539ab0ad578efbf3eff271e7067ae" @@ -17,6 +98,106 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.13.10", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" + integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.18.10": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.4.5": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" + integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cypress/request@^2.88.10": + version "2.88.11" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.11.tgz#5a4c7399bc2d7e7ed56e92ce5acb620c8b187047" + integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "~6.10.3" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@emotion/is-prop-valid@^1.1.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + "@eslint/eslintrc@^1.3.3": version "1.3.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" @@ -51,6 +232,38 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@next/env@13.0.6": version "13.0.6" resolved "https://registry.yarnpkg.com/@next/env/-/env-13.0.6.tgz#3fcab11ffbe95bff127827d9f7f3139bc5e6adff" @@ -178,6 +391,33 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/node@*": + version "18.11.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" + integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== + +"@types/node@^14.14.31": + version "14.18.36" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.36.tgz#c414052cb9d43fab67d679d5f3c641be911f5835" + integrity sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ== + +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + "@typescript-eslint/parser@^5.42.0": version "5.46.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.46.1.tgz#1fc8e7102c1141eb64276c3b89d70da8c0ba5699" @@ -232,6 +472,14 @@ acorn@^8.8.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -242,18 +490,42 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^4.1.0: +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -314,26 +586,115 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.1.3" +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + 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 sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + axe-core@^4.4.3: version "4.6.0" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.0.tgz#1d07514866fa51262734b3357932fcf86961383a" integrity sha512-L3ZNbXPTxMrl0+qTXAzn9FBRvk5XdO56K8CvcCKtlxv44Aw2w2NCclGuvCWxHPw1Riiq3ncP/sxFYj2nUqdoTw== +axios@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.2.tgz#72681724c6e6a43a9fea860fc558127dbe32f9f1" + integrity sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.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-plugin-styled-components@>= 1.12.0": + version "2.0.7" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz#c81ef34b713f9da2b7d3f5550df0d1e19e798086" + integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + picomatch "^2.3.0" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -349,6 +710,24 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +cachedir@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -362,12 +741,31 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelize@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== + caniuse-lite@^1.0.30001406: version "1.0.30001439" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb" integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== -chalk@^4.0.0: +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -375,11 +773,57 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + +ci-info@^3.2.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" + integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-table3@~0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -387,11 +831,38 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.16: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -402,7 +873,12 @@ core-js-pure@^3.25.1: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.1.tgz#653f4d7130c427820dcecd3168b594e8bb095a33" integrity sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ== -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -411,11 +887,90 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + +css-to-react-native@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +cypress@^12.3.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.3.0.tgz#ae3fb0540aef4b5eab1ef2bcd0760caf2992b8bf" + integrity sha512-ZQNebibi6NBt51TRxRMYKeFvIiQZ01t50HSy7z/JMgRVqBUey3cdjog5MYEbzG6Ktti5ckDt1tfcC47lmFwXkw== + dependencies: + "@cypress/request" "^2.88.10" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.6.0" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^5.1.0" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.2" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.6" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.3.2" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +dayjs@^1.10.4: + version "1.11.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -423,14 +978,14 @@ debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.2.7: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -455,6 +1010,11 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -476,11 +1036,39 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emoji-regex@^8.0.0: + version "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.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.10.0: version "5.12.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" @@ -489,6 +1077,13 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.20.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.5.tgz#e6dc99177be37cacda5988e692c3fa8b218e95d2" @@ -536,6 +1131,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -751,6 +1351,59 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -784,6 +1437,20 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -819,6 +1486,44 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -853,6 +1558,13 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@ has "^1.0.3" has-symbols "^1.0.3" +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -866,6 +1578,20 @@ get-tsconfig@^4.2.0: resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.2.0.tgz#ff368dd7104dab47bf923404eb93838245c66543" integrity sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg== +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -904,6 +1630,18 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globals@^13.15.0: version "13.19.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" @@ -951,7 +1689,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.2.4: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -966,6 +1704,11 @@ has-bigints@^1.0.1, has-bigints@^1.0.2: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -997,6 +1740,32 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hoist-non-react-statics@^3.0.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" @@ -1015,6 +1784,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1028,6 +1802,11 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -1057,6 +1836,13 @@ is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + is-core-module@^2.10.0, is-core-module@^2.8.1, is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" @@ -1081,6 +1867,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -1088,6 +1879,14 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -1105,7 +1904,7 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.3: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -1125,6 +1924,11 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -1139,6 +1943,16 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -1158,12 +1972,17 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + js-sdsl@^4.1.4: version "4.2.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -1175,16 +1994,36 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -1192,6 +2031,25 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" @@ -1212,6 +2070,11 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "^0.3.20" +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -1220,6 +2083,20 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -1232,6 +2109,34 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@^4.17.11, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -1246,6 +2151,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -1259,6 +2169,23 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1321,6 +2248,13 @@ next@13.0.6: "@next/swc-win32-ia32-msvc" "13.0.6" "@next/swc-win32-x64-msvc" "13.0.6" +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -1381,13 +2315,20 @@ object.values@^1.1.5, object.values@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" -once@^1.3.0: +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" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + open@^8.4.0: version "8.4.0" resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" @@ -1409,6 +2350,11 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -1423,6 +2369,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -1440,7 +2393,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -1455,16 +2408,36 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.3.1: +picomatch@^2.3.0, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +postcss-value-parser@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + postcss@8.4.14: version "8.4.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" @@ -1479,7 +2452,12 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prop-types@^15.8.1: +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -1488,11 +2466,46 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +punycode@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.2.0.tgz#2092cc57cd2582c38e4e7e8bb869dc8d3148bc74" + integrity sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw== + +qs@~6.10.3: + version "6.10.5" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" + integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== + dependencies: + side-channel "^1.0.4" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -1506,11 +2519,29 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-is@^16.13.1: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-simple-snackbar@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/react-simple-snackbar/-/react-simple-snackbar-1.1.11.tgz#e1470f49d04f8e1e941e62f459cca27d1b2167a1" + integrity sha512-l+RMkIoqnOXBQaQbirk4yGaEH5Jeynup/AQBGaq7hCPIIraOQi2RFVthZIM4Ms6sFtdSYxQ8emN4/jI30l7gXw== + dependencies: + "@babel/runtime" "^7.13.10" + react-transition-group "^4.4.1" + +react-transition-group@^4.4.1: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -1537,6 +2568,13 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -1560,12 +2598,25 @@ resolve@^2.0.0-next.3: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.2: +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -1579,6 +2630,18 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rxjs@^7.5.1: + version "7.8.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -1588,6 +2651,11 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -1600,13 +2668,18 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.7: +semver@^7.3.2, semver@^7.3.7: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -1628,6 +2701,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -1638,11 +2716,53 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +sshpk@^1.14.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -1675,7 +2795,7 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -1687,11 +2807,32 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +styled-components@^5, styled-components@^5.3.6: + version "5.3.6" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.6.tgz#27753c8c27c650bee9358e343fc927966bfd00d1" + integrity sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^1.1.0" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + styled-jsx@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.0.tgz#4a5622ab9714bd3fcfaeec292aa555871f057563" @@ -1699,6 +2840,13 @@ styled-jsx@5.1.0: dependencies: client-only "0.0.1" +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1706,6 +2854,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -1729,6 +2884,16 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + tiny-glob@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" @@ -1737,6 +2902,18 @@ tiny-glob@^0.2.9: globalyzer "0.1.0" globrex "^0.1.2" +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1744,6 +2921,14 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -1759,7 +2944,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.4.0: +tslib@^2.1.0, tslib@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== @@ -1771,6 +2956,18 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -1783,6 +2980,11 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -1793,6 +2995,16 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -1800,6 +3012,20 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +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== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -1823,6 +3049,24 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -1833,6 +3077,14 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"