From 6a7c5ba69126a42d0df3104e6527d20440550548 Mon Sep 17 00:00:00 2001 From: Daniel Dyrnes Date: Mon, 11 Apr 2022 15:01:49 +0900 Subject: [PATCH] Major changes to UI --- .gitignore | 3 + components/Button.tsx | 2 +- components/Category.tsx | 18 ++ components/DailySpendCard.tsx | 73 ------ components/Dropdown.tsx | 40 ---- components/DropdownToggle.tsx | 24 -- components/EmojiPicker.tsx | 27 +++ components/Footer.tsx | 24 -- components/Input.tsx | 11 +- components/MobileNavbar.tsx | 115 +++++++--- components/NewTransaction.tsx | 135 ----------- components/RecentTransactions.tsx | 50 +++- components/Sidebar.tsx | 50 ---- components/TotalSpendCard.tsx | 69 ------ components/Transaction.tsx | 4 +- components/TransactionsCountCard.tsx | 67 ------ forms/CategoryForm.tsx | 90 +++----- forms/GeneralSettingsForm.tsx | 120 ---------- forms/NewTransactionForm.tsx | 125 ---------- forms/SigninForm.tsx | 53 ----- forms/TransactionForm.tsx | 96 ++++++++ next.config.js | 19 +- package.json | 8 +- pages/_error.jsx | 65 ++++++ pages/account/categories.tsx | 77 +++++++ pages/account/index.tsx | 33 +++ pages/account/settings.tsx | 25 ++ pages/analytics.tsx | 7 + pages/index.tsx | 2 + pages/transactions.tsx | 12 + public/img/avatar.jpeg | Bin 0 -> 1848 bytes sentry.client.config.js | 17 ++ sentry.properties | 4 + sentry.server.config.js | 17 ++ yarn.lock | 327 +++++++++++++++++++++++++-- 35 files changed, 907 insertions(+), 902 deletions(-) create mode 100644 components/Category.tsx delete mode 100644 components/DailySpendCard.tsx delete mode 100644 components/Dropdown.tsx delete mode 100644 components/DropdownToggle.tsx create mode 100644 components/EmojiPicker.tsx delete mode 100644 components/Footer.tsx delete mode 100644 components/NewTransaction.tsx delete mode 100644 components/Sidebar.tsx delete mode 100644 components/TotalSpendCard.tsx delete mode 100644 components/TransactionsCountCard.tsx delete mode 100644 forms/GeneralSettingsForm.tsx delete mode 100644 forms/NewTransactionForm.tsx delete mode 100644 forms/SigninForm.tsx create mode 100644 forms/TransactionForm.tsx create mode 100644 pages/_error.jsx create mode 100644 pages/account/categories.tsx create mode 100644 pages/account/index.tsx create mode 100644 pages/account/settings.tsx create mode 100644 pages/analytics.tsx create mode 100644 pages/transactions.tsx create mode 100644 public/img/avatar.jpeg create mode 100644 sentry.client.config.js create mode 100644 sentry.properties create mode 100644 sentry.server.config.js diff --git a/.gitignore b/.gitignore index 1437c53..d385e20 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,6 @@ yarn-error.log* # vercel .vercel + +# Sentry +.sentryclirc diff --git a/components/Button.tsx b/components/Button.tsx index 62473ef..2461d69 100644 --- a/components/Button.tsx +++ b/components/Button.tsx @@ -2,7 +2,7 @@ import React, { MouseEventHandler } from "react"; export interface ButtonProps { type: "button" | "submit" | "reset"; - onClick: MouseEventHandler; + onClick?: MouseEventHandler; className?: string; } diff --git a/components/Category.tsx b/components/Category.tsx new file mode 100644 index 0000000..5f5c48b --- /dev/null +++ b/components/Category.tsx @@ -0,0 +1,18 @@ +import React, { memo } from "react"; + +export interface CategoryProps { + id: string; + name: string; + icon: string | React.ReactElement; +} + +const Category: React.FC = (props) => { + return ( +
+ {props.icon} +

{props.name}

