diff --git a/README.md b/README.md index 8e0a57d1f..5df149b06 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# Commerce Example +# Next.js Commerce diff --git a/assets/base.css b/assets/base.css index 9334525f0..7d0df28bf 100644 --- a/assets/base.css +++ b/assets/base.css @@ -98,3 +98,37 @@ body { a { -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} diff --git a/components/auth/ForgotPassword.tsx b/components/auth/ForgotPassword.tsx new file mode 100644 index 000000000..083a86649 --- /dev/null +++ b/components/auth/ForgotPassword.tsx @@ -0,0 +1,89 @@ +import { FC, useEffect, useState, useCallback } from 'react' +import { validate } from 'email-validator' +import { Info } from'@components/icons' +import { useUI } from '@components/ui/context' +import { Logo, Button, Input } from '@components/ui' +import useSignup from '@lib/bigcommerce/use-signup' + +interface Props {} + +const ForgotPassword: FC = () => { + // Form State + const [email, setEmail] = useState('') + const [loading, setLoading] = useState(false) + const [message, setMessage] = useState('') + const [dirty, setDirty] = useState(false) + const [disabled, setDisabled] = useState(false) + + const signup = useSignup() + const { setModalView, closeModal } = useUI() + + const handleSignup = async () => { + if (!dirty && !disabled) { + setDirty(true) + handleValidation() + } + + // try { + // setLoading(true) + // setMessage('') + // await signup({ + // email, + // }) + // setLoading(false) + // closeModal() + // } catch ({ errors }) { + // setMessage(errors[0].message) + // setLoading(false) + // } + } + + const handleValidation = useCallback(() => { + // Unable to send form unless fields are valid. + if (dirty) { + setDisabled(!validate(email)) + } + }, [email, dirty]) + + useEffect(() => { + handleValidation() + }, [handleValidation]) + + return ( +
+
+ +
+
+ {message && ( +
{message}
+ )} + + +
+ +
+ + + Do you have an account? + {` `} + setModalView('LOGIN_VIEW')} + > + Log In + + +
+
+ ) +} + +export default ForgotPassword diff --git a/components/auth/LoginView.tsx b/components/auth/LoginView.tsx new file mode 100644 index 000000000..b9cb4cb63 --- /dev/null +++ b/components/auth/LoginView.tsx @@ -0,0 +1,99 @@ +import { FC, useEffect, useState, useCallback } from 'react' +import { Logo, Modal, Button, Input } from '@components/ui' +import useLogin from '@lib/bigcommerce/use-login' +import { useUI } from '@components/ui/context' +import { validate } from 'email-validator' + +interface Props {} + +const LoginView: FC = () => { + // Form State + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [loading, setLoading] = useState(false) + const [message, setMessage] = useState('') + const [dirty, setDirty] = useState(false) + const [disabled, setDisabled] = useState(false) + const { setModalView, closeModal } = useUI() + + const login = useLogin() + + const handleLogin = async () => { + if (!dirty && !disabled) { + setDirty(true) + handleValidation() + } + + try { + setLoading(true) + setMessage('') + await login({ + email, + password, + }) + setLoading(false) + closeModal() + } catch ({ errors }) { + setMessage(errors[0].message) + setLoading(false) + } + } + + const handleValidation = useCallback(() => { + // Test for Alphanumeric password + const validPassword = /^(?=.*[a-zA-Z])(?=.*[0-9])/.test(password) + + // Unable to send form unless fields are valid. + if (dirty) { + setDisabled(!validate(email) || password.length < 7 || !validPassword) + } + }, [email, password, dirty]) + + useEffect(() => { + handleValidation() + }, [handleValidation]) + + return ( +
+
+ +
+
+ {message && ( +
+ {message}. Did you {` `} + setModalView('FORGOT_VIEW')} + > + forgot your password? + +
+ )} + + + + +
+ Don't have an account? + {` `} + setModalView('SIGNUP_VIEW')} + > + Sign Up + +
+
+
+ ) +} + +export default LoginView diff --git a/components/auth/SignUpView.tsx b/components/auth/SignUpView.tsx new file mode 100644 index 000000000..f79ec5eb9 --- /dev/null +++ b/components/auth/SignUpView.tsx @@ -0,0 +1,109 @@ +import { FC, useEffect, useState, useCallback } from 'react' +import { validate } from 'email-validator' +import { Info } from '@components/icons' +import { useUI } from '@components/ui/context' +import { Logo, Button, Input } from '@components/ui' +import useSignup from '@lib/bigcommerce/use-signup' + +interface Props {} + +const SignUpView: FC = () => { + // Form State + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [firstName, setFirstName] = useState('') + const [lastName, setLastName] = useState('') + const [loading, setLoading] = useState(false) + const [message, setMessage] = useState('') + const [dirty, setDirty] = useState(false) + const [disabled, setDisabled] = useState(false) + + const signup = useSignup() + const { setModalView, closeModal } = useUI() + + const handleSignup = async () => { + if (!dirty && !disabled) { + setDirty(true) + handleValidation() + } + + try { + setLoading(true) + setMessage('') + await signup({ + email, + firstName, + lastName, + password, + }) + setLoading(false) + closeModal() + } catch ({ errors }) { + setMessage(errors[0].message) + setLoading(false) + } + } + + const handleValidation = useCallback(() => { + // Test for Alphanumeric password + const validPassword = /^(?=.*[a-zA-Z])(?=.*[0-9])/.test(password) + + // Unable to send form unless fields are valid. + if (dirty) { + setDisabled(!validate(email) || password.length < 7 || !validPassword) + } + }, [email, password, dirty]) + + useEffect(() => { + handleValidation() + }, [handleValidation]) + + return ( +
+
+ +
+
+ {message && ( +
{message}
+ )} + + + + + + + + {' '} + + Info: Passwords must be longer than 7 chars and + include numbers.{' '} + + +
+ +
+ + + Do you have an account? + {` `} + setModalView('LOGIN_VIEW')} + > + Log In + + +
+
+ ) +} + +export default SignUpView diff --git a/components/auth/index.ts b/components/auth/index.ts new file mode 100644 index 000000000..11571fac7 --- /dev/null +++ b/components/auth/index.ts @@ -0,0 +1,3 @@ +export { default as LoginView } from './LoginView' +export { default as SignUpView } from './SignUpView' +export { default as ForgotPassword } from './ForgotPassword' diff --git a/components/cart/CartItem/CartItem.module.css b/components/cart/CartItem/CartItem.module.css index 618788020..70d29fc03 100644 --- a/components/cart/CartItem/CartItem.module.css +++ b/components/cart/CartItem/CartItem.module.css @@ -10,8 +10,9 @@ .productImage { position: absolute; - top: 0; - left: -10px; - top: 15px; transform: scale(1.9); + width: 100%; + height: 100%; + left: 30% !important; + top: 30% !important; } diff --git a/components/cart/CartItem/CartItem.tsx b/components/cart/CartItem/CartItem.tsx index f769a4fe1..04089fa9b 100644 --- a/components/cart/CartItem/CartItem.tsx +++ b/components/cart/CartItem/CartItem.tsx @@ -1,10 +1,11 @@ -import { ChangeEvent, useEffect, useState } from 'react' +import s from './CartItem.module.css' import Image from 'next/image' -import { Trash, Plus, Minus } from '@components/icon' +import Link from 'next/link' +import { ChangeEvent, useEffect, useState } from 'react' +import { Trash, Plus, Minus } from '@components/icons' import usePrice from '@lib/bigcommerce/use-price' import useUpdateItem from '@lib/bigcommerce/cart/use-update-item' import useRemoveItem from '@lib/bigcommerce/cart/use-remove-item' -import s from './CartItem.module.css' const CartItem = ({ item, @@ -55,18 +56,26 @@ const CartItem = ({ }, [item.quantity]) return ( -
  • -
    +
  • +
    Product Image
    -
    - {item.name} +
    + {/** TODO: Replace this. No `path` found at Cart */} + + + {item.name} + + +
    } /> + {/* + {toastText} + */}
    ) diff --git a/components/core/Navbar/Navbar.tsx b/components/core/Navbar/Navbar.tsx index e5214e8a1..1c75d38b0 100644 --- a/components/core/Navbar/Navbar.tsx +++ b/components/core/Navbar/Navbar.tsx @@ -15,7 +15,7 @@ const Navbar: FC = ({ className }) => {
    - + @@ -42,7 +42,7 @@ const Navbar: FC = ({ className }) => {
    - +
    ) diff --git a/components/core/Searchbar/Searchbar.module.css b/components/core/Searchbar/Searchbar.module.css index 0d2265650..2c3ca27f7 100644 --- a/components/core/Searchbar/Searchbar.module.css +++ b/components/core/Searchbar/Searchbar.module.css @@ -3,10 +3,6 @@ min-width: 300px; } -.input:focus { - @apply outline-none shadow-outline-gray; -} - .iconContainer { @apply absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none; } diff --git a/components/core/Searchbar/Searchbar.tsx b/components/core/Searchbar/Searchbar.tsx index 25f6eb7a8..d598eba84 100644 --- a/components/core/Searchbar/Searchbar.tsx +++ b/components/core/Searchbar/Searchbar.tsx @@ -5,9 +5,10 @@ import { useRouter } from 'next/router' interface Props { className?: string + id?: string } -const Searchbar: FC = ({ className }) => { +const Searchbar: FC = ({ className, id = 'search' }) => { const router = useRouter() useEffect(() => { @@ -21,27 +22,30 @@ const Searchbar: FC = ({ className }) => { className )} > - { - e.preventDefault() +
    = ({ className, checked, onChange }) => { : 'opacity-100 ease-in duration-150' } absolute inset-0 h-full w-full flex items-center justify-center transition-opacity`} > - + = ({ className, checked, onChange }) => { : 'opacity-0 ease-out duration-150' } opacity-0 ease-out duration-150 absolute inset-0 h-full w-full flex items-center justify-center transition-opacity`} > - + diff --git a/components/core/UserNav/DropdownMenu.tsx b/components/core/UserNav/DropdownMenu.tsx index 0f45c7940..dbdf960da 100644 --- a/components/core/UserNav/DropdownMenu.tsx +++ b/components/core/UserNav/DropdownMenu.tsx @@ -3,16 +3,31 @@ import Link from 'next/link' import { useTheme } from 'next-themes' import cn from 'classnames' import s from './DropdownMenu.module.css' -import { Moon, Sun } from '@components/icon' +import { Moon, Sun } from '@components/icons' import { Menu, Transition } from '@headlessui/react' - +import useLogout from '@lib/bigcommerce/use-logout' interface DropdownMenuProps { open: boolean } +const LINKS = [ + { + name: 'My Orders', + href: '/orders', + }, + { + name: 'My Profile', + href: '/profile', + }, + { + name: 'Cart', + href: '/cart', + }, +] + const DropdownMenu: FC = ({ open = false }) => { const { theme, setTheme } = useTheme() - + const logout = useLogout() return ( = ({ open = false }) => { leaveTo="transform opacity-0 scale-95" > + {LINKS.map(({ name, href }) => ( + + {({ active }) => ( + + {name} + + )} + + ))} - {({ active }) => My Purchases} + + theme === 'dark' ? setTheme('light') : setTheme('dark') + } + > +
    + Theme: {theme}{' '} +
    +
    + {theme == 'dark' ? ( + + ) : ( + + )} +
    +
    - {({ active }) => My Account} - - - {({ active }) => ( - - theme === 'dark' ? setTheme('light') : setTheme('dark') - } - > -
    - Theme: {theme}{' '} -
    -
    - {theme == 'dark' ? ( - - ) : ( - - )} -
    -
    - )} -
    - - {({ active }) => ( - - Logout - - )} + logout()} + > + Logout +
    diff --git a/components/core/UserNav/UserNav.module.css b/components/core/UserNav/UserNav.module.css index a22a1868c..f96b44935 100644 --- a/components/core/UserNav/UserNav.module.css +++ b/components/core/UserNav/UserNav.module.css @@ -2,9 +2,6 @@ @apply relative; } -.mainContainer { -} - .list { @apply flex flex-row items-center justify-items-end h-full; } @@ -25,3 +22,11 @@ @apply outline-none; } } + +.bagCount { + @apply border border-accents-1 bg-secondary text-secondary h-4 w-4 absolute rounded-full right-3 top-3 flex items-center justify-center font-bold text-xs; +} + +.avatarButton { + @apply inline-flex justify-center rounded-full outline-none focus:outline-none; +} diff --git a/components/core/UserNav/UserNav.tsx b/components/core/UserNav/UserNav.tsx index c63ba2d9d..b9ab4eb67 100644 --- a/components/core/UserNav/UserNav.tsx +++ b/components/core/UserNav/UserNav.tsx @@ -1,14 +1,15 @@ import Link from 'next/link' import cn from 'classnames' import s from './UserNav.module.css' -import { FC, useRef } from 'react' +import { FC } from 'react' +import { Heart, Bag } from '@components/icons' import { Avatar } from '@components/core' -import { Heart, Bag } from '@components/icon' import { useUI } from '@components/ui/context' +import { LoginView } from '@components/auth' import DropdownMenu from './DropdownMenu' import { Menu } from '@headlessui/react' import useCart from '@lib/bigcommerce/cart/use-cart' - +import useCustomer from '@lib/bigcommerce/use-customer' interface Props { className?: string } @@ -19,25 +20,20 @@ const countItems = (count: number, items: any[]) => const UserNav: FC = ({ className, children, ...props }) => { const { data } = useCart() - const { openSidebar, closeSidebar, displaySidebar } = useUI() + const { data: customer } = useCustomer() + const { openSidebar, closeSidebar, displaySidebar, openModal } = useUI() const itemsCount = Object.values(data?.line_items ?? {}).reduce(countItems, 0) - let ref = useRef() as React.MutableRefObject - return (
    - {p.name} = ({

    {p.name}

    - ${p.prices?.price.value} + {price}
    - {p.name} { return (
    - + +
    +
    +
    + +
    {/* TODO make it work */} diff --git a/components/product/Swatch/Swatch.tsx b/components/product/Swatch/Swatch.tsx index b68b4fbf3..30c9be7c3 100644 --- a/components/product/Swatch/Swatch.tsx +++ b/components/product/Swatch/Swatch.tsx @@ -1,7 +1,7 @@ import cn from 'classnames' import { FC } from 'react' import s from './Swatch.module.css' -import { Check } from '@components/icon' +import { Check } from '@components/icons' import Button, { ButtonProps } from '@components/ui/Button' import { isDark } from '@lib/colors' interface Props { @@ -39,6 +39,7 @@ const Swatch: FC = ({
    diff --git a/components/ui/Input/Input.module.css b/components/ui/Input/Input.module.css new file mode 100644 index 000000000..ccaf833db --- /dev/null +++ b/components/ui/Input/Input.module.css @@ -0,0 +1,5 @@ +.root { + @apply focus:outline-none bg-primary focus:shadow-outline-gray py-2 + px-6 w-full appearance-none transition duration-150 ease-in-out + placeholder-accents-5 pr-10 border border-accents-3 text-accents-6; +} diff --git a/components/ui/Input/Input.tsx b/components/ui/Input/Input.tsx new file mode 100644 index 000000000..404729479 --- /dev/null +++ b/components/ui/Input/Input.tsx @@ -0,0 +1,35 @@ +import cn from 'classnames' +import s from './Input.module.css' +import React, { InputHTMLAttributes } from 'react' + +export interface Props extends InputHTMLAttributes { + className?: string + onChange?: (...args: any[]) => any +} + +const Input: React.FC = (props) => { + const { className, children, onChange, ...rest } = props + + const rootClassName = cn(s.root, {}, className) + + const handleOnChange = (e: any) => { + if (onChange) { + onChange(e.target.value) + } + return null + } + + return ( + + ) +} + +export default Input diff --git a/components/ui/Input/index.ts b/components/ui/Input/index.ts new file mode 100644 index 000000000..aa97178e5 --- /dev/null +++ b/components/ui/Input/index.ts @@ -0,0 +1 @@ +export { default } from './Input' diff --git a/components/ui/Marquee/Marquee.tsx b/components/ui/Marquee/Marquee.tsx index f341cd8cf..401f9b12a 100644 --- a/components/ui/Marquee/Marquee.tsx +++ b/components/ui/Marquee/Marquee.tsx @@ -19,16 +19,6 @@ const M: FC = ({ className = '', children, variant = 'primary' }) => { className ) - // return ( - //
    - //
    - // {items.map((p: any) => ( - // - // ))} - //
    - //
    - // ) - return (
    diff --git a/components/ui/Modal/Modal.module.css b/components/ui/Modal/Modal.module.css index 38f20261e..fa6b95e81 100644 --- a/components/ui/Modal/Modal.module.css +++ b/components/ui/Modal/Modal.module.css @@ -6,3 +6,7 @@ .modal { @apply bg-primary p-12 border border-accents-2; } + +.modal:focus { + @apply outline-none; +} diff --git a/components/ui/Modal/Modal.tsx b/components/ui/Modal/Modal.tsx index 96a2236c5..e31e32e91 100644 --- a/components/ui/Modal/Modal.tsx +++ b/components/ui/Modal/Modal.tsx @@ -2,43 +2,75 @@ import cn from 'classnames' import { FC, useRef } from 'react' import s from './Modal.module.css' import { useDialog } from '@react-aria/dialog' -import { useOverlay, useModal } from '@react-aria/overlays' import { FocusScope } from '@react-aria/focus' - +import { Transition } from '@headlessui/react' +import { useOverlay, useModal, OverlayContainer } from '@react-aria/overlays' +import { Cross } from '@components/icons' interface Props { className?: string children?: any - show?: boolean - close: () => void + open?: boolean + onClose: () => void } const Modal: FC = ({ className, children, - show = true, - close, + open = false, + onClose, ...props }) => { const rootClassName = cn(s.root, className) let ref = useRef() as React.MutableRefObject let { modalProps } = useModal() - let { overlayProps } = useOverlay(props, ref) - let { dialogProps } = useDialog(props, ref) + let { dialogProps } = useDialog({}, ref) + let { overlayProps } = useOverlay( + { + isOpen: open, + isDismissable: false, + onClose: onClose, + ...props, + }, + ref + ) return ( -
    - -
    - {children} -
    -
    -
    + + + +
    + +
    +
    + +
    + + {children} +
    +
    +
    +
    +
    +
    ) } diff --git a/components/ui/Text/Text.module.css b/components/ui/Text/Text.module.css new file mode 100644 index 000000000..61b2d6955 --- /dev/null +++ b/components/ui/Text/Text.module.css @@ -0,0 +1,15 @@ +.body { + @apply text-lg leading-7 font-medium max-w-6xl mx-auto; +} + +.heading { + @apply text-5xl mb-12; +} + +.pageHeading { + @apply pt-1 pb-4 text-2xl leading-7 font-bold text-base tracking-wide; +} + +.sectionHeading { + @apply pt-1 pb-2 text-base font-semibold leading-7 text-base tracking-wider uppercase border-b border-accents-2 mb-3; +} diff --git a/components/ui/Text/Text.tsx b/components/ui/Text/Text.tsx new file mode 100644 index 000000000..962e3543e --- /dev/null +++ b/components/ui/Text/Text.tsx @@ -0,0 +1,58 @@ +import React, { + FunctionComponent, + JSXElementConstructor, + CSSProperties, +} from 'react' +import cn from 'classnames' +import s from './Text.module.css' + +interface Props { + variant?: Variant + className?: string + style?: CSSProperties + children: React.ReactNode | any +} + +type Variant = 'heading' | 'body' | 'pageHeading' | 'sectionHeading' + +const Text: FunctionComponent = ({ + style, + className = '', + variant = 'body', + children, +}) => { + const componentsMap: { + [P in Variant]: React.ComponentType | string + } = { + body: 'p', + heading: 'h1', + pageHeading: 'h1', + sectionHeading: 'h2', + } + + const Component: + | JSXElementConstructor + | React.ReactElement + | React.ComponentType + | string = componentsMap![variant!] + + return ( + + {children} + + ) +} + +export default Text diff --git a/components/ui/Text/index.ts b/components/ui/Text/index.ts new file mode 100644 index 000000000..e1e5fa74e --- /dev/null +++ b/components/ui/Text/index.ts @@ -0,0 +1 @@ +export { default } from './Text' diff --git a/components/ui/Toast/Toast.module.css b/components/ui/Toast/Toast.module.css new file mode 100644 index 000000000..41e77b622 --- /dev/null +++ b/components/ui/Toast/Toast.module.css @@ -0,0 +1,9 @@ +.root { +} + +.toast { + @apply absolute bg-primary text-primary flex items-center border border-accents-1 + rounded-md z-50 shadow-2xl top-0 right-0 p-6 my-6 mx-3; + width: 420px; + z-index: 20000; +} diff --git a/components/ui/Toast/Toast.tsx b/components/ui/Toast/Toast.tsx new file mode 100644 index 000000000..33baf3353 --- /dev/null +++ b/components/ui/Toast/Toast.tsx @@ -0,0 +1,73 @@ +import cn from 'classnames' +import { FC, useRef, useEffect, useCallback } from 'react' +import s from './Toast.module.css' +import { useDialog } from '@react-aria/dialog' +import { FocusScope } from '@react-aria/focus' +import { Transition } from '@headlessui/react' +import { useOverlay, useModal, OverlayContainer } from '@react-aria/overlays' + +interface Props { + className?: string + children?: any + open?: boolean + onClose: () => void +} + +const Toast: FC = ({ + className, + children, + open = false, + onClose, + ...props +}) => { + const rootClassName = cn(s.root, className) + let ref = useRef() as React.MutableRefObject + let { modalProps } = useModal() + let { dialogProps } = useDialog({}, ref) + let { overlayProps } = useOverlay( + { + isOpen: open, + isDismissable: true, + onClose: onClose, + ...props, + }, + ref + ) + + // useEffect(() => { + // setTimeout(() => { + // useCallback(onClose, []) + // }, 400) + // }) + + return ( + + + +
    + +
    + {children} +
    +
    +
    +
    +
    +
    + ) +} + +export default Toast diff --git a/components/ui/Toast/index.ts b/components/ui/Toast/index.ts new file mode 100644 index 000000000..0e86a3392 --- /dev/null +++ b/components/ui/Toast/index.ts @@ -0,0 +1 @@ +export { default } from './Toast' diff --git a/components/ui/context.tsx b/components/ui/context.tsx index e636ecff2..1c84b9de9 100644 --- a/components/ui/context.tsx +++ b/components/ui/context.tsx @@ -5,11 +5,19 @@ import { SSRProvider, OverlayProvider } from 'react-aria' export interface State { displaySidebar: boolean displayDropdown: boolean + displayModal: boolean + displayToast: boolean + modalView: string + toastText: string } const initialState = { displaySidebar: false, displayDropdown: false, + displayModal: false, + modalView: 'LOGIN_VIEW', + displayToast: false, + toastText: '', } type Action = @@ -19,12 +27,39 @@ type Action = | { type: 'CLOSE_SIDEBAR' } + | { + type: 'OPEN_TOAST' + } + | { + type: 'CLOSE_TOAST' + } + | { + type: 'SET_TOAST_TEXT' + text: ToastText + } | { type: 'OPEN_DROPDOWN' } | { type: 'CLOSE_DROPDOWN' } + | { + type: 'OPEN_MODAL' + } + | { + type: 'CLOSE_MODAL' + } + | { + type: 'SET_MODAL_VIEW' + view: 'LOGIN_VIEW' + } + | { + type: 'SET_MODAL_VIEW' + view: 'SIGNUP_VIEW' + } + +type MODAL_VIEWS = 'SIGNUP_VIEW' | 'LOGIN_VIEW' | 'FORGOT_VIEW' +type ToastText = string export const UIContext = React.createContext(initialState) @@ -56,6 +91,42 @@ function uiReducer(state: State, action: Action) { displayDropdown: false, } } + case 'OPEN_MODAL': { + return { + ...state, + displayModal: true, + } + } + case 'CLOSE_MODAL': { + return { + ...state, + displayModal: false, + } + } + case 'OPEN_TOAST': { + return { + ...state, + displayToast: true, + } + } + case 'CLOSE_TOAST': { + return { + ...state, + displayToast: false, + } + } + case 'SET_MODAL_VIEW': { + return { + ...state, + modalView: action.view, + } + } + case 'SET_TOAST_TEXT': { + return { + ...state, + toastText: action.text, + } + } } } @@ -68,14 +139,32 @@ export const UIProvider: FC = (props) => { const openDropdown = () => dispatch({ type: 'OPEN_DROPDOWN' }) const closeDropdown = () => dispatch({ type: 'CLOSE_DROPDOWN' }) + const openModal = () => dispatch({ type: 'OPEN_MODAL' }) + const closeModal = () => dispatch({ type: 'CLOSE_MODAL' }) + + const openToast = () => dispatch({ type: 'OPEN_TOAST' }) + const closeToast = () => dispatch({ type: 'CLOSE_TOAST' }) + + const setModalView = (view: MODAL_VIEWS) => + dispatch({ type: 'SET_MODAL_VIEW', view }) + const value = { ...state, openSidebar, closeSidebar, openDropdown, closeDropdown, + openModal, + closeModal, + setModalView, + openToast, + closeToast, } + setTimeout(() => { + openToast() + }, 200) + return } diff --git a/components/ui/index.ts b/components/ui/index.ts index 33de8eb71..f1796b650 100644 --- a/components/ui/index.ts +++ b/components/ui/index.ts @@ -8,3 +8,6 @@ export { default as Container } from './Container' export { default as LoadingDots } from './LoadingDots' export { default as Skeleton } from './Skeleton' export { default as Modal } from './Modal' +export { default as Text } from './Text' +export { default as Input } from './Input' +export { default as Toast } from './Toast' diff --git a/components/ui/types.ts b/components/ui/types.ts deleted file mode 100644 index 8b2c535b2..000000000 --- a/components/ui/types.ts +++ /dev/null @@ -1 +0,0 @@ -export type Colors = 'violet' | 'black' | 'pink' | 'white' diff --git a/components/wishlist/WishlistCard/WishlistCard.tsx b/components/wishlist/WishlistCard/WishlistCard.tsx index f257c2a8e..eeacfa779 100644 --- a/components/wishlist/WishlistCard/WishlistCard.tsx +++ b/components/wishlist/WishlistCard/WishlistCard.tsx @@ -1,5 +1,5 @@ import { FC } from 'react' -import { Trash } from '@components/icon' +import { Trash } from '@components/icons' import s from './WishlistCard.module.css' interface Props { diff --git a/lib/bigcommerce/api/catalog/products.ts b/lib/bigcommerce/api/catalog/products.ts index 95d780474..0e3690e55 100644 --- a/lib/bigcommerce/api/catalog/products.ts +++ b/lib/bigcommerce/api/catalog/products.ts @@ -22,7 +22,7 @@ export type ProductsHandlers = { const METHODS = ['GET'] // TODO: a complete implementation should have schema validation for `req.body` -const productApi: BigcommerceApiHandler< +const productsApi: BigcommerceApiHandler< SearchProductsData, ProductsHandlers > = async (req, res, config, handlers) => { @@ -45,4 +45,4 @@ const productApi: BigcommerceApiHandler< export const handlers = { getProducts } -export default createApiHandler(productApi, handlers, {}) +export default createApiHandler(productsApi, handlers, {}) diff --git a/lib/bigcommerce/api/fragments/product.ts b/lib/bigcommerce/api/fragments/product.ts index 7c81e0b2e..73856ca2c 100644 --- a/lib/bigcommerce/api/fragments/product.ts +++ b/lib/bigcommerce/api/fragments/product.ts @@ -1,15 +1,3 @@ -export const responsiveImageFragment = /* GraphQL */ ` - fragment responsiveImage on Image { - urlSmall: url(width: $imgSmallWidth, height: $imgSmallHeight) - urlMedium: url(width: $imgMediumWidth, height: $imgMediumHeight) - urlLarge: url(width: $imgLargeWidth, height: $imgLargeHeight) - urlXL: url(width: $imgXLWidth, height: $imgXLHeight) - urlOriginal - altText - isDefault - } -` - export const swatchOptionFragment = /* GraphQL */ ` fragment swatchOption on SwatchOptionValue { isDefault @@ -51,11 +39,17 @@ export const productInfoFragment = /* GraphQL */ ` value currencyCode } + retailPrice { + value + currencyCode + } } images { edges { node { - ...responsiveImage + urlOriginal + altText + isDefault } } } @@ -64,7 +58,9 @@ export const productInfoFragment = /* GraphQL */ ` node { entityId defaultImage { - ...responsiveImage + urlOriginal + altText + isDefault } } } @@ -78,9 +74,17 @@ export const productInfoFragment = /* GraphQL */ ` } } } + localeMeta: metafields(namespace: $locale, keys: ["name", "description"]) + @include(if: $hasLocale) { + edges { + node { + key + value + } + } + } } - ${responsiveImageFragment} ${multipleChoiceOptionFragment} ` diff --git a/lib/bigcommerce/api/index.ts b/lib/bigcommerce/api/index.ts index 1ab33756c..78118b432 100644 --- a/lib/bigcommerce/api/index.ts +++ b/lib/bigcommerce/api/index.ts @@ -1,44 +1,18 @@ -import { CommerceAPIConfig } from 'lib/commerce/api' -import { GetAllProductsQueryVariables } from '../schema' +import type { RequestInit } from '@vercel/fetch' +import type { CommerceAPIConfig } from 'lib/commerce/api' import fetchGraphqlApi from './utils/fetch-graphql-api' import fetchStoreApi from './utils/fetch-store-api' -export interface Images { - small?: ImageOptions - medium?: ImageOptions - large?: ImageOptions - xl?: ImageOptions -} - -export interface ImageOptions { - width: number - height?: number -} - -export type ProductImageVariables = Pick< - GetAllProductsQueryVariables, - | 'imgSmallWidth' - | 'imgSmallHeight' - | 'imgMediumWidth' - | 'imgMediumHeight' - | 'imgLargeWidth' - | 'imgLargeHeight' - | 'imgXLWidth' - | 'imgXLHeight' -> - -export interface BigcommerceConfigOptions extends CommerceAPIConfig { - images?: Images +export interface BigcommerceConfig extends CommerceAPIConfig { + // Indicates if the returned metadata with translations should be applied to the + // data or returned as it is + applyLocale?: boolean storeApiUrl: string storeApiToken: string storeApiClientId: string storeApiFetch(endpoint: string, options?: RequestInit): Promise } -export interface BigcommerceConfig extends BigcommerceConfigOptions { - readonly imageVariables?: ProductImageVariables -} - const API_URL = process.env.BIGCOMMERCE_STOREFRONT_API_URL const API_TOKEN = process.env.BIGCOMMERCE_STOREFRONT_API_TOKEN const STORE_API_URL = process.env.BIGCOMMERCE_STORE_API_URL @@ -66,39 +40,20 @@ if (!(STORE_API_URL && STORE_API_TOKEN && STORE_API_CLIENT_ID)) { export class Config { private config: BigcommerceConfig - constructor(config: Omit) { + constructor(config: Omit) { this.config = { ...config, // The customerCookie is not customizable for now, BC sets the cookie and it's // not important to rename it customerCookie: 'SHOP_TOKEN', - imageVariables: this.getImageVariables(config.images), } } - getImageVariables(images?: Images) { - return images - ? { - imgSmallWidth: images.small?.width, - imgSmallHeight: images.small?.height, - imgMediumWidth: images.medium?.height, - imgMediumHeight: images.medium?.height, - imgLargeWidth: images.large?.height, - imgLargeHeight: images.large?.height, - imgXLWidth: images.xl?.height, - imgXLHeight: images.xl?.height, - } - : undefined - } - getConfig(userConfig: Partial = {}) { - const { images: configImages, ...config } = this.config - const images = { ...configImages, ...userConfig.images } - - return Object.assign(config, userConfig, { - images, - imageVariables: this.getImageVariables(images), - }) + return Object.entries(userConfig).reduce( + (cfg, [key, value]) => Object.assign(cfg, { [key]: value }), + { ...this.config } + ) } setConfig(newConfig: Partial) { @@ -113,6 +68,7 @@ const config = new Config({ cartCookie: process.env.BIGCOMMERCE_CART_COOKIE ?? 'bc_cartId', cartCookieMaxAge: ONE_DAY * 30, fetch: fetchGraphqlApi, + applyLocale: true, // REST API only storeApiUrl: STORE_API_URL, storeApiToken: STORE_API_TOKEN, diff --git a/lib/bigcommerce/api/operations/get-all-products.ts b/lib/bigcommerce/api/operations/get-all-products.ts index 699fa8310..dbd439d9e 100644 --- a/lib/bigcommerce/api/operations/get-all-products.ts +++ b/lib/bigcommerce/api/operations/get-all-products.ts @@ -4,21 +4,16 @@ import type { } from '@lib/bigcommerce/schema' import type { RecursivePartial, RecursiveRequired } from '../utils/types' import filterEdges from '../utils/filter-edges' +import setProductLocaleMeta from '../utils/set-product-locale-meta' import { productConnectionFragment } from '../fragments/product' -import { BigcommerceConfig, getConfig, Images, ProductImageVariables } from '..' +import { BigcommerceConfig, getConfig } from '..' export const getAllProductsQuery = /* GraphQL */ ` query getAllProducts( + $hasLocale: Boolean = false + $locale: String = "null" $entityIds: [Int!] $first: Int = 10 - $imgSmallWidth: Int = 320 - $imgSmallHeight: Int - $imgMediumWidth: Int = 640 - $imgMediumHeight: Int - $imgLargeWidth: Int = 960 - $imgLargeHeight: Int - $imgXLWidth: Int = 1280 - $imgXLHeight: Int $products: Boolean = false $featuredProducts: Boolean = false $bestSellingProducts: Boolean = false @@ -68,8 +63,10 @@ export type ProductTypes = | 'bestSellingProducts' | 'newestProducts' -export type ProductVariables = { field?: ProductTypes } & Images & - Omit +export type ProductVariables = { field?: ProductTypes } & Omit< + GetAllProductsQueryVariables, + ProductTypes | 'hasLocale' +> async function getAllProducts(opts?: { variables?: ProductVariables @@ -96,9 +93,11 @@ async function getAllProducts({ } = {}): Promise { config = getConfig(config) + const locale = vars.locale || config.locale const variables: GetAllProductsQueryVariables = { - ...config.imageVariables, ...vars, + locale, + hasLocale: !!locale, } if (!FIELDS.includes(field)) { @@ -115,11 +114,16 @@ async function getAllProducts({ query, { variables } ) - const products = data.site?.[field]?.edges + const edges = data.site?.[field]?.edges + const products = filterEdges(edges as RecursiveRequired) - return { - products: filterEdges(products as RecursiveRequired), + if (locale && config.applyLocale) { + products.forEach((product: RecursivePartial) => { + if (product.node) setProductLocaleMeta(product.node) + }) } + + return { products } } export default getAllProducts diff --git a/lib/bigcommerce/api/operations/get-product.ts b/lib/bigcommerce/api/operations/get-product.ts index 95b3bdc31..229d402bc 100644 --- a/lib/bigcommerce/api/operations/get-product.ts +++ b/lib/bigcommerce/api/operations/get-product.ts @@ -3,20 +3,15 @@ import type { GetProductQueryVariables, } from 'lib/bigcommerce/schema' import type { RecursivePartial, RecursiveRequired } from '../utils/types' +import setProductLocaleMeta from '../utils/set-product-locale-meta' import { productInfoFragment } from '../fragments/product' -import { BigcommerceConfig, getConfig, Images } from '..' +import { BigcommerceConfig, getConfig } from '..' export const getProductQuery = /* GraphQL */ ` query getProduct( + $hasLocale: Boolean = false + $locale: String = "null" $path: String! - $imgSmallWidth: Int = 320 - $imgSmallHeight: Int - $imgMediumWidth: Int = 640 - $imgMediumHeight: Int - $imgLargeWidth: Int = 960 - $imgLargeHeight: Int - $imgXLWidth: Int = 1280 - $imgXLHeight: Int ) { site { route(path: $path) { @@ -42,8 +37,10 @@ export type GetProductResult< T extends { product?: any } = { product?: ProductNode } > = T -export type ProductVariables = Images & - ({ path: string; slug?: never } | { path?: never; slug: string }) +export type ProductVariables = { locale?: string } & ( + | { path: string; slug?: never } + | { path?: never; slug: string } +) async function getProduct(opts: { variables: ProductVariables @@ -66,9 +63,12 @@ async function getProduct({ config?: BigcommerceConfig }): Promise { config = getConfig(config) + + const locale = vars.locale || config.locale const variables: GetProductQueryVariables = { - ...config.imageVariables, ...vars, + locale, + hasLocale: !!locale, path: slug ? `/${slug}/` : vars.path!, } const { data } = await config.fetch>( @@ -78,6 +78,10 @@ async function getProduct({ const product = data.site?.route?.node if (product?.__typename === 'Product') { + if (locale && config.applyLocale) { + setProductLocaleMeta(product) + } + return { product: product as RecursiveRequired, } diff --git a/lib/bigcommerce/api/utils/errors.ts b/lib/bigcommerce/api/utils/errors.ts index bd7a995d8..77e2007fc 100644 --- a/lib/bigcommerce/api/utils/errors.ts +++ b/lib/bigcommerce/api/utils/errors.ts @@ -1,3 +1,5 @@ +import type { Response } from '@vercel/fetch' + // Used for GraphQL errors export class BigcommerceGraphQLError extends Error {} diff --git a/lib/bigcommerce/api/utils/fetch-graphql-api.ts b/lib/bigcommerce/api/utils/fetch-graphql-api.ts index f32f369dc..049a01e33 100644 --- a/lib/bigcommerce/api/utils/fetch-graphql-api.ts +++ b/lib/bigcommerce/api/utils/fetch-graphql-api.ts @@ -1,7 +1,8 @@ import { FetcherError } from '@lib/commerce/utils/errors' -import type { GraphQLFetcher } from 'lib/commerce/api' +import type { GraphQLFetcher } from '@lib/commerce/api' import { getConfig } from '..' import log from '@lib/logger' +import fetch from './fetch' const fetchGraphqlApi: GraphQLFetcher = async ( query: string, diff --git a/lib/bigcommerce/api/utils/fetch-store-api.ts b/lib/bigcommerce/api/utils/fetch-store-api.ts index 44ec93b41..22b3e5a99 100644 --- a/lib/bigcommerce/api/utils/fetch-store-api.ts +++ b/lib/bigcommerce/api/utils/fetch-store-api.ts @@ -1,5 +1,7 @@ +import type { RequestInit, Response } from '@vercel/fetch' import { getConfig } from '..' import { BigcommerceApiError, BigcommerceNetworkError } from './errors' +import fetch from './fetch' export default async function fetchStoreApi( endpoint: string, diff --git a/lib/bigcommerce/api/utils/fetch.ts b/lib/bigcommerce/api/utils/fetch.ts new file mode 100644 index 000000000..9d9fff3ed --- /dev/null +++ b/lib/bigcommerce/api/utils/fetch.ts @@ -0,0 +1,3 @@ +import zeitFetch from '@vercel/fetch' + +export default zeitFetch() diff --git a/lib/bigcommerce/api/utils/set-product-locale-meta.ts b/lib/bigcommerce/api/utils/set-product-locale-meta.ts new file mode 100644 index 000000000..767286477 --- /dev/null +++ b/lib/bigcommerce/api/utils/set-product-locale-meta.ts @@ -0,0 +1,21 @@ +import type { ProductNode } from '../operations/get-all-products' +import type { RecursivePartial } from './types' + +export default function setProductLocaleMeta( + node: RecursivePartial +) { + if (node.localeMeta?.edges) { + node.localeMeta.edges = node.localeMeta.edges.filter((edge) => { + const { key, value } = edge?.node ?? {} + if (key && key in node) { + ;(node as any)[key] = value + return false + } + return true + }) + + if (!node.localeMeta.edges.length) { + delete node.localeMeta + } + } +} diff --git a/lib/bigcommerce/schema.d.ts b/lib/bigcommerce/schema.d.ts index cf7168992..69cff1ea6 100644 --- a/lib/bigcommerce/schema.d.ts +++ b/lib/bigcommerce/schema.d.ts @@ -1684,16 +1684,6 @@ export type CategoryTreeItemFragment = { 'entityId' | 'name' | 'path' | 'description' | 'productCount' > -export type ResponsiveImageFragment = { __typename?: 'Image' } & Pick< - Image, - 'urlOriginal' | 'altText' | 'isDefault' -> & { - urlSmall: Image['url'] - urlMedium: Image['url'] - urlLarge: Image['url'] - urlXL: Image['url'] - } - export type SwatchOptionFragment = { __typename?: 'SwatchOptionValue' } & Pick< SwatchOptionValue, 'isDefault' | 'hexColors' @@ -1739,6 +1729,9 @@ export type ProductInfoFragment = { __typename?: 'Product' } & Pick< salePrice?: Maybe< { __typename?: 'Money' } & Pick > + retailPrice?: Maybe< + { __typename?: 'Money' } & Pick + > } > images: { __typename?: 'ImageConnection' } & { @@ -1746,7 +1739,10 @@ export type ProductInfoFragment = { __typename?: 'Product' } & Pick< Array< Maybe< { __typename?: 'ImageEdge' } & { - node: { __typename?: 'Image' } & ResponsiveImageFragment + node: { __typename?: 'Image' } & Pick< + Image, + 'urlOriginal' | 'altText' | 'isDefault' + > } > > @@ -1759,7 +1755,10 @@ export type ProductInfoFragment = { __typename?: 'Product' } & Pick< { __typename?: 'VariantEdge' } & { node: { __typename?: 'Variant' } & Pick & { defaultImage?: Maybe< - { __typename?: 'Image' } & ResponsiveImageFragment + { __typename?: 'Image' } & Pick< + Image, + 'urlOriginal' | 'altText' | 'isDefault' + > > } } @@ -1807,6 +1806,20 @@ export type ProductInfoFragment = { __typename?: 'Product' } & Pick< > > } + localeMeta: { __typename?: 'MetafieldConnection' } & { + edges?: Maybe< + Array< + Maybe< + { __typename?: 'MetafieldEdge' } & { + node: { __typename?: 'Metafields' } & Pick< + Metafields, + 'key' | 'value' + > + } + > + > + > + } } export type ProductConnnectionFragment = { @@ -1848,16 +1861,10 @@ export type GetAllProductPathsQuery = { __typename?: 'Query' } & { } export type GetAllProductsQueryVariables = Exact<{ + hasLocale?: Maybe + locale?: Maybe entityIds?: Maybe> first?: Maybe - imgSmallWidth?: Maybe - imgSmallHeight?: Maybe - imgMediumWidth?: Maybe - imgMediumHeight?: Maybe - imgLargeWidth?: Maybe - imgLargeHeight?: Maybe - imgXLWidth?: Maybe - imgXLHeight?: Maybe products?: Maybe featuredProducts?: Maybe bestSellingProducts?: Maybe @@ -1880,15 +1887,9 @@ export type GetAllProductsQuery = { __typename?: 'Query' } & { } export type GetProductQueryVariables = Exact<{ + hasLocale?: Maybe + locale?: Maybe path: Scalars['String'] - imgSmallWidth?: Maybe - imgSmallHeight?: Maybe - imgMediumWidth?: Maybe - imgMediumHeight?: Maybe - imgLargeWidth?: Maybe - imgLargeHeight?: Maybe - imgXLWidth?: Maybe - imgXLHeight?: Maybe }> export type GetProductQuery = { __typename?: 'Query' } & { diff --git a/lib/commerce/api/index.ts b/lib/commerce/api/index.ts index ae1e3f46b..b1ef09a62 100644 --- a/lib/commerce/api/index.ts +++ b/lib/commerce/api/index.ts @@ -1,4 +1,7 @@ +import type { RequestInit, Response } from '@vercel/fetch' + export interface CommerceAPIConfig { + locale?: string commerceUrl: string apiToken: string cartCookie: string diff --git a/next.config.js b/next.config.js index 38bfd6c64..471c7e404 100644 --- a/next.config.js +++ b/next.config.js @@ -3,6 +3,12 @@ module.exports = { sizes: [320, 480, 820, 1200, 1600], domains: ['cdn11.bigcommerce.com'], }, + experimental: { + i18n: { + locales: ['en-US', 'es'], + defaultLocale: 'en-US', + }, + }, rewrites() { return [ { diff --git a/package.json b/package.json index f60411b5d..333c897ae 100644 --- a/package.json +++ b/package.json @@ -22,29 +22,26 @@ "@headlessui/react": "^0.2.0", "@react-aria/overlays": "^3.4.0", "@tailwindcss/ui": "^0.6.2", - "animate.css": "^4.1.1", + "@vercel/fetch": "^6.1.0", "bowser": "^2.11.0", - "bunyan": "^1.8.14", - "bunyan-prettystream": "^0.1.3", "classnames": "^2.2.6", "cookie": "^0.4.1", + "email-validator": "^2.0.4", + "intersection-observer": "^0.11.0", "js-cookie": "^2.2.1", "keen-slider": "^5.2.4", "lodash.debounce": "^4.0.8", "lodash.random": "^3.2.0", - "next": "^9.5.6-canary.12", + "next": "^9.5.6-canary.14", "next-seo": "^4.11.0", "next-themes": "^0.0.4", - "nextjs-progressbar": "^0.0.6", "postcss-import": "^13.0.0", "postcss-nesting": "^7.0.1", "react": "^16.14.0", "react-aria": "^3.0.0", "react-dom": "^16.14.0", - "react-icons": "^3.11.0", + "react-intersection-observer": "^8.29.1", "react-merge-refs": "^1.1.0", - "react-swipeable-views": "^0.13.9", - "react-swipeable-views-utils": "^0.14.0-alpha.0", "react-ticker": "^1.2.2", "swr": "^0.3.3", "tailwindcss": "^1.9" @@ -65,6 +62,8 @@ "@types/node": "^14.11.2", "@types/react": "^16.9.49", "@types/react-swipeable-views": "^0.13.0", + "bunyan": "^1.8.14", + "bunyan-prettystream": "^0.1.3", "graphql": "^15.3.0", "postcss-flexbugs-fixes": "^4.2.1", "postcss-preset-env": "^6.7.0", diff --git a/pages/[...pages].tsx b/pages/[...pages].tsx index 850ff2957..be6cbe6f1 100644 --- a/pages/[...pages].tsx +++ b/pages/[...pages].tsx @@ -7,19 +7,24 @@ import { Layout, HTMLContent } from '@components/core' export async function getStaticProps({ preview, params, + locale, }: GetStaticPropsContext<{ pages: string[] }>) { const { pages } = await getAllPages() - const slug = params?.pages.join('/') + const path = params?.pages.join('/') + const slug = locale ? `${locale}/${path}` : path + const pageItem = pages.find((p) => (p.url ? getSlug(p.url) === slug : false)) const data = pageItem && (await getPage({ variables: { id: pageItem.id! } })) const page = data?.page if (!page) { + // We throw to make sure this fails at build time as this is never expected to happen throw new Error(`Page with slug '${slug}' not found`) } return { props: { pages, page }, + revalidate: 60 * 60, // Every hour } } diff --git a/pages/_app.tsx b/pages/_app.tsx index a814e9a65..69f3ce223 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,9 +1,6 @@ import '@assets/main.css' import 'keen-slider/keen-slider.min.css' -// To be removed -import 'animate.css' - import { FC } from 'react' import type { AppProps } from 'next/app' diff --git a/pages/blog.tsx b/pages/blog.tsx index 8db198612..47b46b627 100644 --- a/pages/blog.tsx +++ b/pages/blog.tsx @@ -34,7 +34,7 @@ export default function Blog({}: InferGetStaticPropsType<
    @@ -51,7 +51,7 @@ export default function Blog({}: InferGetStaticPropsType<
    - + Jacket
    {/** Replace by HTML Content */}
    diff --git a/pages/cart.tsx b/pages/cart.tsx index 59f278ee0..7fee8176d 100644 --- a/pages/cart.tsx +++ b/pages/cart.tsx @@ -1,7 +1,12 @@ import { GetStaticPropsContext, InferGetStaticPropsType } from 'next' import getAllPages from '@lib/bigcommerce/api/operations/get-all-pages' import { Layout } from '@components/core' -import { Container } from '@components/ui' +import { Button } from '@components/ui' +import { Bag, Cross, Check } from '@components/icons' +import useCart from '@lib/bigcommerce/cart/use-cart' +import usePrice from '@lib/bigcommerce/use-price' +import { CartItem } from '@components/cart' +import { Text } from '@components/ui' export async function getStaticProps({ preview }: GetStaticPropsContext) { const { pages } = await getAllPages() @@ -10,16 +15,122 @@ export async function getStaticProps({ preview }: GetStaticPropsContext) { } } -export default function Home({}: InferGetStaticPropsType< +export default function Cart({}: InferGetStaticPropsType< typeof getStaticProps >) { + const { data, isEmpty } = useCart() + const { price: subTotal } = usePrice( + data && { + amount: data.base_amount, + currencyCode: data.currency.code, + } + ) + const { price: total } = usePrice( + data && { + amount: data.cart_amount, + currencyCode: data.currency.code, + } + ) + + const items = data?.line_items.physical_items ?? [] + + const error = null + const success = null + return ( - -

    - My Cart -

    -
    +
    +
    + {isEmpty ? ( +
    + + + +

    + Your cart is empty +

    +

    + Biscuit oat cake wafer icing ice cream tiramisu pudding cupcake. +

    +
    + ) : error ? ( +
    + + + +

    + We couldn’t process the purchase. Please check your card + information and try again. +

    +
    + ) : success ? ( +
    + + + +

    + Thank you for your order. +

    +
    + ) : ( +
    + My Cart + Review your Order +
      + {items.map((item) => ( + + ))} +
    +
    + + Before you leave, take a look at these items. We picked them + just for you + +
    + {[1, 2, 3, 4, 5, 6].map((x) => ( +
    + ))} +
    +
    +
    + )} +
    +
    +
    +
    +
      +
    • + Subtotal + {subTotal} +
    • +
    • + Taxes + Calculated at checkout +
    • +
    • + Estimated Shipping + FREE +
    • +
    +
    + Total + {total} +
    +
    +
    +
    + +
    +
    +
    +
    +
    ) } -Home.Layout = Layout +Cart.Layout = Layout diff --git a/pages/index.tsx b/pages/index.tsx index 649a4400c..44a93c1d7 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,25 +1,36 @@ import { useMemo } from 'react' import { GetStaticPropsContext, InferGetStaticPropsType } from 'next' +import { getConfig } from '@lib/bigcommerce/api' import getAllProducts from '@lib/bigcommerce/api/operations/get-all-products' import getSiteInfo from '@lib/bigcommerce/api/operations/get-site-info' import getAllPages from '@lib/bigcommerce/api/operations/get-all-pages' import rangeMap from '@lib/range-map' +import { getCategoryPath, getDesignerPath } from '@utils/search' import { Layout } from '@components/core' import { Grid, Marquee, Hero } from '@components/ui' import { ProductCard } from '@components/product' +import Link from 'next/link' + +export async function getStaticProps({ + preview, + locale, +}: GetStaticPropsContext) { + const config = getConfig({ locale }) -export async function getStaticProps({ preview }: GetStaticPropsContext) { const { products: featuredProducts } = await getAllProducts({ variables: { field: 'featuredProducts', first: 6 }, + config, }) const { products: bestSellingProducts } = await getAllProducts({ variables: { field: 'bestSellingProducts', first: 6 }, + config, }) const { products: newestProducts } = await getAllProducts({ variables: { field: 'newestProducts', first: 12 }, + config, }) - const { categories, brands } = await getSiteInfo() - const { pages } = await getAllPages() + const { categories, brands } = await getSiteInfo({ config }) + const { pages } = await getAllPages({ config }) return { props: { @@ -59,8 +70,7 @@ export default function Home({ (i) => bestSellingProducts[i] ?? products.shift() ).filter(nonNullable), } - // Props from getStaticProps won't change - }, []) + }, [newestProducts, featuredProducts, bestSellingProducts]) return (
    @@ -124,21 +134,29 @@ export default function Home({
    diff --git a/pages/login.tsx b/pages/login.tsx deleted file mode 100644 index fd6e12687..000000000 --- a/pages/login.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import useSignup from '@lib/bigcommerce/use-signup' -import { Layout } from '@components/core' -import { Logo, Modal, Button } from '@components/ui' -import useLogin from '@lib/bigcommerce/use-login' -import useLogout from '@lib/bigcommerce/use-logout' -import useCustomer from '@lib/bigcommerce/use-customer' - -export default function Login() { - const signup = useSignup() - const login = useLogin() - const logout = useLogout() - // Data about the currently logged in customer, it will update - // automatically after a signup/login/logout - const { data } = useCustomer() - // TODO: use this method. It can take more than 5 seconds to do a signup - const handleSignup = async () => { - // TODO: validate the password and email before calling the signup - // Passwords must be at least 7 characters and contain both alphabetic - // and numeric characters. - try { - await signup({ - // This account already exists, so it will throw the "duplicated_email" error - email: 'luis@vercel.com', - firstName: 'Luis', - lastName: 'Alvarez', - password: 'luis123', - }) - } catch (error) { - if (error.code === 'duplicated_email') { - // TODO: handle duplicated email - } - // Show a generic error saying that something bad happened, try again later - } - } - - const handleLogin = async () => { - // TODO: validate the password and email before calling the signup - // Passwords must be at least 7 characters and contain both alphabetic - // and numeric characters. - try { - await login({ - email: 'luis@vercel.com', - // This is an invalid password so it will throw the "invalid_credentials" error - password: 'luis1234', // will work with `luis123` - }) - } catch (error) { - if (error.code === 'invalid_credentials') { - // The email and password didn't match an existing account - } - // Show a generic error saying that something bad happened, try again later - } - } - - return ( -
    - {}}> -
    -
    - -
    -
    -
    - -
    -
    - -
    - - - Don't have an account? - {` `} - - Sign Up - - -
    -
    -
    -
    - ) -} - -Login.Layout = Layout diff --git a/pages/orders.tsx b/pages/orders.tsx new file mode 100644 index 000000000..87c74ac8e --- /dev/null +++ b/pages/orders.tsx @@ -0,0 +1,12 @@ +import { Layout } from '@components/core' +import { Container, Text } from '@components/ui' + +export default function Orders() { + return ( + + My Orders + + ) +} + +Orders.Layout = Layout diff --git a/pages/product/[slug].tsx b/pages/product/[slug].tsx index 7d73b859c..30f708997 100644 --- a/pages/product/[slug].tsx +++ b/pages/product/[slug].tsx @@ -1,5 +1,10 @@ -import { GetStaticPropsContext, InferGetStaticPropsType } from 'next' +import { + GetStaticPathsContext, + GetStaticPropsContext, + InferGetStaticPropsType, +} from 'next' import { useRouter } from 'next/router' +import { getConfig } from '@lib/bigcommerce/api' import getAllPages from '@lib/bigcommerce/api/operations/get-all-pages' import getProduct from '@lib/bigcommerce/api/operations/get-product' import { Layout } from '@components/core' @@ -8,9 +13,15 @@ import getAllProductPaths from '@lib/bigcommerce/api/operations/get-all-product- export async function getStaticProps({ params, + locale, }: GetStaticPropsContext<{ slug: string }>) { - const { pages } = await getAllPages() - const { product } = await getProduct({ variables: { slug: params!.slug } }) + const config = getConfig({ locale }) + + const { pages } = await getAllPages({ config }) + const { product } = await getProduct({ + variables: { slug: params!.slug }, + config, + }) if (!product) { throw new Error(`Product with slug '${params!.slug}' not found`) @@ -22,11 +33,19 @@ export async function getStaticProps({ } } -export async function getStaticPaths() { +export async function getStaticPaths({ locales }: GetStaticPathsContext) { const { products } = await getAllProductPaths() return { - paths: products.map((product) => `/product${product.node.path}`), + paths: locales + ? locales.reduce((arr, locale) => { + // Add a product path for every locale + products.forEach((product) => { + arr.push(`/${locale}/product${product.node.path}`) + }) + return arr + }, []) + : products.map((product) => `/product${product.node.path}`), // If your store has tons of products, enable fallback mode to improve build times! fallback: false, } diff --git a/pages/profile.tsx b/pages/profile.tsx new file mode 100644 index 000000000..a89bfec98 --- /dev/null +++ b/pages/profile.tsx @@ -0,0 +1,26 @@ +import { Layout } from '@components/core' +import { Container, Text } from '@components/ui' +import useCustomer from '@lib/bigcommerce/use-customer' +export default function Profile() { + const { data } = useCustomer() + console.log(data) + return ( + + My Profile +
    +
    + Full Name + + {data.firstName} {data.lastName} + +
    +
    + Email + {data.email} +
    +
    +
    + ) +} + +Profile.Layout = Layout diff --git a/pages/search.tsx b/pages/search.tsx index d4b373ec2..3d18adb66 100644 --- a/pages/search.tsx +++ b/pages/search.tsx @@ -40,7 +40,10 @@ export default function Search({ const router = useRouter() const { asPath } = router const { q, sort } = router.query - const query = filterQuery({ q, sort }) + // `q` can be included but because categories and designers can't be searched + // in the same way of products, it's better to ignore the search input if one + // of those is selected + const query = filterQuery({ sort }) const { pathname, category, brand } = useSearchMeta(asPath) const activeCategory = categories.find( @@ -76,7 +79,7 @@ export default function Search({ > @@ -100,7 +103,7 @@ export default function Search({ > @@ -111,33 +114,50 @@ export default function Search({
    -
    - {data ? ( - <> - - Showing {data.products.length} results for " - {q}" - - - There are no products that match "{q}" - - - ) : ( - <> - Searching for: "{q}" - - )} -
    + {(q || activeCategory || activeBrand) && ( +
    + {data ? ( + <> + + Showing {data.products.length} results{' '} + {q && ( + <> + for "{q}" + + )} + + + {q ? ( + <> + There are no products that match "{q}" + + ) : ( + <> + There are no products that match the selected category & + designer + + )} + + + ) : q ? ( + <> + Searching for: "{q}" + + ) : ( + <>Searching... + )} +
    + )} {data ? ( @@ -145,7 +165,7 @@ export default function Search({ ( ))} diff --git a/pages/wishlist.tsx b/pages/wishlist.tsx index 549648097..b169fc776 100644 --- a/pages/wishlist.tsx +++ b/pages/wishlist.tsx @@ -1,7 +1,7 @@ import { GetStaticPropsContext, InferGetStaticPropsType } from 'next' import getAllPages from '@lib/bigcommerce/api/operations/get-all-pages' import { Layout } from '@components/core' -import { Container } from '@components/ui' +import { Container, Text } from '@components/ui' import { WishlistCard } from '@components/wishlist' import getSiteInfo from '@lib/bigcommerce/api/operations/get-site-info' @@ -35,12 +35,10 @@ export default function Home({
    -

    - My Wishlist -

    + My Wishlist
    {[1, 2, 3, 4, 5, 6].map((i) => ( - + ))}
    diff --git a/tailwind.config.js b/tailwind.config.js index b1d46ff6b..e6b14b11e 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -3,7 +3,12 @@ module.exports = { removeDeprecatedGapUtilities: true, purgeLayersByDefault: true, }, - purge: ['./components/**/*.{js,ts,jsx,tsx}', './pages/**/*.{js,ts,jsx,tsx}'], + purge: { + content: [ + './pages/**/*.{js,ts,jsx,tsx}', + './components/**/*.{js,ts,jsx,tsx}', + ], + }, theme: { extend: { maxWidth: { diff --git a/utils/search.tsx b/utils/search.tsx index ae7a2ed7e..87b42db36 100644 --- a/utils/search.tsx +++ b/utils/search.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import getSlug from './get-slug' export function useSearchMeta(asPath: string) { const [pathname, setPathname] = useState('/search') @@ -34,11 +35,16 @@ export const filterQuery = (query: any) => return obj }, {}) -export const getCategoryPath = (slug: string, brand?: string) => - `/search${brand ? `/designers/${brand}` : ''}${slug ? `/${slug}` : ''}` +export const getCategoryPath = (path: string, brand?: string) => { + const category = getSlug(path) -export const getDesignerPath = (slug: string, category?: string) => { - const designer = slug.replace(/^brands/, 'designers') + return `/search${brand ? `/designers/${brand}` : ''}${ + category ? `/${category}` : '' + }` +} + +export const getDesignerPath = (path: string, category?: string) => { + const designer = getSlug(path).replace(/^brands/, 'designers') return `/search${designer ? `/${designer}` : ''}${ category ? `/${category}` : '' diff --git a/yarn.lock b/yarn.lock index 270517ea4..77e61f7c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1060,13 +1060,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-typescript" "^7.10.4" -"@babel/runtime@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" - integrity sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA== - dependencies: - regenerator-runtime "^0.12.0" - "@babel/runtime@7.11.2": version "7.11.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" @@ -1074,7 +1067,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.6.2", "@babel/runtime@^7.8.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== @@ -1283,74 +1276,85 @@ tslib "~2.0.1" "@graphql-tools/apollo-engine-loader@^6": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-6.2.4.tgz#bed59ccac654e36a62f736e035697e2e5de152ba" - integrity sha512-aYDyEs7Q0J0og7E/B7zj2+62Jf8QerkwV+hQ5wwGLSQlYnLDTB+hMNBG/3ga9qMQ5UVQ+d45ckXKN9nOl6LX7g== + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-6.2.5.tgz#b9e65744f522bb9f6ca50651e5622820c4f059a8" + integrity sha512-CE4uef6PyxtSG+7OnLklIr2BZZDgjO89ZXK47EKdY7jQy/BQD/9o+8SxPsgiBc+2NsDJH2I6P/nqoaJMOEat6g== dependencies: - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/utils" "^7.0.0" cross-fetch "3.0.6" tslib "~2.0.1" -"@graphql-tools/code-file-loader@^6": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-6.2.4.tgz#ce194c19b2fcd714bffa4c0c529a4c65a6b0db4b" - integrity sha512-aDVI/JVUXIdqSJJKLjpBaqOAOCa5yUvsgQZu2Q9nVwV9faGlQi5MUuYAh1xp0LW80/5/unbiZ5/taRUyUY/6Eg== +"@graphql-tools/batch-execute@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-7.0.0.tgz#e79d11bd5b39f29172f6ec2eafa71103c6a6c85b" + integrity sha512-+ywPfK6N2Ddna6oOa5Qb1Mv7EA8LOwRNOAPP9dL37FEhksJM9pYqPSceUcqMqg7S9b0+Cgr78s408rgvurV3/Q== dependencies: - "@graphql-tools/graphql-tag-pluck" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/utils" "^7.0.0" + dataloader "2.0.0" + is-promise "4.0.0" + tslib "~2.0.1" + +"@graphql-tools/code-file-loader@^6": + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-6.2.5.tgz#02832503e96c6c537083570208bd55ca1fbfaa68" + integrity sha512-KMy8c/I4NeQZUI9InydR14qP1pqPeJfgVJLri0RgJRWDiLAj/nIb2oDioN9AgBX3XYNijJT+pH0//B5EOO0BiA== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" fs-extra "9.0.1" tslib "~2.0.1" -"@graphql-tools/delegate@^6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-6.2.4.tgz#db553b63eb9512d5eb5bbfdfcd8cb1e2b534699c" - integrity sha512-mXe6DfoWmq49kPcDrpKHgC2DSWcD5q0YCaHHoXYPAOlnLH8VMTY8BxcE8y/Do2eyg+GLcwAcrpffVszWMwqw0w== +"@graphql-tools/delegate@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-7.0.0.tgz#7356d81da480eb25723c63e1312e0b3488c509e4" + integrity sha512-KfT9kGRmwU9pPGjDTa3BAyRya169DFbEWpQk+6PVLy+pW8bVrY3mqT22Bla5Yg85LZGkfOhDrR3T9lRIN1XKmA== dependencies: "@ardatan/aggregate-error" "0.0.6" - "@graphql-tools/schema" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/batch-execute" "^7.0.0" + "@graphql-tools/schema" "^7.0.0" + "@graphql-tools/utils" "^7.0.0" dataloader "2.0.0" is-promise "4.0.0" tslib "~2.0.1" "@graphql-tools/git-loader@^6": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-6.2.4.tgz#2502d48cb1253bde7df3f3e1dfd2bdcf7ff72b82" - integrity sha512-urMwWhhsZUKnX9MDHXbMUfZd568pWwj1Bx1O2M7N8I25GqZDW54Fzj9DudlVKE5M9twMtoEyBTH7sH4tscliqg== + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-6.2.5.tgz#a4b3e8826964e1752a3d3a5a33a44b70b9694353" + integrity sha512-WOQDSzazyPZMZUvymHBv5oZ80/mS7tc8XUNy2GmU5My8YRny5zu4fEgP4vQeFcD1trG3uoHUaJPGF7Mmvp6Yhg== dependencies: - "@graphql-tools/graphql-tag-pluck" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/graphql-tag-pluck" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" tslib "~2.0.1" "@graphql-tools/github-loader@^6": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-6.2.4.tgz#38520b5964594a578dbb4a7693a76938a79877a1" - integrity sha512-p4peplm/Ot989bCD4XATK5NEXX7l39BXNw+YKaqgoEoHopyQ142I2Zb0GJiMRjW9yXGqIlDjG4reZazleiprgQ== + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-6.2.5.tgz#460dff6f5bbaa26957a5ea3be4f452b89cc6a44b" + integrity sha512-DLuQmYeNNdPo8oWus8EePxWCfCAyUXPZ/p1PWqjrX/NGPyH2ZObdqtDAfRHztljt0F/qkBHbGHCEk2TKbRZTRw== dependencies: - "@graphql-tools/graphql-tag-pluck" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/graphql-tag-pluck" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" cross-fetch "3.0.6" tslib "~2.0.1" "@graphql-tools/graphql-file-loader@^6", "@graphql-tools/graphql-file-loader@^6.0.0": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.2.4.tgz#1765b644cd621040f232f5c32321b45c187399a7" - integrity sha512-IcdUZoOlkCGr0KO8QCO8G031CDDv5dzHBZeN5H1gzE2AVFFwn2AexysrUXBxftm2DQIOuV+Knap7dC4Ol54kNA== + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.2.5.tgz#831289675e5f446baa19afbc0af8ea6bc94063bf" + integrity sha512-vYDn71FHqwCxWgw8swoVOsD5C0xGz/Lw4zUQnPcgZfAzhAAwl6e/rVWl/HF1UNNSf5CSZu+2oidjOWCI5Wl6Gg== dependencies: "@graphql-tools/import" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/utils" "^7.0.0" fs-extra "9.0.1" tslib "~2.0.1" -"@graphql-tools/graphql-tag-pluck@^6.2.4": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-6.2.5.tgz#5c0c47362406a55aaf661c4af0209b542b8483dc" - integrity sha512-qvdIOTanBuKYLIMSYl9Tk+ej9dq00B4BqUnHqoCvYtSjD1n1UINGrqXgwMT+JXp66gUZWw8BU9Ke92mQ4UwTpg== +"@graphql-tools/graphql-tag-pluck@^6.2.6": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-6.2.6.tgz#a7dba969385344d8dd29fa02b4e7175f053d6f60" + integrity sha512-cPYtsBr+W48Hp+SkVdba5KQGPx+jWpDhf7ZX0ySpYGgf3iXCK5w6OZn7nn5AWlmUtMAp8LBLSMenGWcQIuiomw== dependencies: "@babel/parser" "7.11.5" "@babel/traverse" "7.11.5" "@babel/types" "7.11.5" - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/utils" "^7.0.0" tslib "~2.0.1" optionalDependencies: vue-template-compiler "^2.6.12" @@ -1365,21 +1369,21 @@ tslib "~2.0.1" "@graphql-tools/json-file-loader@^6", "@graphql-tools/json-file-loader@^6.0.0": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-6.2.4.tgz#0707fedfced73dd91b1dd81dfa02e83413e5aeaa" - integrity sha512-1iL6wwZrUt888hExlNEloSpNXuuUFYD2KV2FZ82t6yiq6bO9Iyg12SUuGd5xVXx9jUkdaHRZc0plMyuIA6gTGA== + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-6.2.5.tgz#1357d2efd2f416f44e0dd717da06463c29adbf60" + integrity sha512-9LS7WuQdSHlRUvXD7ixt5aDpr3hWsueURHOaWe7T0xZ+KWMTw+LIRtWIliCRzbjNmZ+4ZhwHB3Vc1SO2bfYLgg== dependencies: - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/utils" "^7.0.0" fs-extra "9.0.1" tslib "~2.0.1" "@graphql-tools/load@^6", "@graphql-tools/load@^6.0.0": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-6.2.4.tgz#a1a860bdc9d9e0bd93e1dffdbd2cf8839a521c41" - integrity sha512-FlQC50VELwRxoWUbJMMMs5gG0Dl8BaQYMrXUHTsxwqR7UmksUYnysC21rdousvs6jVZ7pf4unZfZFtBjz+8Edg== + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-6.2.5.tgz#7dd0d34c8ce2cfb24f61c6beba2817d9afdd7f2b" + integrity sha512-TpDgp+id0hhD1iMhdFSgWgWumdI/IpFWwouJeaEhEEAEBkdvH4W9gbBiJBSbPQwMPRNWx8/AZtry0cYKLW4lHg== dependencies: - "@graphql-tools/merge" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/merge" "^6.2.5" + "@graphql-tools/utils" "^7.0.0" globby "11.0.1" import-from "3.0.0" is-glob "4.0.1" @@ -1388,22 +1392,22 @@ unixify "1.0.0" valid-url "1.0.9" -"@graphql-tools/merge@^6.0.0", "@graphql-tools/merge@^6.0.18", "@graphql-tools/merge@^6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.2.4.tgz#5b3b68083d55a38a7f3caac6e0adc46f428c2a3b" - integrity sha512-hQbiSzCJgzUYG1Aspj5EAUY9DsbTI2OK30GLBOjUI16DWkoLVXLXy4ljQYJxq6wDc4fqixMOmvxwf8FoJ9okmw== +"@graphql-tools/merge@^6.0.0", "@graphql-tools/merge@^6.0.18", "@graphql-tools/merge@^6.2.5": + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.2.5.tgz#a03d6711f2a468b8de97c0fe9092469280ca66c9" + integrity sha512-T2UEm7L5MeS1ggbGKBkdV9kTqLqSHQM13RrjPzIAYzkFL/mK837sf+oq8h2+R8B+senuHX8akUhMTcU85kcMvw== dependencies: - "@graphql-tools/schema" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/schema" "^7.0.0" + "@graphql-tools/utils" "^7.0.0" tslib "~2.0.1" "@graphql-tools/prisma-loader@^6": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-6.2.4.tgz#3f902b9f1d36ae0c4731e1fe963178bea300af49" - integrity sha512-4S6j+7kNHKLDnK6mgVj+daW/7SkbdaZ7S8kkyKQzsY8hCh0B7RUkUBqkPCZ5+rbTyKCtFOyKyMYw+ebfLQ5QXg== + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-6.2.5.tgz#1de03e548ef2c0c301b2386e0e8f4a715036adde" + integrity sha512-Xm/cQMV0oKm9tlmz3kMS0G+IRVsC8fJuOmYWvTxc4GorJpMnKCnYu0L7JDSMRBp0Q9yLEbh1ticGEMvjozD4OA== dependencies: - "@graphql-tools/url-loader" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/url-loader" "^6.3.1" + "@graphql-tools/utils" "^7.0.0" "@types/http-proxy-agent" "^2.0.2" "@types/js-yaml" "^3.12.5" "@types/json-stable-stringify" "^1.0.32" @@ -1414,7 +1418,7 @@ debug "^4.2.0" dotenv "^8.2.0" fs-extra "9.0.1" - graphql-request "^3.1.0" + graphql-request "^3.2.0" http-proxy-agent "^4.0.1" https-proxy-agent "^5.0.0" isomorphic-fetch "^3.0.0" @@ -1428,30 +1432,30 @@ yaml-ast-parser "^0.0.43" "@graphql-tools/relay-operation-optimizer@^6": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.2.4.tgz#1cba2ea7ebc30aa28d1e5461a6079aca173fabd0" - integrity sha512-lvBCrRupmVpKfwgOmwz7epm28Nwmk9McddG1htRiAPRCg5MB7/52bYP/QgklDQgkRXWsaDEBXfxKyoGkvLvu0w== + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.2.5.tgz#49ca28ce488200b08de06d26313b4d987a45c6b6" + integrity sha512-i7iJl2/IbmgmoYVky0jhSMIfgaO8icYef2z/Y+0QUdkqBB6fwE2jfD3HrMlJzd45+eghtIj46Qjrp+Bns4o/TA== dependencies: - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/utils" "^7.0.0" relay-compiler "10.0.1" tslib "~2.0.1" -"@graphql-tools/schema@^6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-6.2.4.tgz#cc4e9f5cab0f4ec48500e666719d99fc5042481d" - integrity sha512-rh+14lSY1q8IPbEv2J9x8UBFJ5NrDX9W5asXEUlPp+7vraLp/Tiox4GXdgyA92JhwpYco3nTf5Bo2JDMt1KnAQ== +"@graphql-tools/schema@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-7.0.0.tgz#f87e307d00a3d388f5c54d32f4697611396c0127" + integrity sha512-yDKgoT2+Uf3cdLYmiFB9lRIGsB6lZhILtCXHgZigYgURExrEPmfj3ZyszfEpPKYcPmKaO9FI4coDhIN0Toxl3w== dependencies: - "@graphql-tools/utils" "^6.2.4" + "@graphql-tools/utils" "^7.0.0" tslib "~2.0.1" -"@graphql-tools/url-loader@^6", "@graphql-tools/url-loader@^6.0.0", "@graphql-tools/url-loader@^6.2.4": - version "6.3.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-6.3.0.tgz#75b82bdf0983d3e389c75948a7abff20fa45a630" - integrity sha512-lX6A22Rhbqj8FHmkCVSDflolOGy7UtCJGtGbfRuv8/VqD94JfJLnGVFxC1jODURFdj+yrs/97Wm/ntRcpy7nDA== +"@graphql-tools/url-loader@^6", "@graphql-tools/url-loader@^6.0.0", "@graphql-tools/url-loader@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-6.3.1.tgz#7bf74fdb63f75e001c97d1248d19bf88eaba3b2b" + integrity sha512-AnsGcWcO1dswdA/KH3J65nDetErZK6hnfxqdjRP44jP3H12LjksgEuSsIqD4x5dlFbwCn2whNd0ZeeS9QDsgtQ== dependencies: - "@graphql-tools/delegate" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" - "@graphql-tools/wrap" "^6.2.4" + "@graphql-tools/delegate" "^7.0.0" + "@graphql-tools/utils" "^7.0.0" + "@graphql-tools/wrap" "^7.0.0" "@types/websocket" "1.0.1" cross-fetch "3.0.6" subscriptions-transport-ws "0.9.18" @@ -1459,7 +1463,7 @@ valid-url "1.0.9" websocket "1.0.32" -"@graphql-tools/utils@^6", "@graphql-tools/utils@^6.0.0", "@graphql-tools/utils@^6.0.18", "@graphql-tools/utils@^6.2.4": +"@graphql-tools/utils@^6", "@graphql-tools/utils@^6.0.0", "@graphql-tools/utils@^6.0.18": version "6.2.4" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-6.2.4.tgz#38a2314d2e5e229ad4f78cca44e1199e18d55856" integrity sha512-ybgZ9EIJE3JMOtTrTd2VcIpTXtDrn2q6eiYkeYMKRVh3K41+LZa6YnR2zKERTXqTWqhobROwLt4BZbw2O3Aeeg== @@ -1468,14 +1472,23 @@ camel-case "4.1.1" tslib "~2.0.1" -"@graphql-tools/wrap@^6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-6.2.4.tgz#2709817da6e469753735a9fe038c9e99736b2c57" - integrity sha512-cyQgpybolF9DjL2QNOvTS1WDCT/epgYoiA8/8b3nwv5xmMBQ6/6nYnZwityCZ7njb7MMyk7HBEDNNlP9qNJDcA== +"@graphql-tools/utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-7.0.0.tgz#8af1982b4c55607e02e103230ad926c5f8b89fe2" + integrity sha512-GDTwJVklNDt50/kWilZJ7dSIZzhCy1PH/aB7R+GS4zqyU5LkRJHyqZG1rFxzQkw8WorkvMbct98hcb4U2u1tnw== dependencies: - "@graphql-tools/delegate" "^6.2.4" - "@graphql-tools/schema" "^6.2.4" - "@graphql-tools/utils" "^6.2.4" + "@ardatan/aggregate-error" "0.0.6" + camel-case "4.1.1" + tslib "~2.0.1" + +"@graphql-tools/wrap@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-7.0.0.tgz#f6c02baf3c9374790bb03ee2bee59687f47b1547" + integrity sha512-ugCoTbZ7Ca5ty1ne2BxSTdogASW8H3bdvdc4iPjL7saUPCUC9IJ3jzYciZbLi2H0cy/bULZPHJ2EqCWzmArRPA== + dependencies: + "@graphql-tools/delegate" "^7.0.0" + "@graphql-tools/schema" "^7.0.0" + "@graphql-tools/utils" "^7.0.0" is-promise "4.0.0" tslib "~2.0.1" @@ -1514,20 +1527,20 @@ meow "^7.0.0" prettier "^2.0.5" -"@next/env@9.5.6-canary.12": - version "9.5.6-canary.12" - resolved "https://registry.yarnpkg.com/@next/env/-/env-9.5.6-canary.12.tgz#5680e9f1cfed54d7529086f519352307337f3ea1" - integrity sha512-cZ2ETTduAi+ThD6rk6FNzQWAOI0QRg0De54EqG4+2YFAU/FwWeoVy6c8nkaO1KE3qCVqXEyuat2Q6knA4E/sFA== +"@next/env@9.5.6-canary.14": + version "9.5.6-canary.14" + resolved "https://registry.yarnpkg.com/@next/env/-/env-9.5.6-canary.14.tgz#6dd9ae250531b9649e6f55d340277f7f429b05bd" + integrity sha512-evDDFWN93/vTNlxJhFHvc5Nwp7uf3UtQZGa+D+31LFlGIVZtTP8G6l5U8HDUVkFeL/CD5cDefm6OotQp1W1PvA== -"@next/polyfill-module@9.5.6-canary.12": - version "9.5.6-canary.12" - resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-9.5.6-canary.12.tgz#2ccd053b73ef350d690ecd85446de5ba7c40bcaa" - integrity sha512-2zOZYPJtzlPnObsjD9UEmOygQwvlSzeMGCwklFmH+ioR5ngaA7P4oXtqh8ocYAsjRVbZucJcT9Yn5roPbZfUNQ== +"@next/polyfill-module@9.5.6-canary.14": + version "9.5.6-canary.14" + resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-9.5.6-canary.14.tgz#de851cd2780095156309db45d9e27a85db377621" + integrity sha512-OVOPKfxsi56RPHyXKv/Wrqq2uYbYbwh9kMBskqfNCI05lAoiBaXetABa8JcO2xUO+WM6MPUSmxlyWuN5LLJqXA== -"@next/react-dev-overlay@9.5.6-canary.12": - version "9.5.6-canary.12" - resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-9.5.6-canary.12.tgz#eef065cd2d37e446aef78ffea974fcf9066bcdcd" - integrity sha512-ELQCF4/CX/PygiOa9PD7iCu62PqWrIK3jVj9PuascEhoF8au3N987ElJ7he57MuD6TLNpy5a8G7IxYUEPV55rA== +"@next/react-dev-overlay@9.5.6-canary.14": + version "9.5.6-canary.14" + resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-9.5.6-canary.14.tgz#993fb9ad23b186aa098348a8c156b4f7ba1dda24" + integrity sha512-hPpNDFWBTDQwa1nRMltxpSD0uewkP0jP6CCfGqyVSZugl7N+6VYgdTvM4s/ZZTaL+OKbd2rUdI/U6V7IQVn+4Q== dependencies: "@babel/code-frame" "7.10.4" ally.js "1.4.1" @@ -1540,10 +1553,10 @@ stacktrace-parser "0.1.10" strip-ansi "6.0.0" -"@next/react-refresh-utils@9.5.6-canary.12": - version "9.5.6-canary.12" - resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-9.5.6-canary.12.tgz#f2f0cc30e646af4daefd5d0f50681ac231fbd826" - integrity sha512-jX6JwC8IHzHo1BV2yayPaOnXpM9KWF2/NM1SWTCZlfplBF5Rm1nQTG0WX8MF0CUpLh+DBeXmJ3Xzve/IGLdZmw== +"@next/react-refresh-utils@9.5.6-canary.14": + version "9.5.6-canary.14" + resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-9.5.6-canary.14.tgz#738a20723b6895299132694cfa7bf629fdaeb1fe" + integrity sha512-uZawKMFl0hxzFF2lPGqo80zVj2XQRrlGN+o37XFQt+W0pR8GgLHNk8xikrPNz7dOwW1s7DNSAwujKmDiutc0og== "@nodelib/fs.scandir@2.1.3": version "2.1.3" @@ -2197,6 +2210,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@types/async-retry@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/async-retry/-/async-retry-1.2.1.tgz#fa9ac165907a8ee78f4924f4e393b656c65b5bb4" + integrity sha512-yMQ6CVgICWtyFNBqJT3zqOc+TnqqEPLo4nKJNPFwcialiylil38Ie6q1ENeFTjvaLOkVim9K5LisHgAKJWidGQ== + "@types/bunyan-prettystream@^0.1.31": version "0.1.31" resolved "https://registry.yarnpkg.com/@types/bunyan-prettystream/-/bunyan-prettystream-0.1.31.tgz#3864836abb907ab151f7edf7c64c323c9609e1d1" @@ -2295,15 +2313,32 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.162.tgz#65d78c397e0d883f44afbf1f7ba9867022411470" integrity sha512-alvcho1kRUnnD1Gcl4J+hK0eencvzq9rmzvFPRmP5rPHx9VVsJj6bKLTATPVf9ktgv4ujzh7T+XWKp+jhuODig== +"@types/lru-cache@4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-4.1.1.tgz#b2d87a5e3df8d4b18ca426c5105cd701c2306d40" + integrity sha512-8mNEUG6diOrI6pMqOHrHPDBB1JsrpedeMK9AWGzVCQ7StRRribiT9BRvUmF8aUws9iBbVlgVekOT5Sgzc1MTKw== + "@types/minimist@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= +"@types/node-fetch@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.3.2.tgz#e01893b176c6fa1367743726380d65bce5d6576b" + integrity sha512-yW0EOebSsQme9yKu09XbdDfle4/SmWZMK4dfteWcSLCYNQQcF+YOv0kIrvm+9pO11/ghA4E6A+RNQqvYj4Nr3A== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@^14.11.2": - version "14.14.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.0.tgz#f1091b6ad5de18e8e91bdbd43ec63f13de372538" - integrity sha512-BfbIHP9IapdupGhq/hc+jT5dyiBVZ2DdeC5WwJWQWDb0GijQlzUFAeIQn/2GtvZcd2HVUU7An8felIICFTC2qg== + version "14.14.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.2.tgz#d25295f9e4ca5989a2c610754dc02a9721235eeb" + integrity sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg== + +"@types/node@10.12.18": + version "10.12.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" + integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -2342,6 +2377,33 @@ dependencies: "@types/node" "*" +"@vercel/fetch-cached-dns@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@vercel/fetch-cached-dns/-/fetch-cached-dns-2.0.1.tgz#b929ba5b4b6f7108abf49adaf03309159047c134" + integrity sha512-4a2IoekfGUgV/dinAB7Tx5oqA+Pg9I/6x/t8n/yduHmdclP5EdWTN4gPrwOKVECKVn2pV1VxAT8q4toSzwa2Eg== + dependencies: + "@types/node-fetch" "2.3.2" + "@zeit/dns-cached-resolve" "2.1.0" + +"@vercel/fetch-retry@^5.0.2": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@vercel/fetch-retry/-/fetch-retry-5.0.3.tgz#cce5d23f6e64f6f525c24e2ac7c78f65d6c5b1f4" + integrity sha512-DIIoBY92r+sQ6iHSf5WjKiYvkdsDIMPWKYATlE0KcUAj2RV6SZK9UWpUzBRKsofXqedOqpVjrI0IE6AWL7JRtg== + dependencies: + async-retry "^1.3.1" + debug "^3.1.0" + +"@vercel/fetch@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@vercel/fetch/-/fetch-6.1.0.tgz#4959cd264d25e811b46491818a9d9ca5d752a2a9" + integrity sha512-xR0GQggKhPvwEWrqcrobsQFjyR/bDDbX24BkSaRyLzW+8SydKhkBc/mBCUV8h4SBZSlJMJnqhrxjFCZ1uJcqNg== + dependencies: + "@types/async-retry" "1.2.1" + "@vercel/fetch-cached-dns" "^2.0.1" + "@vercel/fetch-retry" "^5.0.2" + agentkeepalive "3.4.1" + debug "3.1.0" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -2497,6 +2559,17 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@zeit/dns-cached-resolve@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@zeit/dns-cached-resolve/-/dns-cached-resolve-2.1.0.tgz#78583010df1683fdb7b05949b75593c9a8641bc1" + integrity sha512-KD2zyRZEBNs9PJ3/ob7zx0CvR4wM0oV4G5s5gFfPwmM74GpFbUN2pAAivP2AXnUrJ14Nkh8NumNKOzOyc4LbFQ== + dependencies: + "@types/async-retry" "1.2.1" + "@types/lru-cache" "4.1.1" + "@types/node" "10.12.18" + async-retry "1.2.3" + lru-cache "5.1.1" + abort-controller@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -2523,7 +2596,7 @@ acorn@^7.0.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.3: +acorn@^8.0.4: version "8.0.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ== @@ -2537,12 +2610,19 @@ adjust-sourcemap-loader@3.0.0: regex-parser "^2.2.11" agent-base@6: - version "6.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" - integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" +agentkeepalive@3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c" + integrity sha512-MPIwsZU9PP9kOrZpyu2042kYA8Fdt/AedQYkYXucHgF9QoD9dXVp0ypuGnHXSR0hTstBxdt85Xkh4JolYfK5wg== + dependencies: + humanize-ms "^1.2.1" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2574,11 +2654,6 @@ ally.js@1.4.1: css.escape "^1.5.0" platform "1.3.3" -animate.css@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/animate.css/-/animate.css-4.1.1.tgz#614ec5a81131d7e4dc362a58143f7406abd68075" - integrity sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ== - anser@1.4.9: version "1.4.9" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" @@ -2724,6 +2799,20 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-retry@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.3.tgz#a6521f338358d322b1a0012b79030c6f411d1ce0" + integrity sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q== + dependencies: + retry "0.12.0" + +async-retry@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" + integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== + dependencies: + retry "0.12.0" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2840,7 +2929,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.0.2: +base64-js@^1.0.2, base64-js@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== @@ -2975,7 +3064,7 @@ browserslist@4.13.0: escalade "^3.0.1" node-releases "^1.1.58" -browserslist@^4.12.0, browserslist@^4.14.3, browserslist@^4.6.4, browserslist@^4.8.5: +browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.6.4, browserslist@^4.8.5: version "4.14.5" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== @@ -3007,7 +3096,7 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= -buffer@5.6.0, buffer@^5.5.0: +buffer@5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== @@ -3015,6 +3104,14 @@ buffer@5.6.0, buffer@^5.5.0: base64-js "^1.0.2" ieee754 "^1.1.4" +buffer@^5.5.0: + version "5.6.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.1.tgz#b99419405f4290a7a1f20b51037cee9f1fbd7f6a" + integrity sha512-2z15UUHpS9/3tk9mY/q+Rl3rydOi7yMp5XWNQnRvoz+mJwiv8brqYwp9a+nOCtma6dwuEIxljD8W3ysVBZ05Vg== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + bufferutil@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" @@ -3116,9 +3213,9 @@ camelcase@^6.0.0: integrity sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ== caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001113, caniuse-lite@^1.0.30001135: - version "1.0.30001148" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001148.tgz#dc97c7ed918ab33bf8706ddd5e387287e015d637" - integrity sha512-E66qcd0KMKZHNJQt9hiLZGE3J4zuTqE1OnU53miEVtylFbwOEmeA5OsRu90noZful+XGSQOni1aT2tiqu/9yYw== + version "1.0.30001151" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz#1ddfde5e6fff02aad7940b4edb7d3ac76b0cb00b" + integrity sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw== caseless@~0.12.0: version "0.12.0" @@ -3602,9 +3699,9 @@ cssnano-simple@1.2.0: postcss "^7.0.32" csstype@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8" - integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag== + version "3.0.4" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.4.tgz#b156d7be03b84ff425c9a0a4b1e5f4da9c5ca888" + integrity sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA== d@1, d@^1.0.1: version "1.0.1" @@ -3648,6 +3745,13 @@ debounce@^1.2.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + debug@4, debug@^4.1.0, debug@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" @@ -3662,6 +3766,13 @@ debug@^2.2.0: dependencies: ms "2.0.0" +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -3897,9 +4008,9 @@ ecdsa-sig-formatter@1.0.11: safe-buffer "^5.0.1" electron-to-chromium@^1.3.488, electron-to-chromium@^1.3.571: - version "1.3.582" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz#1adfac5affce84d85b3d7b3dfbc4ade293a6ffc4" - integrity sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww== + version "1.3.583" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.583.tgz#47a9fde74740b1205dba96db2e433132964ba3ee" + integrity sha512-L9BwLwJohjZW9mQESI79HRzhicPk1DFgM+8hOCfGgGCFEcA3Otpv7QK6SGtYoZvfQfE3wKLh0Hd5ptqUFv3gvQ== elegant-spinner@^1.0.1: version "1.0.1" @@ -3919,6 +4030,11 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +email-validator@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" + integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -3948,10 +4064,10 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.3.0.tgz#14be504e14ad58e9821a311ea6a9037c716786d9" - integrity sha512-EENz3E701+77g0wfbOITeI8WLPNso2kQNMBIBEi/TH/BEa9YXtS01X7sIEk5XXsfFq1jNkhIpu08hBPH1TRLIQ== +enhanced-resolve@^5.3.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz#3f988d0d7775bdc2d96ede321dc81f8249492f57" + integrity sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w== dependencies: graceful-fs "^4.2.4" tapable "^2.0.0" @@ -3968,7 +4084,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: +es-abstract@^1.17.0-next.1: version "1.17.7" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== @@ -3985,7 +4101,7 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-abstract@^1.18.0-next.0: +es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: version "1.18.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== @@ -4048,7 +4164,7 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-scope@^5.1.0: +eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -4462,7 +4578,7 @@ graphql-config@^3.0.2: string-env-interpolation "1.0.1" tslib "^2.0.0" -graphql-request@^3.1.0: +graphql-request@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-3.2.0.tgz#d356bbea6dc496ab7969aa0892a0ba9ac938a347" integrity sha512-s4zIfQsDkGUv5ECCkGq55Png7hJjFBV7PMIadB403VDaXv0T1RThPSRgZM1hiKgB420rOItkR5BDQ3vPvaAWqw== @@ -4620,6 +4736,13 @@ https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0: agent-base "6" debug "4" +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -4641,7 +4764,7 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -ieee754@^1.1.4: +ieee754@^1.1.13, ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== @@ -4733,6 +4856,11 @@ inquirer@^7.3.3: strip-ansi "^6.0.0" through "^2.3.6" +intersection-observer@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.11.0.tgz#f4ea067070326f68393ee161cc0a2ca4c0040c6f" + integrity sha512-KZArj2QVnmdud9zTpKf279m2bbGfG+4/kn16UU0NL3pTVl52ZHiJ9IRNSsnn6jaHrL9EGLFM5eWjTx2fz/+zoQ== + intl-messageformat-parser@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz#b43d45a97468cadbe44331d74bb1e8dea44fc075" @@ -4944,10 +5072,10 @@ jest-worker@24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" -jest-worker@^26.5.0: - version "26.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.5.0.tgz#87deee86dbbc5f98d9919e0dadf2c40e3152fa30" - integrity sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug== +jest-worker@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.1.tgz#c2ae8cde6802cc14056043f997469ec170d9c32a" + integrity sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw== dependencies: "@types/node" "*" merge-stream "^2.0.0" @@ -5114,11 +5242,6 @@ keen-slider@^5.2.4: resolved "https://registry.yarnpkg.com/keen-slider/-/keen-slider-5.2.4.tgz#9e2a889c63c02a651c81caa438f3691e9a3bc0a8" integrity sha512-z39afyASW63B+1FzWGzBkvXAnzJl3gAD8M+32TmhJAPJqjckCaKYm7YBjpSba04AoVMQw8y9U1LVcUucVVIQkQ== -keycode@^2.1.7: - version "2.2.0" - resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" - integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= - keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -5312,6 +5435,11 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + lodash.toarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" @@ -5369,6 +5497,13 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@6.0.0, lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -5598,7 +5733,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.2, ms@^2.1.1: +ms@2.1.2, ms@^2.0.0, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -5623,9 +5758,9 @@ nan@^2.14.0: integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== nanoid@^3.1.12: - version "3.1.12" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" - integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== + version "3.1.15" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.15.tgz#28e7c4ce56aff2d0c2d37814c7aef9d6c5b3e6f3" + integrity sha512-n8rXUZ8UU3lV6+43atPrSizqzh25n1/f00Wx1sCiE7R1sSHytZLTTiQl8DjC4IDLOnEZDlgJhy0yO4VsIpMxow== napi-build-utils@^1.0.1: version "1.0.2" @@ -5655,9 +5790,9 @@ neo-async@^2.6.2: integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-seo@^4.11.0: - version "4.13.0" - resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-4.13.0.tgz#db04ffff9cea375a6801f748572239b27daea471" - integrity sha512-y8r5rny7vp8UjqWt3J/rCIexVvG8djN5YqXEpRClzd9IDKSBAgXZUMY58G4WTHa5fW4OyX+StDx82ZObB7qc4Q== + version "4.14.0" + resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-4.14.0.tgz#8a3243286f65606da81f6fdb0f8b1673ab5dd5a6" + integrity sha512-HHL82n2bx1Aj0z8kpy31LoJxzWpZwC/RlXleoO5zNNjJjEGtNS7uZ+wrvAbFGUqC4V54I1sZa4f0WZV+mpOx6w== next-themes@^0.0.4: version "0.0.4" @@ -5669,10 +5804,10 @@ next-tick@~1.0.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= -next@^9.5.6-canary.12: - version "9.5.6-canary.12" - resolved "https://registry.yarnpkg.com/next/-/next-9.5.6-canary.12.tgz#84c8c3202ae09b0fe2ca12254931eb43501b5aee" - integrity sha512-JkOoQnMmJw/so0A3WnYSw3/XOnVGg/unUGcYsDBme0mkX8d9ooO/xC7QI01V3BW9A62txusoFMUxFjFrymGDiQ== +next@^9.5.6-canary.14: + version "9.5.6-canary.14" + resolved "https://registry.yarnpkg.com/next/-/next-9.5.6-canary.14.tgz#13f0496199589ed40880f6c4ef97f14bfdbd8996" + integrity sha512-uUcWxznWWMjNBA9fqJ82avTuVe7Rud0/129oRZRsQX+VH5qqhxeBbupEfzP65AihyLD+X5olGZQ2SsmqWqubJQ== dependencies: "@ampproject/toolbox-optimizer" "2.7.0-alpha.1" "@babel/code-frame" "7.10.4" @@ -5693,10 +5828,10 @@ next@^9.5.6-canary.12: "@babel/runtime" "7.11.2" "@babel/types" "7.11.5" "@hapi/accept" "5.0.1" - "@next/env" "9.5.6-canary.12" - "@next/polyfill-module" "9.5.6-canary.12" - "@next/react-dev-overlay" "9.5.6-canary.12" - "@next/react-refresh-utils" "9.5.6-canary.12" + "@next/env" "9.5.6-canary.14" + "@next/polyfill-module" "9.5.6-canary.14" + "@next/react-dev-overlay" "9.5.6-canary.14" + "@next/react-refresh-utils" "9.5.6-canary.14" ast-types "0.13.2" babel-plugin-transform-define "2.0.0" babel-plugin-transform-react-remove-prop-types "0.4.24" @@ -5727,8 +5862,8 @@ next@^9.5.6-canary.12: schema-utils "2.7.1" stream-browserify "3.0.0" style-loader "1.2.1" - styled-jsx "3.3.0" - use-subscription "1.4.1" + styled-jsx "3.3.1" + use-subscription "1.5.0" vm-browserify "1.1.2" watchpack "2.0.0-beta.13" web-vitals "0.2.4" @@ -5737,13 +5872,6 @@ next@^9.5.6-canary.12: optionalDependencies: sharp "0.26.2" -nextjs-progressbar@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/nextjs-progressbar/-/nextjs-progressbar-0.0.6.tgz#d1841df42f2342807dc6f7ad1034ddb8ec8541d4" - integrity sha512-9sxNpUSHOnmRV8/3yEZ9NV5c/ip2CpQ7jim3EOOZp49qIHrgNxmy/kzoulNjt50AlA7pAu/8rwgC2WpzmSMrdg== - dependencies: - nprogress "^0.2.0" - no-case@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" @@ -5868,11 +5996,6 @@ npmlog@^4.0.1, npmlog@^4.1.2: gauge "~2.7.3" set-blocking "~2.0.0" -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" - integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= - nullthrows@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" @@ -6628,7 +6751,7 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@15.7.2, prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.2: +prop-types@15.7.2, prop-types@^15.6.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -6757,21 +6880,10 @@ react-dom@^16.14.0: prop-types "^15.6.2" scheduler "^0.19.1" -react-event-listener@^0.6.0: - version "0.6.6" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" - integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== - dependencies: - "@babel/runtime" "^7.2.0" - prop-types "^15.6.0" - warning "^4.0.1" - -react-icons@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-3.11.0.tgz#2ca2903dfab8268ca18ebd8cc2e879921ec3b254" - integrity sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q== - dependencies: - camelcase "^5.0.0" +react-intersection-observer@^8.29.1: + version "8.29.1" + resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-8.29.1.tgz#8c6f494ca81b39aee9f509f12d29443fc66a2256" + integrity sha512-JLxJ4V0L73ailfvbYQ2/lfAyirtud1WsRsYnzHyVLMfQff1AIG1lWdC5XaGSK4yb9jZHVbbNsrVIO3PJm03koQ== react-is@16.13.1, react-is@^16.8.1: version "16.13.1" @@ -6788,57 +6900,6 @@ react-refresh@0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== -react-swipeable-views-core@^0.13.7: - version "0.13.7" - resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.13.7.tgz#c082b553f26e83fd20fc17f934200eb717023c8a" - integrity sha512-ekn9oDYfBt0oqJSGGwLEhKvn+QaqMGTy//9dURTLf+vp7W5j6GvmKryYdnwJCDITaPFI2hujXV4CH9krhvaE5w== - dependencies: - "@babel/runtime" "7.0.0" - warning "^4.0.1" - -react-swipeable-views-core@^0.14.0-alpha.0: - version "0.14.0-alpha.0" - resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.14.0-alpha.0.tgz#1c40dd1c328c97048a8f2cb9de504ee611ae21dd" - integrity sha512-TQm58RJv01EseBfaeY0kZUIBmhs1NyKXwhJL52iN/UlzbQSiaIE2kk+mSGicUriBK0H7UlScgLeJR91AJ7SVcA== - dependencies: - "@babel/runtime" "7.0.0" - warning "^4.0.1" - -react-swipeable-views-utils@^0.13.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.9.tgz#a66e98f2f4502d8b00182901f80d13b2f903e10f" - integrity sha512-QLGxRKrbJCbWz94vkWLzb1Daaa2Y/TZKmsNKQ6WSNrS+chrlfZ3z9tqZ7YUJlW6pRWp3QZdLSY3UE3cN0TXXmw== - dependencies: - "@babel/runtime" "7.0.0" - keycode "^2.1.7" - prop-types "^15.6.0" - react-event-listener "^0.6.0" - react-swipeable-views-core "^0.13.7" - shallow-equal "^1.2.1" - -react-swipeable-views-utils@^0.14.0-alpha.0: - version "0.14.0-alpha.0" - resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.14.0-alpha.0.tgz#1bc91cf89d13417a0ca8edc11b4a2c55c4a889b9" - integrity sha512-Ya9Xtr4uE1CYxyrPwtcImzcZFcOr3PP51kRgIOTx3Dx9SF31OtF0t2CgXuypTYTs7G4StRE3NzWlvSBiMZSVtQ== - dependencies: - "@babel/runtime" "7.0.0" - keycode "^2.1.7" - prop-types "^15.6.0" - react-event-listener "^0.6.0" - react-swipeable-views-core "^0.14.0-alpha.0" - shallow-equal "^1.2.1" - -react-swipeable-views@^0.13.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.9.tgz#d6a6c508bf5288ad55509f9c65916db5df0f2cec" - integrity sha512-WXC2FKYvZ9QdJ31v9LjEJEl1bA7E4AcaloTkbW0uU0dYf5uvv4aOpiyxubvOkVl1a5L2UAHmKSif4TmJ9usrSg== - dependencies: - "@babel/runtime" "7.0.0" - prop-types "^15.5.4" - react-swipeable-views-core "^0.13.7" - react-swipeable-views-utils "^0.13.9" - warning "^4.0.1" - react-ticker@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/react-ticker/-/react-ticker-1.2.2.tgz#12cda5ff8266c6fe90ffcd8c58e12ba1596ddf24" @@ -6943,11 +7004,6 @@ regenerate@^1.4.0: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== -regenerator-runtime@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" - integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== - regenerator-runtime@^0.13.4: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" @@ -7151,6 +7207,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -7315,11 +7376,6 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shallow-equal@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" - integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== - sharp@0.26.2: version "0.26.2" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.26.2.tgz#3d5777d246ae32890afe82a783c1cbb98456a88c" @@ -7546,20 +7602,20 @@ string-width@^4.1.0, string-width@^4.2.0: strip-ansi "^6.0.0" string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" + integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" + integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" string_decoder@^1.1.1: version "1.3.0" @@ -7616,10 +7672,10 @@ style-loader@1.2.1: loader-utils "^2.0.0" schema-utils "^2.6.6" -styled-jsx@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.0.tgz#32335c1a3ecfc923ba4f9c056eeb3d4699006b09" - integrity sha512-sh8BI5eGKyJlwL4kNXHjb27/a/GJV8wP4ElRIkRXrGW3sHKOsY9Pa1VZRNxyvf3+lisdPwizD9JDkzVO9uGwZw== +styled-jsx@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.1.tgz#d79f306c42c99cefbe8e76f35dad8100dc5c9ecc" + integrity sha512-RhW71t3k95E3g7Zq3lEBk+kmf+p4ZME7c5tfsYf9M5mq6CgIvFXkbvhawL2gWriXLRlMyKAYACE89Qa2JnTqUw== dependencies: "@babel/types" "7.8.3" babel-plugin-syntax-jsx "6.18.0" @@ -7690,9 +7746,9 @@ symbol-observable@^1.0.4, symbol-observable@^1.1.0: integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== tailwindcss@^1.9: - version "1.9.5" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.9.5.tgz#3339b790a68bc1f09a8efd8eb94cb05aed5235c2" - integrity sha512-Je5t1fAfyW333YTpSxF+8uJwbnrkpyBskDtZYgSMMKQbNp6QUhEKJ4g/JIevZjD2Zidz9VxLraEUq/yWOx6nQg== + version "1.9.6" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.9.6.tgz#0c5089911d24e1e98e592a31bfdb3d8f34ecf1a0" + integrity sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ== dependencies: "@fullhuman/postcss-purgecss" "^2.1.2" autoprefixer "^9.4.5" @@ -7756,16 +7812,16 @@ tar@^6.0.2: yallist "^4.0.0" terser-webpack-plugin@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.0.0.tgz#88f58d27d1c8244965c59540d3ccda1598fc958c" - integrity sha512-rf7l5a9xamIVX3enQeTl0MY2MNeZClo5yPX/tVPy22oY0nzu0b45h7JqyFi/bygqKWtzXMnml0u12mArhQPsBQ== + version "5.0.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.0.1.tgz#b1f02e43d93ca61a0bdd9e870f4e3489e12a6c9b" + integrity sha512-EwUe+XDTFf/2cAlmAlZZ7vRpNKMZUAypX2kIRm0Fmjlz4l7SqbI/VabmgiesNZW2nq/LR0N7ku/wlTQ6ygen0w== dependencies: - jest-worker "^26.5.0" + jest-worker "^26.6.1" p-limit "^3.0.2" schema-utils "^3.0.0" serialize-javascript "^5.0.1" source-map "^0.6.1" - terser "^5.3.5" + terser "^5.3.8" terser@5.1.0: version "5.1.0" @@ -7776,10 +7832,10 @@ terser@5.1.0: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.3.5: - version "5.3.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.7.tgz#798a4ae2e7ff67050c3e99fcc4e00725827d97e2" - integrity sha512-lJbKdfxWvjpV330U4PBZStCT9h3N9A4zZVA5Y4k9sCWXknrpdyxi1oMsRKLmQ/YDMDxSBKIh88v0SkdhdqX06w== +terser@^5.3.8: + version "5.3.8" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.8.tgz#991ae8ba21a3d990579b54aa9af11586197a75dd" + integrity sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -8013,10 +8069,10 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -use-subscription@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.4.1.tgz#edcbcc220f1adb2dd4fa0b2f61b6cc308e620069" - integrity sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ== +use-subscription@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.0.tgz#0df66fdf97b9a340147ad72f76fac1db6f56d240" + integrity sha512-/FVRiB2I7NDjzWoNBYPt6YkkvleMm/lFtxj1hH6nX2TVrJ/5UTbovw9OE1efv2Zl0HoAYuTjM7zHd9OsABn5sg== dependencies: object-assign "^4.1.1" @@ -8072,13 +8128,6 @@ vue-template-compiler@^2.6.12: de-indent "^1.0.2" he "^1.1.0" -warning@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - watchpack@2.0.0-beta.13: version "2.0.0-beta.13" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0-beta.13.tgz#9d9b0c094b8402139333e04eb6194643c8384f55" @@ -8122,9 +8171,9 @@ webpack-sources@^2.0.1: source-map "^0.6.1" webpack@4.44.1, webpack@^5.0.0-beta.30: - version "5.1.3" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.1.3.tgz#a6e4fd250ef2513f94844ae5d8f7570215a2ac49" - integrity sha512-bNBF5EOpt5a6NeCBFu0+8KJtG61cVmOb2b/a5tPNRLz3OWgDpHMbmnDkaSm3nf/UQ6ufw4PWYGVsVOAi8UfL2A== + version "5.2.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.2.0.tgz#02f22466b79751a80a50f20f027a716e296b3ef5" + integrity sha512-evtOjOJQq3zaHJIWsJjM4TGtNHtSrNVAIyQ+tdPW/fRd+4PLGbUG6S3xt+N4+QwDBOaCVd0xCWiHd4R6lWO5DQ== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.45" @@ -8132,11 +8181,11 @@ webpack@4.44.1, webpack@^5.0.0-beta.30: "@webassemblyjs/helper-module-context" "1.9.0" "@webassemblyjs/wasm-edit" "1.9.0" "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^8.0.3" - browserslist "^4.14.3" + acorn "^8.0.4" + browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.2.0" - eslint-scope "^5.1.0" + enhanced-resolve "^5.3.0" + eslint-scope "^5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.4" @@ -8252,6 +8301,11 @@ yaeti@^0.0.6: resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"