diff --git a/api/system.go b/api/system.go index 687d5c2..bba9e7a 100644 --- a/api/system.go +++ b/api/system.go @@ -5,4 +5,6 @@ import "github.com/usememos/memos/server/profile" type SystemStatus struct { Host *User `json:"host"` Profile *profile.Profile `json:"profile"` + // System settings + AllowSignUp bool `json:"allowSignUp"` } diff --git a/api/system_setting.go b/api/system_setting.go new file mode 100644 index 0000000..4566be0 --- /dev/null +++ b/api/system_setting.go @@ -0,0 +1,70 @@ +package api + +import ( + "encoding/json" + "fmt" +) + +type SystemSettingName string + +const ( + // SystemSettingAllowSignUpName is the key type of allow signup setting. + SystemSettingAllowSignUpName SystemSettingName = "allowSignUp" + SystemSettingPlaceholderName SystemSettingName = "placeholder" +) + +func (key SystemSettingName) String() string { + switch key { + case SystemSettingAllowSignUpName: + return "allowSignUp" + case SystemSettingPlaceholderName: + return "placeholder" + } + return "" +} + +var ( + SystemSettingAllowSignUpValue = []bool{true, false} +) + +type SystemSetting struct { + Name SystemSettingName + // Value is a JSON string with basic value + Value string + Description string +} + +type SystemSettingUpsert struct { + Name SystemSettingName `json:"name"` + Value string `json:"value"` + Description string `json:"description"` +} + +func (upsert SystemSettingUpsert) Validate() error { + if upsert.Name == SystemSettingAllowSignUpName { + value := false + err := json.Unmarshal([]byte(upsert.Value), &value) + if err != nil { + return fmt.Errorf("failed to unmarshal system setting allow signup value") + } + + invalid := true + for _, v := range SystemSettingAllowSignUpValue { + if value == v { + invalid = false + break + } + } + if invalid { + return fmt.Errorf("invalid system setting allow signup value") + } + } else { + return fmt.Errorf("invalid system setting name") + } + + return nil +} + +type SystemSettingFind struct { + Name *SystemSettingName `json:"name"` +} diff --git a/bin/server/main.go b/bin/server/main.go index 503fdb0..b7fffd1 100644 --- a/bin/server/main.go +++ b/bin/server/main.go @@ -45,7 +45,7 @@ func run(profile *profile.Profile) error { println(greetingBanner) fmt.Printf("Version %s has started at :%d\n", profile.Version, profile.Port) metricCollector.Collect(ctx, &metric.Metric{ - Name: "servive started", + Name: "service started", }) return serverInstance.Run() diff --git a/plugin/metrics/segment/collector.go b/plugin/metrics/segment/collector.go index f67a66b..56d8bb0 100644 --- a/plugin/metrics/segment/collector.go +++ b/plugin/metrics/segment/collector.go @@ -8,7 +8,9 @@ import ( metric "github.com/usememos/memos/plugin/metrics" ) -var _ metric.Collector = (*collector)(nil) +var ( + sessionUUID = uuid.NewString() +) // collector is the metrics collector https://segment.com/. type collector struct { @@ -33,7 +35,7 @@ func (c *collector) Collect(metric *metric.Metric) error { return c.client.Enqueue(analytics.Track{ Event: string(metric.Name), - AnonymousId: uuid.NewString(), + AnonymousId: sessionUUID, Properties: properties, Timestamp: time.Now().UTC(), }) diff --git a/server/auth.go b/server/auth.go index 9eb669d..f6bc33c 100644 --- a/server/auth.go +++ b/server/auth.go @@ -70,7 +70,11 @@ func (s *Server) registerAuthRoutes(g *echo.Group) { g.POST("/auth/signup", func(c echo.Context) error { ctx := c.Request().Context() - // Don't allow to signup by this api if site host existed. + signup := &api.Signup{} + if err := json.NewDecoder(c.Request().Body).Decode(signup); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "Malformatted signup request").SetInternal(err) + } + hostUserType := api.Host hostUserFind := api.UserFind{ Role: &hostUserType, @@ -79,13 +83,27 @@ func (s *Server) registerAuthRoutes(g *echo.Group) { if err != nil && common.ErrorCode(err) != common.NotFound { return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find host user").SetInternal(err) } - if hostUser != nil { + if signup.Role == api.Host && hostUser != nil { return echo.NewHTTPError(http.StatusUnauthorized, "Site Host existed, please contact the site host to signin account firstly.").SetInternal(err) } - signup := &api.Signup{} - if err := json.NewDecoder(c.Request().Body).Decode(signup); err != nil { - return echo.NewHTTPError(http.StatusBadRequest, "Malformatted signup request").SetInternal(err) + systemSettingAllowSignUpName := api.SystemSettingAllowSignUpName + allowSignUpSetting, err := s.Store.FindSystemSetting(ctx, &api.SystemSettingFind{ + Name: &systemSettingAllowSignUpName, + }) + if err != nil && common.ErrorCode(err) != common.NotFound { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find system setting").SetInternal(err) + } + + allowSignUpSettingValue := false + if allowSignUpSetting != nil { + err = json.Unmarshal([]byte(allowSignUpSetting.Value), &allowSignUpSettingValue) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to unmarshal system setting allow signup").SetInternal(err) + } + } + if !allowSignUpSettingValue && hostUser != nil { + return echo.NewHTTPError(http.StatusUnauthorized, "Site Host existed, please contact the site host to signin account firstly.").SetInternal(err) } userCreate := &api.UserCreate{ diff --git a/server/system.go b/server/system.go index a468dc7..c463ac1 100644 --- a/server/system.go +++ b/server/system.go @@ -38,8 +38,25 @@ func (s *Server) registerSystemRoutes(g *echo.Group) { } systemStatus := api.SystemStatus{ - Host: hostUser, - Profile: s.Profile, + Host: hostUser, + Profile: s.Profile, + AllowSignUp: false, + } + + systemSettingList, err := s.Store.FindSystemSettingList(ctx, &api.SystemSettingFind{}) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find system setting list").SetInternal(err) + } + for _, systemSetting := range systemSettingList { + var value interface{} + err = json.Unmarshal([]byte(systemSetting.Value), &value) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to unmarshal system setting").SetInternal(err) + } + + if systemSetting.Name == api.SystemSettingAllowSignUpName { + systemStatus.AllowSignUp = value.(bool) + } } c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) @@ -48,4 +65,57 @@ func (s *Server) registerSystemRoutes(g *echo.Group) { } return nil }) + + g.POST("/system/setting", func(c echo.Context) error { + ctx := c.Request().Context() + userID, ok := c.Get(getUserIDContextKey()).(int) + if !ok { + return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session") + } + + user, err := s.Store.FindUser(ctx, &api.UserFind{ + ID: &userID, + }) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find user").SetInternal(err) + } + if user == nil { + return echo.NewHTTPError(http.StatusNotFound, "Current signin user not found") + } else if user.Role != api.Host { + return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") + } + + systemSettingUpsert := &api.SystemSettingUpsert{} + if err := json.NewDecoder(c.Request().Body).Decode(systemSettingUpsert); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "Malformatted post system setting request").SetInternal(err) + } + if err := systemSettingUpsert.Validate(); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "system setting invalidate").SetInternal(err) + } + + systemSetting, err := s.Store.UpsertSystemSetting(ctx, systemSettingUpsert) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert system setting").SetInternal(err) + } + + c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) + if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(systemSetting)); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode system setting response").SetInternal(err) + } + return nil + }) + + g.GET("/system/setting", func(c echo.Context) error { + ctx := c.Request().Context() + systemSettingList, err := s.Store.FindSystemSettingList(ctx, &api.SystemSettingFind{}) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find system setting list").SetInternal(err) + } + + c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) + if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(systemSettingList)); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode system setting list response").SetInternal(err) + } + return nil + }) } diff --git a/store/db/seed/10005__system_setting.sql b/store/db/seed/10005__system_setting.sql new file mode 100644 index 0000000..9903a7e --- /dev/null +++ b/store/db/seed/10005__system_setting.sql @@ -0,0 +1,12 @@ +INSERT INTO + system_setting ( + `name`, + `value`, + `description` + ) +VALUES + ( + 'allowSignUp', + 'true', + '' + ); diff --git a/store/system_setting.go b/store/system_setting.go new file mode 100644 index 0000000..e72b5dc --- /dev/null +++ b/store/system_setting.go @@ -0,0 +1,154 @@ +package store + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "github.com/usememos/memos/api" + "github.com/usememos/memos/common" +) + +type systemSettingRaw struct { + Name api.SystemSettingName + Value string + Description string +} + +func (raw *systemSettingRaw) toSystemSetting() *api.SystemSetting { + return &api.SystemSetting{ + Name: raw.Name, + Value: raw.Value, + Description: raw.Description, + } +} + +func (s *Store) UpsertSystemSetting(ctx context.Context, upsert *api.SystemSettingUpsert) (*api.SystemSetting, error) { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return nil, FormatError(err) + } + defer tx.Rollback() + + systemSettingRaw, err := upsertSystemSetting(ctx, tx, upsert) + if err != nil { + return nil, err + } + + if err := tx.Commit(); err != nil { + return nil, err + } + + systemSetting := systemSettingRaw.toSystemSetting() + + return systemSetting, nil +} + +func (s *Store) FindSystemSettingList(ctx context.Context, find *api.SystemSettingFind) ([]*api.SystemSetting, error) { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return nil, FormatError(err) + } + defer tx.Rollback() + + systemSettingRawList, err := findSystemSettingList(ctx, tx, find) + if err != nil { + return nil, err + } + + if err := tx.Commit(); err != nil { + return nil, err + } + + list := []*api.SystemSetting{} + for _, raw := range systemSettingRawList { + list = append(list, raw.toSystemSetting()) + } + + return list, nil +} + +func (s *Store) FindSystemSetting(ctx context.Context, find *api.SystemSettingFind) (*api.SystemSetting, error) { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return nil, FormatError(err) + } + defer tx.Rollback() + + systemSettingRawList, err := findSystemSettingList(ctx, tx, find) + if err != nil { + return nil, err + } + + if len(systemSettingRawList) == 0 { + return nil, &common.Error{Code: common.NotFound, Err: fmt.Errorf("not found")} + } + + return systemSettingRawList[0].toSystemSetting(), nil +} + +func upsertSystemSetting(ctx context.Context, tx *sql.Tx, upsert *api.SystemSettingUpsert) (*systemSettingRaw, error) { + query := ` + INSERT INTO system_setting ( + name, value, description + ) + VALUES (?, ?, ?) + ON CONFLICT(name) DO UPDATE + SET + value = EXCLUDED.value, + description = EXCLUDED.description + RETURNING name, value, description + ` + var systemSettingRaw systemSettingRaw + if err := tx.QueryRowContext(ctx, query, upsert.Name, upsert.Value, upsert.Description).Scan( + &systemSettingRaw.Name, + &systemSettingRaw.Value, + &systemSettingRaw.Description, + ); err != nil { + return nil, FormatError(err) + } + + return &systemSettingRaw, nil +} + +func findSystemSettingList(ctx context.Context, tx *sql.Tx, find *api.SystemSettingFind) ([]*systemSettingRaw, error) { + where, args := []string{"1 = 1"}, []interface{}{} + + if v := find.Name; v != nil { + where, args = append(where, "name = ?"), append(args, v.String()) + } + + query := ` + SELECT + name, + value, + description + FROM system_setting + WHERE ` + strings.Join(where, " AND ") + rows, err := tx.QueryContext(ctx, query, args...) + if err != nil { + return nil, FormatError(err) + } + defer rows.Close() + + systemSettingRawList := make([]*systemSettingRaw, 0) + for rows.Next() { + var systemSettingRaw systemSettingRaw + if err := rows.Scan( + &systemSettingRaw.Name, + &systemSettingRaw.Value, + &systemSettingRaw.Description, + ); err != nil { + return nil, FormatError(err) + } + + systemSettingRawList = append(systemSettingRawList, &systemSettingRaw) + } + + if err := rows.Err(); err != nil { + return nil, FormatError(err) + } + + return systemSettingRawList, nil +} diff --git a/store/user.go b/store/user.go index 585d986..3b4b553 100644 --- a/store/user.go +++ b/store/user.go @@ -155,8 +155,6 @@ func (s *Store) FindUser(ctx context.Context, find *api.UserFind) (*api.User, er if len(list) == 0 { return nil, &common.Error{Code: common.NotFound, Err: fmt.Errorf("not found user with filter %+v", find)} - } else if len(list) > 1 { - return nil, &common.Error{Code: common.Conflict, Err: fmt.Errorf("found %d users with filter %+v, expect 1", len(list), find)} } userRaw := list[0] diff --git a/web/package.json b/web/package.json index 55c1bc2..f9a8da4 100644 --- a/web/package.json +++ b/web/package.json @@ -8,6 +8,9 @@ "test": "jest --passWithNoTests" }, "dependencies": { + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@mui/joy": "^5.0.0-alpha.52", "@reduxjs/toolkit": "^1.8.1", "axios": "^0.27.2", "copy-to-clipboard": "^3.3.2", diff --git a/web/src/App.tsx b/web/src/App.tsx index de047a0..2f1fa29 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,3 +1,4 @@ +import { CssVarsProvider } from "@mui/joy/styles"; import { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { RouterProvider } from "react-router-dom"; @@ -26,7 +27,11 @@ function App() { }); }, [global.locale]); - return ; + return ( + + + + ); } export default App; diff --git a/web/src/components/SettingDialog.tsx b/web/src/components/SettingDialog.tsx index 2cce357..d295bee 100644 --- a/web/src/components/SettingDialog.tsx +++ b/web/src/components/SettingDialog.tsx @@ -6,11 +6,12 @@ import { generateDialog } from "./Dialog"; import MyAccountSection from "./Settings/MyAccountSection"; import PreferencesSection from "./Settings/PreferencesSection"; import MemberSection from "./Settings/MemberSection"; +import SystemSection from "./Settings/SystemSection"; import "../less/setting-dialog.less"; type Props = DialogProps; -type SettingSection = "my-account" | "preferences" | "member"; +type SettingSection = "my-account" | "preferences" | "member" | "system"; interface State { selectedSection: SettingSection; @@ -61,6 +62,12 @@ const SettingDialog: React.FC = (props: Props) => { > 👤 {t("setting.member")} + handleSectionSelectorItemClick("system")} + className={`section-item ${state.selectedSection === "system" ? "selected" : ""}`} + > + 🧑‍🔧 System Setting + ) : null} @@ -72,6 +79,8 @@ const SettingDialog: React.FC = (props: Props) => { ) : state.selectedSection === "member" ? ( + ) : state.selectedSection === "system" ? ( + ) : null} diff --git a/web/src/components/Settings/SystemSection.tsx b/web/src/components/Settings/SystemSection.tsx new file mode 100644 index 0000000..7aa2b1d --- /dev/null +++ b/web/src/components/Settings/SystemSection.tsx @@ -0,0 +1,65 @@ +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import Switch from "@mui/joy/Switch"; +import * as api from "../../helpers/api"; +import { globalService, userService } from "../../services"; +import Selector from "../common/Selector"; +import "../../less/settings/preferences-section.less"; + +const localeSelectorItems = [ + { + text: "English", + value: "en", + }, + { + text: "中文", + value: "zh", + }, + { + text: "Tiếng Việt", + value: "vi", + }, +]; + +interface State { + allowSignUp: boolean; +} + +const SystemSection = () => { + const { t } = useTranslation(); + const [state, setState] = useState({ + allowSignUp: false, + }); + + useEffect(() => { + api.getSystemStatus().then(({ data }) => { + const { data: status } = data; + setState({ + allowSignUp: status.allowSignUp, + }); + }); + }, []); + + const handleAllowSignUpChanged = async (value: boolean) => { + setState({ + ...state, + allowSignUp: value, + }); + await api.upsertSystemSetting({ + name: "allowSignUp", + value: JSON.stringify(value), + }); + }; + + return ( +
+

{t("common.basic")}

+ +
+ ); +}; + +export default SystemSection; diff --git a/web/src/helpers/api.ts b/web/src/helpers/api.ts index c595125..499cb4c 100644 --- a/web/src/helpers/api.ts +++ b/web/src/helpers/api.ts @@ -10,6 +10,10 @@ export function getSystemStatus() { return axios.get>("/api/status"); } +export function upsertSystemSetting(systemSetting: SystemSetting) { + return axios.post>("/api/system/setting", systemSetting); +} + export function signin(email: string, password: string) { return axios.post>("/api/auth/signin", { email, diff --git a/web/src/less/auth.less b/web/src/less/auth.less index 87c92fc..8ada60a 100644 --- a/web/src/less/auth.less +++ b/web/src/less/auth.less @@ -59,6 +59,10 @@ > .btn { @apply flex flex-row justify-center items-center px-1 py-2 text-sm rounded hover:opacity-80; + &.signup-btn { + @apply px-3; + } + &.signin-btn { @apply bg-green-600 text-white px-3 shadow; } diff --git a/web/src/locales/en.json b/web/src/locales/en.json index 67e9681..4924394 100644 --- a/web/src/locales/en.json +++ b/web/src/locales/en.json @@ -28,6 +28,7 @@ "admin": "Admin", "explore": "Explore", "sign-in": "Sign in", + "sign-up": "Sign up", "sign-out": "Sign out", "back-to-home": "Back to Home", "type": "Type", diff --git a/web/src/locales/vi.json b/web/src/locales/vi.json index 51d59b1..2e916a5 100644 --- a/web/src/locales/vi.json +++ b/web/src/locales/vi.json @@ -28,6 +28,7 @@ "admin": "Admin", "explore": "Khám phá", "sign-in": "Đăng nhập", + "sign-up": "Sign up", "sign-out": "Đăng xuất", "back-to-home": "Về trang chủ", "type": "Kiểu", @@ -173,4 +174,4 @@ "resource-filename-updated": "Tên tệp tài nguyên đã thay đổi.", "invalid-resource-filename": "Tên tệp không hợp lệ." } -} \ No newline at end of file +} diff --git a/web/src/locales/zh.json b/web/src/locales/zh.json index 6d75003..7e9cb8e 100644 --- a/web/src/locales/zh.json +++ b/web/src/locales/zh.json @@ -28,6 +28,7 @@ "admin": "管理员", "explore": "探索", "sign-in": "登录", + "sign-up": "注册", "sign-out": "退出登录", "back-to-home": "回到主页", "type": "类型", diff --git a/web/src/pages/Auth.tsx b/web/src/pages/Auth.tsx index aede856..6485385 100644 --- a/web/src/pages/Auth.tsx +++ b/web/src/pages/Auth.tsx @@ -5,7 +5,6 @@ import * as api from "../helpers/api"; import { validate, ValidatorConfig } from "../helpers/validator"; import useLoading from "../hooks/useLoading"; import { globalService, userService } from "../services"; -import Icon from "../components/Icon"; import toastHelper from "../components/Toast"; import "../less/auth.less"; @@ -20,7 +19,7 @@ const Auth = () => { const { t, i18n } = useTranslation(); const navigate = useNavigate(); const pageLoadingState = useLoading(true); - const [siteHost, setSiteHost] = useState(); + const [systemStatus, setSystemStatus] = useState(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const actionBtnLoadingState = useLoading(false); @@ -28,7 +27,7 @@ const Auth = () => { useEffect(() => { api.getSystemStatus().then(({ data }) => { const { data: status } = data; - setSiteHost(status.host); + setSystemStatus(status); if (status.profile.mode === "dev") { setEmail("demo@usememos.com"); setPassword("secret"); @@ -47,9 +46,7 @@ const Auth = () => { setPassword(text); }; - const handleSigninBtnsClick = async (e: React.FormEvent) => { - e.preventDefault(); - + const handleSigninBtnsClick = async () => { if (actionBtnLoadingState.isLoading) { return; } @@ -77,14 +74,12 @@ const Auth = () => { } } catch (error: any) { console.error(error); - toastHelper.error(error.response.data.message); + toastHelper.error(error.response.data.error); } actionBtnLoadingState.setFinish(); }; - const handleSignUpAsHostBtnsClick = async (e: React.FormEvent) => { - e.preventDefault(); - + const handleSignUpBtnsClick = async (role: UserRole) => { if (actionBtnLoadingState.isLoading) { return; } @@ -103,7 +98,7 @@ const Auth = () => { try { actionBtnLoadingState.setLoading(); - await api.signup(email, password, "HOST"); + await api.signup(email, password, role); const user = await userService.doSignIn(); if (user) { navigate("/"); @@ -112,7 +107,7 @@ const Auth = () => { } } catch (error: any) { console.error(error); - toastHelper.error(error.response.data.message); + toastHelper.error(error.response.data.error); } actionBtnLoadingState.setFinish(); }; @@ -124,7 +119,7 @@ const Auth = () => { return (
-
(siteHost ? handleSigninBtnsClick(e) : handleSignUpAsHostBtnsClick(e))}> +
@@ -143,16 +138,39 @@ const Auth = () => {
{!pageLoadingState.isLoading && ( - + <> + {systemStatus?.host ? ( + <> + {systemStatus?.allowSignUp && ( + + )} + + + ) : ( + <> + + + )} + )}
-

- {siteHost || pageLoadingState.isLoading ? t("auth.not-host-tip") : t("auth.host-tip")} -

- + {!systemStatus?.host &&

{t("auth.host-tip")}

} +
handleLocaleItemClick("en")}> diff --git a/web/src/types/modules/system.d.ts b/web/src/types/modules/system.d.ts index f2a6dd1..142b5e0 100644 --- a/web/src/types/modules/system.d.ts +++ b/web/src/types/modules/system.d.ts @@ -6,4 +6,11 @@ interface Profile { interface SystemStatus { host: User; profile: Profile; + // System settings + allowSignUp: boolean; +} + +interface SystemSetting { + name: string; + value: string; } diff --git a/web/yarn.lock b/web/yarn.lock index 4c17f81..bfa69b9 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -89,7 +89,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-imports@^7.18.6": +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== @@ -202,7 +202,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== @@ -304,6 +304,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.0": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" + integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== + dependencies: + regenerator-runtime "^0.13.10" + "@babel/template@^7.18.10", "@babel/template@^7.3.3": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" @@ -343,6 +350,114 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@emotion/babel-plugin@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz#65fa6e1790ddc9e23cc22658a4c5dea423c55c3c" + integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.1" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.1.3" + +"@emotion/cache@^11.10.3", "@emotion/cache@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== + dependencies: + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.1.3" + +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/is-prop-valid@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/react@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.5.tgz#95fff612a5de1efa9c0d535384d3cfa115fe175d" + integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.5" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== + dependencies: + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== + +"@emotion/styled@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.5.tgz#1fe7bf941b0909802cb826457e362444e7e96a79" + integrity sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.5" + "@emotion/is-prop-valid" "^1.2.0" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== + +"@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== + "@esbuild/android-arm@0.15.10": version "0.15.10" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.10.tgz#a5f9432eb221afc243c321058ef25fe899886892" @@ -641,6 +756,90 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@mui/base@5.0.0-alpha.104": + version "5.0.0-alpha.104" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.104.tgz#1792e962dd782f1fa434f4aa7bab5410ed946644" + integrity sha512-tQPxZTzfYMwxYfKhEwufbTfdLpNjFdW7bXq6dK0j8651AAyZL4M8wynWUQ98hH1362R26mZFhVxHB2UD9t7VuA== + dependencies: + "@babel/runtime" "^7.19.0" + "@emotion/is-prop-valid" "^1.2.0" + "@mui/types" "^7.2.0" + "@mui/utils" "^5.10.9" + "@popperjs/core" "^2.11.6" + clsx "^1.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/core-downloads-tracker@^5.10.12": + version "5.10.12" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.12.tgz#ff36abc5f4aac3c762d116e12ab51c2688d93da1" + integrity sha512-cR8lOS606G++iVHR8I6ySgMAEiPoA3DxO/nLeqiv7w7d1707kvKoV4/7SWjh4ui+kHb052xlf/G196q2EKx31w== + +"@mui/joy@^5.0.0-alpha.52": + version "5.0.0-alpha.52" + resolved "https://registry.yarnpkg.com/@mui/joy/-/joy-5.0.0-alpha.52.tgz#5fbab73e51396e1c866134862d69c053707a3cf2" + integrity sha512-HJw00MDgylL95TyFR2Q3ipBvfK20GVOoYPmzc59piu5587aWg2pJs4VEGJ2VgkY/mbsxXBYl0JYT93JRz6RL9A== + dependencies: + "@babel/runtime" "^7.19.0" + "@mui/base" "5.0.0-alpha.104" + "@mui/core-downloads-tracker" "^5.10.12" + "@mui/system" "^5.10.12" + "@mui/types" "^7.2.0" + "@mui/utils" "^5.10.9" + clsx "^1.2.1" + csstype "^3.1.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/private-theming@^5.10.9": + version "5.10.9" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.10.9.tgz#c427bfa736455703975cdb108dbde6a174ba7971" + integrity sha512-BN7/CnsVPVyBaQpDTij4uV2xGYHHHhOgpdxeYLlIu+TqnsVM7wUeF+37kXvHovxM6xmL5qoaVUD98gDC0IZnHg== + dependencies: + "@babel/runtime" "^7.19.0" + "@mui/utils" "^5.10.9" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.10.8": + version "5.10.8" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.10.8.tgz#2db411e4278f06f70ccb6b5cd56ace67109513f6" + integrity sha512-w+y8WI18EJV6zM/q41ug19cE70JTeO6sWFsQ7tgePQFpy6ToCVPh0YLrtqxUZXSoMStW5FMw0t9fHTFAqPbngw== + dependencies: + "@babel/runtime" "^7.19.0" + "@emotion/cache" "^11.10.3" + csstype "^3.1.1" + prop-types "^15.8.1" + +"@mui/system@^5.10.12": + version "5.10.12" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.10.12.tgz#fd97a6fd75995038c1c34e9c5b6eb4ff9b9eee56" + integrity sha512-9DcN3hF2KTTTpZ0K5Tn20B+Tz7tIqDmJLk1M6P0CYoAGUN/xrcF/6dn1zZ829rxE5tmauoDUekTfomrvPsvlSQ== + dependencies: + "@babel/runtime" "^7.19.0" + "@mui/private-theming" "^5.10.9" + "@mui/styled-engine" "^5.10.8" + "@mui/types" "^7.2.0" + "@mui/utils" "^5.10.9" + clsx "^1.2.1" + csstype "^3.1.1" + prop-types "^15.8.1" + +"@mui/types@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.0.tgz#91380c2d42420f51f404120f7a9270eadd6f5c23" + integrity sha512-lGXtFKe5lp3UxTBGqKI1l7G8sE2xBik8qCfrLHD5olwP/YU0/ReWoWT7Lp1//ri32dK39oPMrJN8TgbkCSbsNA== + +"@mui/utils@^5.10.9": + version "5.10.9" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.10.9.tgz#9dc455f9230f43eeb81d96a9a4bdb3855bb9ea39" + integrity sha512-2tdHWrq3+WCy+G6TIIaFx3cg7PorXZ71P375ExuX61od1NOAJP1mK90VxQ8N4aqnj2vmO3AQDkV4oV2Ktvt4bA== + dependencies: + "@babel/runtime" "^7.19.0" + "@types/prop-types" "^15.7.5" + "@types/react-is" "^16.7.1 || ^17.0.0" + prop-types "^15.8.1" + react-is "^18.2.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -662,6 +861,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@popperjs/core@^2.11.6": + version "2.11.6" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== + "@reduxjs/toolkit@^1.8.1": version "1.8.5" resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.8.5.tgz#c14bece03ee08be88467f22dc0ecf9cf875527cd" @@ -785,12 +989,17 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.23.tgz#75c580983846181ebe5f4abc40fe9dfb2d65665f" integrity sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prettier@^2.1.5": version "2.7.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== -"@types/prop-types@*": +"@types/prop-types@*", "@types/prop-types@^15.7.5": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== @@ -807,6 +1016,13 @@ dependencies: "@types/react" "*" +"@types/react-is@^16.7.1 || ^17.0.0": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.3.tgz#2d855ba575f2fc8d17ef9861f084acc4b90a137a" + integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^18.0.21": version "18.0.21" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67" @@ -1116,6 +1332,15 @@ babel-plugin-jest-hoist@^29.0.2: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -1285,6 +1510,11 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -1338,6 +1568,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" @@ -1352,6 +1587,17 @@ copy-to-clipboard@^3.3.2: dependencies: toggle-selection "^1.0.6" +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1366,7 +1612,7 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.0.2: +csstype@^3.0.2, csstype@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== @@ -1944,6 +2190,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -2165,7 +2416,7 @@ highlight.js@^11.6.0: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.6.0.tgz#a50e9da05763f1bb0c1322c8f4f755242cff3f5a" integrity sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw== -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -3224,7 +3475,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.2.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -3447,7 +3698,7 @@ react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^18.0.0: +react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== @@ -3517,6 +3768,11 @@ redux@^4.1.2: dependencies: "@babel/runtime" "^7.9.2" +regenerator-runtime@^0.13.10: + version "0.13.10" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -3568,7 +3824,7 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.1.7, resolve@^1.20.0, resolve@^1.22.1: +resolve@^1.1.7, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -3709,6 +3965,11 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -3802,6 +4063,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -4094,7 +4360,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.2: +yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==