+
+ ); +}; + +export default memo(Category); diff --git a/components/DailySpendCard.tsx b/components/DailySpendCard.tsx deleted file mode 100644 index 22d1109..0000000 --- a/components/DailySpendCard.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { memo } from "react"; -import { useIntl } from "react-intl"; -import { gql, useQuery } from "@apollo/client"; -import { DateTime } from "luxon"; - -const GET_AMOUNT_MAX = gql` - query totalTransactionsSum($from: DateTime!) { - aggregateTransaction( - filter: { and: { when: { ge: $from }, type: { eq: EXPENSE } } } - ) { - amountSum - } - } -`; - -const DailySpendCard: React.FC = () => { - const intl = useIntl(); - - const { loading, error, data } = useQuery(GET_AMOUNT_MAX, { - variables: { from: DateTime.local().startOf("month").toString() }, - }); - if (error) { - console.error(error); - } - - const days = Math.ceil( - DateTime.local().diff(DateTime.local().startOf("month"), ["days"]).days - ); - - const getAmount = (): number => { - if ( - data && - data.aggregateTransaction && - data.aggregateTransaction.amountSum - ) { - return Math.ceil(data.aggregateTransaction.amountSum / days); - } - return 0; - }; - - return ( -
-
-
-
-
- {intl.formatMessage({ - defaultMessage: "Loading...", - description: "default loading", - })} -
-
- {intl.formatMessage( - { - defaultMessage: "{amount} $", - description: "monetary amount readout", - }, - { - amount: intl.formatNumber(getAmount()), - } - )} -
-
-
- -
-
-
-
- ); -}; - -export default memo(DailySpendCard); diff --git a/components/Dropdown.tsx b/components/Dropdown.tsx deleted file mode 100644 index 11e8090..0000000 --- a/components/Dropdown.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { FieldInputProps } from "formik"; -import { classNames } from "../utils"; - -export interface InputProps { - name: string; - touched: { [key: string]: boolean }; - errors: { [key: string]: string }; - label?: string; - disabled?: boolean; - readOnly?: boolean; -} - -const Dropdown: React.FC> = (props) => { - const hasError = (): boolean => { - if (props.touched && props.touched[props.name] === true) { - if (props.errors && props.errors[props.name]) { - return true; - } - } - return false; - }; - - return ( -
- {props.label && ( - - )} - - {hasError() && ( -
{props.errors[props.name]}
- )} -
- ); -}; - -export default Dropdown; diff --git a/components/DropdownToggle.tsx b/components/DropdownToggle.tsx deleted file mode 100644 index 9dc737a..0000000 --- a/components/DropdownToggle.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from "react"; - -// eslint-disable-next-line react/display-name -const DropdownToggle = React.forwardRef( - ({ children, onClick, className }: any, ref: any) => ( - { - e.preventDefault(); - onClick(e); - }} - > - {children} - - ) -); - -export default DropdownToggle; diff --git a/components/EmojiPicker.tsx b/components/EmojiPicker.tsx new file mode 100644 index 0000000..fdec410 --- /dev/null +++ b/components/EmojiPicker.tsx @@ -0,0 +1,27 @@ +import React from "react"; +import { useField } from "formik"; +import Picker, { IEmojiData } from "emoji-picker-react"; + +export interface EmojiPickerProps { + name: string; +} + +const EmojiPicker: React.FC = (props) => { + const [field, meta, helpers] = useField(props.name); + + const onSelect = ( + event: React.MouseEvent, + data: IEmojiData + ) => { + console.log(data); + helpers.setValue(data.emoji); + }; + + return ( +
+ +
+ ); +}; + +export default EmojiPicker; diff --git a/components/Footer.tsx b/components/Footer.tsx deleted file mode 100644 index 1526b5d..0000000 --- a/components/Footer.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useContext } from "react"; -import UserContext from "contexts/User"; - -const Footer: React.FC = () => { - const user = useContext(UserContext); - - const getYear = () => new Date().getFullYear(); - - if (!user) { - return null; - } - - return ( -
-
-
- Copyright © Ikura {getYear} -
-
-
- ); -}; - -export default Footer; diff --git a/components/Input.tsx b/components/Input.tsx index 196f348..cc0b31c 100644 --- a/components/Input.tsx +++ b/components/Input.tsx @@ -1,3 +1,4 @@ +import { Fragment } from "react"; import { FieldInputProps } from "formik"; import { classNames, fieldHasError } from "utils"; @@ -17,15 +18,17 @@ export interface InputProps { const Input: React.FC> = (props) => { return ( -
+ {props.label && ( -
+ ); }; diff --git a/components/MobileNavbar.tsx b/components/MobileNavbar.tsx index 5a1efb9..5ba85e6 100644 --- a/components/MobileNavbar.tsx +++ b/components/MobileNavbar.tsx @@ -1,39 +1,92 @@ -import React from "react"; +import React, { Fragment, useState } from "react"; import Link from "next/link"; -import { House, Add } from "@mui/icons-material"; +import { useRouter } from "next/router"; +import classNames from "classnames"; +import { gql, useMutation } from "@apollo/client"; +import { Dialog } from "@headlessui/react"; +import { + House, + TableRows, + Insights, + AccountCircle, + Add, +} from "@mui/icons-material"; +import TransactionForm, { TransactionFormValues } from "forms/TransactionForm"; + +const ADD_TRANSACTION = gql` + mutation AddTransaction($input: TransactionInput!) { + addTransaction(input: $input) { + id + } + } +`; const MobileNavbar: React.FC = () => { + const { pathname } = useRouter(); + const [addTransaction] = useMutation(ADD_TRANSACTION, {}); + + const [open, setOpen] = useState(false); + + const onNewTransaction = async (values: TransactionFormValues) => { + console.log(values); + }; + return ( -
-
- - - - - - - - - - - - - - - - - - - - - + +
+
+ + + + + + + + + + + + + + + + + + + + + +
-
+ setOpen(false)}> + +
+ +
+
+ ); }; diff --git a/components/NewTransaction.tsx b/components/NewTransaction.tsx deleted file mode 100644 index 69a7ae2..0000000 --- a/components/NewTransaction.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { useContext } from "react"; -import { useRouter } from "next/router"; -import { useIntl } from "react-intl"; -import { gql, useMutation, useQuery } from "@apollo/client"; -import { DateTime } from "luxon"; -import { Modal } from "react-bootstrap"; -import { FormikHelpers } from "formik"; -import { getTitleLang } from "utils"; -import UserContext from "contexts/User"; -import NewTransactionForm, { - NewTransactionFormValues, -} from "forms/NewTransactionForm"; - -const ADD_TRANSACTION_MUTATION = gql` - mutation addTransaction( - $user: UserRef! - $type: TransactionType! - $amount: Float! - $when: DateTime! - $category: CategoryRef! - ) { - addTransaction( - input: { - user: $user - type: $type - amount: $amount - when: $when - category: $category - } - ) { - transaction { - id - } - } - } -`; - -const GET_CATEGORIES_QUERY = gql` - query allCategories { - queryCategory(order: { desc: createdAt }) { - id - type - title - titleLangEn - titleLangJa - } - } -`; - -export interface NewTransactionProps { - show: boolean; - onHide: (arg: boolean) => void; -} - -const NewTransaction: React.FC = (props) => { - const intl = useIntl(); - const { locale } = useRouter(); - const user = useContext(UserContext); - - const [addTransaction] = useMutation(ADD_TRANSACTION_MUTATION); - const categories = useQuery(GET_CATEGORIES_QUERY); - - if (categories.error) { - console.error(categories.error); - return

Something whent wrong

; - } - - const onSubmit = async ( - values: NewTransactionFormValues, - { setSubmitting }: FormikHelpers - ) => { - try { - await addTransaction({ - variables: { - user: { - id: user?.uid, - }, - type: "EXPENSE", - amount: Number(values.amount), - when: DateTime.fromISO(values.when), - category: { - id: values.category, - }, - }, - refetchQueries: [ - "totalTransactionsSum", - "recentTransactionsTable", - "transactionsCount", - ], - }); - // analytics.logEvent("add_transaction"); - setSubmitting(false); - props.onHide(false); - } catch (err) { - console.error(err); - } - }; - - const getCategories = () => { - if (categories && categories.data && categories.data.queryCategory) { - return categories.data.queryCategory.map((category: any) => { - const title = - category.type === "DEFAULT" - ? getTitleLang(locale, category) - : category.title; - return { ...category, title }; - }); - } - return []; - }; - - return ( - props.onHide(false)} - backdrop="static" - keyboard - > -
-
Reigster Expense
-
- props.onHide(false)} - initialValues={{ amount: "" }} - loading={categories.loading} - categories={getCategories()} - /> -
-
-
- ); -}; - -export default NewTransaction; diff --git a/components/RecentTransactions.tsx b/components/RecentTransactions.tsx index f9fce89..911432c 100644 --- a/components/RecentTransactions.tsx +++ b/components/RecentTransactions.tsx @@ -1,9 +1,28 @@ -import React from "react"; +import React, { Fragment } from "react"; +import Link from "next/link"; import { useIntl } from "react-intl"; +import { toast } from "react-hot-toast"; +import { gql, useQuery } from "@apollo/client"; import Transaction from "components/Transaction"; +import Loading from "components/Loading"; + +const TRANSACTIONS_QUERY = gql` + query RecentTransactions { + queryTransaction { + id + amount + date + } + } +`; const RecentTransactions: React.FC = () => { const intl = useIntl(); + const { data, loading, error } = useQuery(TRANSACTIONS_QUERY); + if (error) { + console.error(error); + toast.error(error.message); + } return (
@@ -11,14 +30,29 @@ const RecentTransactions: React.FC = () => {

{intl.formatMessage({ defaultMessage: "Recent Transactions" })}

- -
- + {loading ? ( + + ) : ( +
+ {!data?.queryTransaction.length ? ( +

+ {intl.formatMessage({ defaultMessage: "No transactions" })} +

+ ) : ( + + {data.queryTransaction.map((transaction: any) => ( + + ))} + + )} +
+ )}
); }; diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx deleted file mode 100644 index d1c6214..0000000 --- a/components/Sidebar.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React, { useContext } from "react"; -import Link from "next/link"; -import { useRouter } from "next/router"; -import classNames from "classnames"; -import UserContext from "contexts/User"; - -const Sidebar = () => { - const router = useRouter(); - const user = useContext(UserContext); - - if (!user) { - return null; - } - - return ( - - ); -}; - -export default Sidebar; diff --git a/components/TotalSpendCard.tsx b/components/TotalSpendCard.tsx deleted file mode 100644 index a2ce054..0000000 --- a/components/TotalSpendCard.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { memo } from "react"; -import { useIntl } from "react-intl"; -import { DateTime } from "luxon"; -import { gql, useQuery } from "@apollo/client"; - -const GET_AMOUNT_MAX = gql` - query totalTransactionsSum($from: DateTime!) { - aggregateTransaction( - filter: { and: { when: { ge: $from }, type: { eq: EXPENSE } } } - ) { - amountSum - } - } -`; - -const TotalSpendCard: React.FC = () => { - const intl = useIntl(); - - const { loading, error, data } = useQuery(GET_AMOUNT_MAX, { - variables: { from: DateTime.local().startOf("month").toString() }, - }); - if (error) { - console.error(error); - } - - const getAmount = (): number => { - if ( - data && - data.aggregateTransaction && - data.aggregateTransaction.amountSum - ) { - return data.aggregateTransaction.amountSum; - } - return 0; - }; - - return ( -
-
-
-
-
- {intl.formatMessage({ - defaultMessage: "Total Spend (month)", - description: "TotalSpendCard title", - })} -
-
- {intl.formatMessage( - { - defaultMessage: "{amount} $", - description: "monetary amount readout", - }, - { - amount: intl.formatNumber(getAmount()), - } - )} -
-
-
- -
-
-
-
- ); -}; - -export default memo(TotalSpendCard); diff --git a/components/Transaction.tsx b/components/Transaction.tsx index b561bdb..3abbb6c 100644 --- a/components/Transaction.tsx +++ b/components/Transaction.tsx @@ -1,7 +1,9 @@ import React from "react"; import { useIntl } from "react-intl"; -const Transaction: React.FC = () => { +export interface TransactionProps {} + +const Transaction: React.FC = (props) => { const intl = useIntl(); return ( diff --git a/components/TransactionsCountCard.tsx b/components/TransactionsCountCard.tsx deleted file mode 100644 index ef159c6..0000000 --- a/components/TransactionsCountCard.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { memo } from "react"; -import { gql, useQuery } from "@apollo/client"; -import { useIntl } from "react-intl"; -import { DateTime } from "luxon"; - -const GET_TOTOAL_TRANSACTIONS = gql` - query transactionsCount($from: DateTime!) { - aggregateTransaction( - filter: { and: { when: { ge: $from }, type: { eq: EXPENSE } } } - ) { - count - } - } -`; - -const TransactionsCountCard: React.FC = () => { - const intl = useIntl(); - - const { loading, error, data } = useQuery(GET_TOTOAL_TRANSACTIONS, { - variables: { from: DateTime.local().startOf("month").toString() }, - }); - if (error) { - console.error(error); - } - - const getCount = (): number => { - if (data && data.aggregateTransaction && data.aggregateTransaction.count) { - return data.aggregateTransaction.count.toLocaleString(); - } - return 0; - }; - - return ( -
-
-
-
-
- Count Purchases -
-
- {loading ? ( -
- - {intl.formatMessage({ - defaultMessage: "Loading...", - description: "default loading", - })} - -
- ) : ( -
- {getCount()} -
- )} -
-
-
- -
-
-
-
- ); -}; - -export default memo(TransactionsCountCard); diff --git a/forms/CategoryForm.tsx b/forms/CategoryForm.tsx index be2e7d7..9575518 100644 --- a/forms/CategoryForm.tsx +++ b/forms/CategoryForm.tsx @@ -1,77 +1,47 @@ -import { Formik, Field } from "formik"; +import { Formik, Form, Field } from "formik"; +import { useIntl } from "react-intl"; import * as Yup from "yup"; -import Input from "../components/Input"; -import Textarea from "../components/Textarea"; +import Input from "components/Input"; +import EmojiPicker from "components/EmojiPicker"; +import Button from "components/Button"; + +const validationSchema = Yup.object().shape({ + name: Yup.string().required("Required"), + date: Yup.date().required("Required"), +}); export interface CategoryFormProps { - onSubmit: any; - onCancel: any; + onSubmit: (values: CategoryFormValues) => Promise; initialValues?: any; } -export type CategoryFormValues = { - title: string; - description: string; -}; - -const validationSchema = Yup.object().shape({ - title: Yup.string().required("Required."), - description: Yup.string(), -}); +export type CategoryFormValues = {}; const CategoryForm: React.FC = (props) => { + const intl = useIntl(); + return ( - {({ handleSubmit, errors, touched, isSubmitting }) => ( -
- - -
- - -
- - )} +
+ + + +
); }; diff --git a/forms/GeneralSettingsForm.tsx b/forms/GeneralSettingsForm.tsx deleted file mode 100644 index 2c34919..0000000 --- a/forms/GeneralSettingsForm.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import { Formik, Field } from "formik"; -import { DateTime } from "luxon"; -import * as Yup from "yup"; -import Input from "../components/Input"; - -export interface GeneralSettingsFormProps { - onSubmit: any; - initialValues?: any; -} - -export type GeneralSettingsFormValues = { - givenName: string; - familyName: string; -}; - -const validationSchema = Yup.object().shape({ - givenName: Yup.string().required("Required."), - familyName: Yup.string().required("Required."), -}); - -const GeneralSettingsForm: React.FC = (props) => { - const getBirthday = () => { - if (props.initialValues && props.initialValues.birthday) { - return DateTime.fromISO(props.initialValues.birthday).toFormat( - "yyyy-MM-dd" - ); - } - return ""; - }; - - return ( - - {({ handleSubmit, errors, touched, isSubmitting }) => ( -
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
- )} -
- ); -}; - -export default GeneralSettingsForm; diff --git a/forms/NewTransactionForm.tsx b/forms/NewTransactionForm.tsx deleted file mode 100644 index b9f9db0..0000000 --- a/forms/NewTransactionForm.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { Formik, Field } from "formik"; -import * as Yup from "yup"; -import Input from "../components/Input"; -import { fieldHasError } from "../utils"; - -export interface NewTransactionFormProps { - onSubmit: any; - onCancel?: any; - categories?: { - id: string; - title: string; - }[]; - loading: boolean; - initialValues: any; -} - -export type NewTransactionFormValues = { - amount: number; - when: string; - category: string; -}; - -const validationSchema = Yup.object().shape({ - amount: Yup.number().required("Please provide a valid numeric amount."), - when: Yup.date().required("Please provide a valid date."), - category: Yup.string().required("Please provide a valid category."), -}); - -const NewTransactionForm: React.FC = (props) => { - return ( - - {({ handleSubmit, errors, touched, isSubmitting }) => ( -
- - -
- - {props.categories?.map((category) => ( - - {({ field }: any) => ( -
- - -
- )} -
- ))} - {fieldHasError({ name: "category", errors, touched }) && ( -
- Please provide a valid category. -
- )} -
-
- - -
- - )} -
- ); -}; - -export default NewTransactionForm; diff --git a/forms/SigninForm.tsx b/forms/SigninForm.tsx deleted file mode 100644 index 4ea1acc..0000000 --- a/forms/SigninForm.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Formik, Form, Field } from "formik"; -import * as Yup from "yup"; -import Input from "components/Input"; - -export interface SigninFormProps { - onSubmit: (values: SigninFormValues) => Promise; - initialValues?: any; -} - -export type SigninFormValues = { - email: string; - password: string; -}; - -const validationSchema = Yup.object().shape({ - email: Yup.string().required("Email is required"), - password: Yup.string() - .min(6, "Must be at least 6 characters.") - .required("Password is required"), -}); - -const SigninForm: React.FC = (props) => { - return ( - -
- - - - -
- ); -}; - -export default SigninForm; diff --git a/forms/TransactionForm.tsx b/forms/TransactionForm.tsx new file mode 100644 index 0000000..7beaf80 --- /dev/null +++ b/forms/TransactionForm.tsx @@ -0,0 +1,96 @@ +import { Formik, Form, Field } from "formik"; +import { useIntl } from "react-intl"; +import { toast } from "react-hot-toast"; +import Link from "next/link"; +import { gql, useQuery } from "@apollo/client"; +import * as Yup from "yup"; +import Input from "components/Input"; +import Button from "components/Button"; +import Loading from "components/Loading"; + +const GET_CATEGORIES = gql` + query GetCategories { + queryCategory { + id + name + icon + } + } +`; + +const validationSchema = Yup.object().shape({ + amount: Yup.number().required("Required"), + date: Yup.date().required("Required"), +}); + +export interface TransactionFormProps { + onSubmit: (values: TransactionFormValues) => Promise; + initialValues?: any; +} + +export type TransactionFormValues = {}; + +const TransactionForm: React.FC = (props) => { + const intl = useIntl(); + const { data, loading, error } = useQuery(GET_CATEGORIES); + if (error) { + toast.error(error.message); + } + + if (loading) { + return ; + } + + return ( + +
+ + + {!data.queryCategory.length ? ( + + + Add category + + + ) : ( +
+

Select category

+ {data.queryCategory.map((category: any) => ( + + ))} +
+ )} + + +
+ ); +}; + +export default TransactionForm; diff --git a/next.config.js b/next.config.js index 1aa1713..1b1bfa6 100644 --- a/next.config.js +++ b/next.config.js @@ -1,5 +1,8 @@ /** @type {import('next').NextConfig} */ -module.exports = { + +const { withSentryConfig } = require("@sentry/nextjs"); + +const moduleExports = { reactStrictMode: true, i18n: { locales: ["en"], @@ -18,3 +21,17 @@ module.exports = { return config; }, }; + +const sentryWebpackPluginOptions = { + // Additional config options for the Sentry Webpack plugin. Keep in mind that + // the following options are set automatically, and overriding them is not + // recommended: + // release, url, org, project, authToken, configFile, stripPrefix, + // urlPrefix, include, ignore + + silent: true, // Suppresses all logs + // For all available options, see: + // https://github.com/getsentry/sentry-webpack-plugin#options. +}; + +module.exports = withSentryConfig(moduleExports, sentryWebpackPluginOptions); diff --git a/package.json b/package.json index df907d5..73dd7fc 100644 --- a/package.json +++ b/package.json @@ -13,17 +13,21 @@ "i18n:compile": "formatjs compile-folder lang compiled-lang" }, "dependencies": { - "@apollo/client": "^3.4.16", + "@apollo/client": "^3.5.10", "@emotion/styled": "^11.8.1", "@headlessui/react": "^1.5.0", "@mui/icons-material": "^5.5.1", "@mui/material": "^5.5.3", + "@sentry/nextjs": "^6.19.6", + "@sentry/react": "^6.19.6", + "@sentry/tracing": "^6.19.6", "chart.js": "^3.5.1", "classnames": "^2.3.1", "deepmerge": "^4.2.2", + "emoji-picker-react": "^3.5.1", "firebase": "^9.6.6", "formik": "^2.2.9", - "graphql": "^15.6.1", + "graphql": "^16.3.0", "jwt-decode": "^3.1.2", "lodash.isequal": "^4.5.0", "luxon": "^2.0.2", diff --git a/pages/_error.jsx b/pages/_error.jsx new file mode 100644 index 0000000..c5f1f96 --- /dev/null +++ b/pages/_error.jsx @@ -0,0 +1,65 @@ +import NextErrorComponent from "next/error"; + +import * as Sentry from "@sentry/nextjs"; + +const MyError = ({ statusCode, hasGetInitialPropsRun, err }) => { + if (!hasGetInitialPropsRun && err) { + // getInitialProps is not called in case of + // https://github.com/vercel/next.js/issues/8592. As a workaround, we pass + // err via _app.js so it can be captured + Sentry.captureException(err); + // Flushing is not required in this case as it only happens on the client + } + + return ; +}; + +MyError.getInitialProps = async (context) => { + const errorInitialProps = await NextErrorComponent.getInitialProps(context); + + const { res, err, asPath } = context; + + // Workaround for https://github.com/vercel/next.js/issues/8592, mark when + // getInitialProps has run + errorInitialProps.hasGetInitialPropsRun = true; + + // Returning early because we don't want to log 404 errors to Sentry. + if (res?.statusCode === 404) { + return errorInitialProps; + } + + // Running on the server, the response object (`res`) is available. + // + // Next.js will pass an err on the server if a page's data fetching methods + // threw or returned a Promise that rejected + // + // Running on the client (browser), Next.js will provide an err if: + // + // - a page's `getInitialProps` threw or returned a Promise that rejected + // - an exception was thrown somewhere in the React lifecycle (render, + // componentDidMount, etc) that was caught by Next.js's React Error + // Boundary. Read more about what types of exceptions are caught by Error + // Boundaries: https://reactjs.org/docs/error-boundaries.html + + if (err) { + Sentry.captureException(err); + + // Flushing before returning is necessary if deploying to Vercel, see + // https://vercel.com/docs/platform/limits#streaming-responses + await Sentry.flush(2000); + + return errorInitialProps; + } + + // If this point is reached, getInitialProps was called without any + // information about what the error might be. This is unexpected and may + // indicate a bug introduced in Next.js, so record it in Sentry + Sentry.captureException( + new Error(`_error.js getInitialProps missing data at path: ${asPath}`) + ); + await Sentry.flush(2000); + + return errorInitialProps; +}; + +export default MyError; diff --git a/pages/account/categories.tsx b/pages/account/categories.tsx new file mode 100644 index 0000000..20389f5 --- /dev/null +++ b/pages/account/categories.tsx @@ -0,0 +1,77 @@ +import type { NextPage } from "next"; +import { Fragment, useState } from "react"; +import { useIntl } from "react-intl"; +import { Dialog } from "@headlessui/react"; +import Link from "next/link"; +import { toast } from "react-hot-toast"; +import { gql, useQuery } from "@apollo/client"; +import { ArrowBack, Add } from "@mui/icons-material"; +import Category from "components/Category"; +import Loading from "components/Loading"; +import CategoryForm from "forms/CategoryForm"; + +const GET_CATEGORIES = gql` + query GetCategories { + queryCategory { + id + name + icon + } + } +`; + +const Categories: NextPage = () => { + const intl = useIntl(); + const [open, setOpen] = useState(false); + + const { data, loading, error } = useQuery(GET_CATEGORIES); + if (error) { + toast.error(error.message); + } + + const onCategorySubmit = async (values: any) => { + console.log(values); + }; + + return ( + +
+
+ + + + + +

+ {intl.formatMessage({ defaultMessage: "Categories" })} +

+
+ {loading ? ( + + ) : ( +
+ {data.queryCategory.map((category: any) => ( + + ))} +
+ )} + +
+ setOpen(false)}> + +
+ +
+
+
+ ); +}; + +export default Categories; diff --git a/pages/account/index.tsx b/pages/account/index.tsx new file mode 100644 index 0000000..0b66d65 --- /dev/null +++ b/pages/account/index.tsx @@ -0,0 +1,33 @@ +/* eslint-disable @next/next/no-img-element */ +import type { NextPage } from "next"; +import { useContext } from "react"; +import Link from "next/link"; +import { useIntl } from "react-intl"; +import UserContext from "contexts/User"; + +const Account: NextPage = () => { + const intl = useIntl(); + const user = useContext(UserContext); + + return ( + + ); +}; + +export default Account; diff --git a/pages/account/settings.tsx b/pages/account/settings.tsx new file mode 100644 index 0000000..28dcf63 --- /dev/null +++ b/pages/account/settings.tsx @@ -0,0 +1,25 @@ +import type { NextPage } from "next"; +import { useIntl } from "react-intl"; +import Link from "next/link"; +import { ArrowBack } from "@mui/icons-material"; + +const Settings: NextPage = () => { + const intl = useIntl(); + + return ( +
+
+ + + + + +

+ {intl.formatMessage({ defaultMessage: "Settings" })} +

+
+
+ ); +}; + +export default Settings; diff --git a/pages/analytics.tsx b/pages/analytics.tsx new file mode 100644 index 0000000..8fb5442 --- /dev/null +++ b/pages/analytics.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const Analytics: React.FC = () => { + return
; +}; + +export default Analytics; diff --git a/pages/index.tsx b/pages/index.tsx index a124a52..4c16eb2 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,11 +1,13 @@ import type { NextPage } from "next"; import { useIntl } from "react-intl"; +import { gql, useQuery } from "@apollo/client"; import LargeNumberCard from "components/LargeNumberCard"; import SmallNumberCard from "components/SmallNumberCard"; import RecentTransactions from "components/RecentTransactions"; const Home: NextPage = () => { const intl = useIntl(); + // const {} = useQuery() return (
diff --git a/pages/transactions.tsx b/pages/transactions.tsx new file mode 100644 index 0000000..3c65b27 --- /dev/null +++ b/pages/transactions.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import RecentTransactions from "components/RecentTransactions"; + +const Transactions: React.FC = () => { + return ( +
+ +
+ ); +}; + +export default Transactions; diff --git a/public/img/avatar.jpeg b/public/img/avatar.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a4c2bfe306b6c66c7ab014a236c05fb5de1a850b GIT binary patch literal 1848 zcmYL|e>~H99LIMnjKchAikzDt5lzxam&Yi|`TeVK@+)=1n4Lq|h&9vbj{La9GSd%? z@+&$*THF++M`q;r((+^1TB{h%cKe~b|Gtm!Y2@xIr{h}EQw&zRuhC`Pb{cOK}y-&u}@?vTF`(i|$h;VibzH=c(X z?rc7%)j4F^>vR3=L4%tgL-xE{j^W`?B6=LIARR_4HMjJ-p>YG@$i@BtZG7Q(A)J+* zB;7?IGR}2RUWyd_h&k=MxphznJQLdGgqA6wVeB>HPHrwIZe9PvmkHhA9*QRUZpsDi zqYt+S$lNTi13XXeaKOt{;Pko#@y;W=C5{Qx&kFWjliRN9p%GH$=Ez)ykWC~sqNCuL zxk0$W-1ILmH9O=GR=`GE<%ay{k6V6`!}|S=X(W_Fd zM@8XrXeSB04D3aWd5Jo`PXC+~tdhx)n(O;Ym>j!JQyD{h#$FzRp1I$+HaKifZnb{E zPIEIZRYTCrHn>ciW_j!9D}rEIhS4$Lwl1+U?5ejCqQ6C0=+xAbXd(@f zT(^A(^`LyBYhjRYAuO%bla7IZU0XO?wlVk!xosM1ScX@HGgR7IEP-`WyDWZPh* zEy+w`y2D114J>6@CA3#>PiY!T+Tu1`nD706t#NSnY>)#ZKLHlz{qF#V2 zj%n`hX^}~jA-cJEReiC?;c=(QzW;xx&y*fkmf)<^!|7_#{;R7%bU1S#l!y19t&P&{ zkRg`Ft#0t0UGgklM`AL&|I+&ig=f(jGUggSlgQV0of|2J;$oEsVlsTSNdF*%6s#x0 zVcTtc9B5iGiC+&}jMa~NrHqAc61{x={I7#gQU|+0 z>d&|JTW#4q7l{t(h=v*}tqLF#S^xk5Gp}cLSD}?!XL*T^feo;v*XGL;^@`Mc!ACv= zD=~dQhdd@4MjB?P^@-f*lsDxrm|A;66eS&yUUul=_9>9*({vyZ{b98=u{y2fogeq{ zQ;<(WzeWK!yX-vkeLPy{$oNFAnlbIoy~33P@uzQ+qM9#(k^tc>it-syGQ6eX4}u!} zCqcu(lF1`T<7%bx&!pP~o0y{X;ZwOiztNgzy(s#ysZ_8^I*|a;IcatwSGRjnF#*J% zu+jwKHz<*JlxX512;4d^9A#AEsKm*kKUPqfvxX>9g1S-7HU)=#74jznPMF>^@GJ7D zDz3GvaVc_K!&ra%#rx;5-PZoP$}pnwpV$v7@s_K5mr??B(tyRT5Y^>7BpJz_#RyXhIN-nT-?hZqN(-r8CB^e^)+SaDlDVyp1e zy#B`nlZwH=5BN~;1cfj(QL)~;4FU|)e#&U2Xyjtsri_-Dsm`;Mq;+KZ@W5On_XX6>w#J^eOTBvr z$#-;fKSSo_5Bq!N9?!8JteSNo$5E99c!Dkk1d9&B-aEtfs9V7%&6N?ixW_f*o zRKJ=u$hnn+-D{(3Irw4d!WE$^aKe$LXEG)(~5v!*@ZkE$Lxj;C^0=1|wB%^Bf;-)LqN zn{iHC<7(Uk*xK9Gd_H}-x2OZ~aBd}&3gcFIY{Wk_9i+a>c;y~TouZYcXvv}c3pY!g AKL7v# literal 0 HcmV?d00001 diff --git a/sentry.client.config.js b/sentry.client.config.js new file mode 100644 index 0000000..d2c2d3e --- /dev/null +++ b/sentry.client.config.js @@ -0,0 +1,17 @@ +// This file configures the initialization of Sentry on the browser. +// The config you add here will be used whenever a page is visited. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import * as Sentry from '@sentry/nextjs'; + +const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN; + +Sentry.init({ + dsn: SENTRY_DSN || 'https://fd98cc3bb837434b90de39c3e9f54aeb@o502963.ingest.sentry.io/6321445', + // Adjust this value in production, or use tracesSampler for greater control + tracesSampleRate: 1.0, + // ... + // Note: if you want to override the automatic release value, do not set a + // `release` value here - use the environment variable `SENTRY_RELEASE`, so + // that it will also get attached to your source maps +}); diff --git a/sentry.properties b/sentry.properties new file mode 100644 index 0000000..ffdb089 --- /dev/null +++ b/sentry.properties @@ -0,0 +1,4 @@ +defaults.url=https://sentry.io/ +defaults.org=zefhub +defaults.project=ikura +cli.executable=../../../../.npm/_npx/a8388072043b4cbc/node_modules/@sentry/cli/bin/sentry-cli diff --git a/sentry.server.config.js b/sentry.server.config.js new file mode 100644 index 0000000..5ebdd53 --- /dev/null +++ b/sentry.server.config.js @@ -0,0 +1,17 @@ +// This file configures the initialization of Sentry on the server. +// The config you add here will be used whenever the server handles a request. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import * as Sentry from '@sentry/nextjs'; + +const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN; + +Sentry.init({ + dsn: SENTRY_DSN || 'https://fd98cc3bb837434b90de39c3e9f54aeb@o502963.ingest.sentry.io/6321445', + // Adjust this value in production, or use tracesSampler for greater control + tracesSampleRate: 1.0, + // ... + // Note: if you want to override the automatic release value, do not set a + // `release` value here - use the environment variable `SENTRY_RELEASE`, so + // that it will also get attached to your source maps +}); diff --git a/yarn.lock b/yarn.lock index b40bd15..1cce1c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,7 +9,7 @@ dependencies: "@jridgewell/trace-mapping" "^0.3.0" -"@apollo/client@^3.4.16": +"@apollo/client@^3.5.10": version "3.5.10" resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.5.10.tgz#43463108a6e07ae602cca0afc420805a19339a71" integrity sha512-tL3iSpFe9Oldq7gYikZK1dcYxp1c01nlSwtsMz75382HcI6fvQXyFXUCJTTK3wgO2/ckaBvRGw7VqjFREdVoRw== @@ -1170,6 +1170,140 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz#7f698254aadf921e48dda8c0a6b304026b8a9323" integrity sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A== +"@sentry/browser@6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.19.6.tgz#75be467667fffa1f4745382fc7a695568609c634" + integrity sha512-V5QyY1cO1iuFCI78dOFbHV7vckbeQEPPq3a5dGSXlBQNYnd9Ec5xoxp5nRNpWQPOZ8/Ixt9IgRxdqVTkWib51g== + dependencies: + "@sentry/core" "6.19.6" + "@sentry/types" "6.19.6" + "@sentry/utils" "6.19.6" + tslib "^1.9.3" + +"@sentry/cli@^1.73.0": + version "1.74.3" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.74.3.tgz#8405a19f6bb21b2ff3d051fb8a18056cc796c5ae" + integrity sha512-74NiqWTgTFDPe2S99h1ge5UMe6aAC44ebareadd1P6MdaNfYz6JUEa2QrDfMq7TKccEiRFXhXBHbUI8mxzrzuQ== + dependencies: + https-proxy-agent "^5.0.0" + mkdirp "^0.5.5" + node-fetch "^2.6.7" + npmlog "^4.1.2" + progress "^2.0.3" + proxy-from-env "^1.1.0" + which "^2.0.2" + +"@sentry/core@6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.19.6.tgz#7d4649d0148b5d0be1358ab02e2f869bf7363e9a" + integrity sha512-biEotGRr44/vBCOegkTfC9rwqaqRKIpFljKGyYU6/NtzMRooktqOhjmjmItNCMRknArdeaQwA8lk2jcZDXX3Og== + dependencies: + "@sentry/hub" "6.19.6" + "@sentry/minimal" "6.19.6" + "@sentry/types" "6.19.6" + "@sentry/utils" "6.19.6" + tslib "^1.9.3" + +"@sentry/hub@6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.19.6.tgz#ada83ceca0827c49534edfaba018221bc1eb75e1" + integrity sha512-PuEOBZxvx3bjxcXmWWZfWXG+orojQiWzv9LQXjIgroVMKM/GG4QtZbnWl1hOckUj7WtKNl4hEGO2g/6PyCV/vA== + dependencies: + "@sentry/types" "6.19.6" + "@sentry/utils" "6.19.6" + tslib "^1.9.3" + +"@sentry/integrations@6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.19.6.tgz#157152f16a8ad8df8a97d08bfe740909446b075a" + integrity sha512-K2xuA/ByhTh3qfIe0/XIsQSNf1HrRuIgtkC4TbU7T0QosybtXDsh6t/EWK+qzs2RjVE+Iaqldihstpoyew1JgA== + dependencies: + "@sentry/types" "6.19.6" + "@sentry/utils" "6.19.6" + localforage "^1.8.1" + tslib "^1.9.3" + +"@sentry/minimal@6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.19.6.tgz#b6cced3708e25d322039e68ebdf8fadfa445bf7d" + integrity sha512-T1NKcv+HTlmd8EbzUgnGPl4ySQGHWMCyZ8a8kXVMZOPDzphN3fVIzkYzWmSftCWp0rpabXPt9aRF2mfBKU+mAQ== + dependencies: + "@sentry/hub" "6.19.6" + "@sentry/types" "6.19.6" + tslib "^1.9.3" + +"@sentry/nextjs@^6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-6.19.6.tgz#419205659c0fe2b7695bb7c892c9014b55ddd01b" + integrity sha512-xV6yj9H1Ieg4uSS4SsT1x5GvrWdifuBNLPWrneQ89kWBuPVFLLH1wZA0gvDuq6AJstRZ3A5pWI2IbwpmQzxMWQ== + dependencies: + "@sentry/core" "6.19.6" + "@sentry/hub" "6.19.6" + "@sentry/integrations" "6.19.6" + "@sentry/node" "6.19.6" + "@sentry/react" "6.19.6" + "@sentry/tracing" "6.19.6" + "@sentry/utils" "6.19.6" + "@sentry/webpack-plugin" "1.18.8" + tslib "^1.9.3" + +"@sentry/node@6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.19.6.tgz#d63c4ffcf0150b4175a2e4e5021b53af46e5946f" + integrity sha512-kHQMfsy40ZxxdS9zMPmXCOOLWOJbQj6/aVSHt/L1QthYcgkAi7NJQNXnQIPWQDe8eP3DfNIWM7dc446coqjXrQ== + dependencies: + "@sentry/core" "6.19.6" + "@sentry/hub" "6.19.6" + "@sentry/types" "6.19.6" + "@sentry/utils" "6.19.6" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/react@6.19.6", "@sentry/react@^6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.19.6.tgz#4c07168637bfcef4d6556a2c4548b74a61eaed87" + integrity sha512-RnWZ7clg1lRgf/JFNnTOs8ZPCv566E5CwFXXb6swyjPYUMcIn95XujDQU9SU4hXZ4qXd9BRvifxqyxvq0LMXNw== + dependencies: + "@sentry/browser" "6.19.6" + "@sentry/minimal" "6.19.6" + "@sentry/types" "6.19.6" + "@sentry/utils" "6.19.6" + hoist-non-react-statics "^3.3.2" + tslib "^1.9.3" + +"@sentry/tracing@6.19.6", "@sentry/tracing@^6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.19.6.tgz#faa156886afe441730f03cf9ac9c4982044b7135" + integrity sha512-STZdlEtTBqRmPw6Vjkzi/1kGkGPgiX0zdHaSOhSeA2HXHwx7Wnfu7veMKxtKWdO+0yW9QZGYOYqp0GVf4Swujg== + dependencies: + "@sentry/hub" "6.19.6" + "@sentry/minimal" "6.19.6" + "@sentry/types" "6.19.6" + "@sentry/utils" "6.19.6" + tslib "^1.9.3" + +"@sentry/types@6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.6.tgz#70513f9dca05d23d7ab9c2a6cb08d4db6763ca67" + integrity sha512-QH34LMJidEUPZK78l+Frt3AaVFJhEmIi05Zf8WHd9/iTt+OqvCHBgq49DDr1FWFqyYWm/QgW/3bIoikFpfsXyQ== + +"@sentry/utils@6.19.6": + version "6.19.6" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.19.6.tgz#2ddc9ef036c3847084c43d0e5a55e4646bdf9021" + integrity sha512-fAMWcsguL0632eWrROp/vhPgI7sBj/JROWVPzpabwVkm9z3m1rQm6iLFn4qfkZL8Ozy6NVZPXOQ7EXmeU24byg== + dependencies: + "@sentry/types" "6.19.6" + tslib "^1.9.3" + +"@sentry/webpack-plugin@1.18.8": + version "1.18.8" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.18.8.tgz#247a73a0aa9e28099a736bbe89ca0d35cbac7636" + integrity sha512-PtKr0NL62b5L3kPFGjwSNbIUwwcW5E5G6bQxAYZGpkgL1MFPnS4ND0SAsySuX0byQJRFFium5A19LpzyvQZSlQ== + dependencies: + "@sentry/cli" "^1.73.0" + "@tailwindcss/forms@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.0.tgz#d4bea2560a10aac642573e72d3b4d62a88960449" @@ -1547,6 +1681,13 @@ acorn@^7.0.0, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +agent-base@6: + 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" + ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1577,6 +1718,11 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1604,6 +1750,19 @@ anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + arg@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" @@ -2054,6 +2213,11 @@ clsx@^1.1.1: resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2103,6 +2267,11 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + constants-browserify@1.0.0, constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -2122,6 +2291,11 @@ convert-source-map@^1.5.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + core-js-pure@^3.20.2: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" @@ -2274,6 +2448,13 @@ debug@2, debug@^2.6.9: dependencies: ms "2.0.0" +debug@4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -2315,6 +2496,11 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -2418,6 +2604,11 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emoji-picker-react@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/emoji-picker-react/-/emoji-picker-react-3.5.1.tgz#dbb4cda675a58dc86624d2fc488f75c2f4fc377d" + integrity sha512-cuSthFAvUO8Q1N7KJPEgZ7N0JNIWPKgN5GUmKe71UlSD4qFYI/p05RT9nohlWOq6YSFhEy2mI/60zBZiaku4mg== + emoji-regex@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.0.0.tgz#96559e19f82231b436403e059571241d627c42b8" @@ -2953,6 +3144,20 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -3071,10 +3276,10 @@ graphql-tag@^2.12.3: dependencies: tslib "^2.1.0" -graphql@^15.6.1: - version "15.8.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" - integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== +graphql@^16.3.0: + version "16.3.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.3.0.tgz#a91e24d10babf9e60c706919bb182b53ccdffc05" + integrity sha512-xm+ANmA16BzCT5pLjuXySbQVFwH3oJctUVdy81w1sV0vBU0KgDdBGtxQOUd5zqOBk/JayAFeG8Dlmeq74rjm/A== has-bigints@^1.0.1: version "1.0.1" @@ -3103,6 +3308,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -3174,6 +3384,14 @@ https-browserify@1.0.0, https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -3339,6 +3557,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -3563,6 +3788,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= + dependencies: + immediate "~3.0.5" + lie@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" @@ -3589,6 +3821,13 @@ loader-utils@1.2.3: emojis-list "^2.0.0" json5 "^1.0.1" +localforage@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -3666,6 +3905,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= + luxon@^2.0.2: version "2.3.1" resolved "https://registry.yarnpkg.com/luxon/-/luxon-2.3.1.tgz#f276b1b53fd9a740a60e666a541a7f6dbed4155a" @@ -3747,7 +3991,7 @@ minimatch@^3.0.4, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1: +minimist@^1.1.1, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== @@ -3757,6 +4001,13 @@ minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3865,7 +4116,7 @@ node-fetch@2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@2.6.7: +node-fetch@2.6.7, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -3928,7 +4179,22 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -object-assign@^4.1.1: +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -4268,7 +4534,7 @@ process@0.11.10, process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0: +progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -4311,6 +4577,11 @@ protobufjs@^6.10.0: "@types/node" ">=13.7.0" long "^4.0.0" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -4490,7 +4761,7 @@ react@17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" -readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -4666,6 +4937,11 @@ semver@^7.2.1, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + set-immediate-shim@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" @@ -4715,7 +4991,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -4832,7 +5108,16 @@ string-hash@1.1.3: resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4892,6 +5177,13 @@ strip-ansi@6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -5092,7 +5384,7 @@ tsconfig-paths@^3.12.0, tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1: +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -5317,13 +5609,20 @@ which-typed-array@^1.1.2: has-tostringtag "^1.0.0" is-typed-array "^1.1.7" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"