From d9a49ddf42cd68b87bb902d56297d7879ba8c9a0 Mon Sep 17 00:00:00 2001
From: Semyon Okulov <67464545+scffs@users.noreply.github.com>
Date: Tue, 24 Oct 2023 13:21:44 +0700
Subject: [PATCH] BREAKING CHANGE: rewrite to preact (#76)
---
.eslintrc.cjs | 78 +-
.prettierrc | 6 +
.yarnclean | 45 -
index-a12.html | 15 -
index1.html | 14 +
package.json | 42 +-
public/vite.svg | 1 +
src/App.tsx | 92 +-
src/AppWrapper.tsx | 55 +-
src/components/HelpAccordion.tsx | 28 +-
src/components/LessonCard.tsx | 279 ++-
src/components/MarksByGroup.tsx | 120 +-
src/components/ScheduleGroup.tsx | 24 +-
src/components/SubtitleWithBorder.tsx | 46 +-
src/components/TimeRemaining.tsx | 89 +-
src/components/UI/CalendarRange.tsx | 97 +-
src/components/UI/Epic.tsx | 68 +-
src/components/UI/ExplanationTooltip.tsx | 32 +-
src/components/UI/Mark/index.tsx | 85 +-
src/components/UI/MarksByDay/index.tsx | 69 +-
src/components/UI/NotFound.tsx | 30 +-
src/components/UI/PanelHeaderWithBack.tsx | 37 +-
src/components/UI/SubjectsList.tsx | 80 +-
src/components/UI/Summary.tsx | 72 +-
src/components/UI/Suspense.tsx | 29 +-
src/components/UI/Tabbar.tsx | 53 +-
src/components/UserInfo.tsx | 164 +-
src/components/data.ts | 22 +-
src/hooks/index.tsx | 8 +-
src/hooks/useDebouncedChangeWeek.tsx | 72 +-
src/hooks/useRateLimitExceeded.tsx | 29 +-
src/hooks/useScrollPosition.tsx | 24 +-
src/hooks/useSnackbar.tsx | 56 +-
src/index.css | 18 +-
src/main.tsx | 22 +-
src/methods/bridge/appStorageSet.ts | 19 -
src/methods/bridge/getCookie.ts | 17 -
src/methods/bridge/getUserId.ts | 17 -
src/methods/bridge/getVkStorageData.ts | 19 -
src/methods/bridge/getVkStorageKeys.ts | 15 -
src/methods/index.ts | 23 +-
src/methods/server/getAds.ts | 9 +-
src/methods/server/getAttestation.ts | 22 +-
src/methods/server/getCollegeInfo.ts | 18 +-
src/methods/server/getLessons.ts | 38 +-
src/methods/server/getPerformance.ts | 25 +-
src/methods/server/makeRequest.ts | 54 +-
src/modals/CollegeModal.tsx | 92 +-
src/modals/LessonModal.tsx | 233 +-
src/modals/ModalContext.tsx | 45 -
src/modals/ModalRoot.tsx | 32 +-
src/modals/data.ts | 4 +-
src/routes/index.ts | 37 +-
src/store/index.ts | 10 +
src/store/lessonSlice.ts | 25 +
.../transformVKBridgeAdaptivity.ts | 21 +-
src/types/hashes.d.ts | 32 +-
src/types/index.ts | 18 +-
src/utils/calculateAverageMark.ts | 15 +-
src/utils/extractMarksByDay.ts | 42 +-
src/utils/formatDate.ts | 6 +-
src/utils/formatDateForRequest.ts | 12 +-
src/utils/formatLessonDate.ts | 10 +-
src/utils/formatStatisticsData.ts | 40 +-
src/utils/handleResponse.ts | 26 +-
src/utils/isToday.ts | 12 +-
src/utils/logOut.ts | 23 +-
src/utils/setDefaultMark.ts | 21 +-
src/utils/sortByDay.ts | 18 +-
src/utils/textToLink.tsx | 20 +-
src/utils/truncateString.ts | 6 +-
src/views/Attestation.tsx | 147 +-
src/views/Contacts.tsx | 95 +-
src/views/LoginForm.tsx | 292 +--
src/views/Marks.tsx | 220 +-
src/views/Notifications.tsx | 249 ++-
src/views/Schedule.tsx | 607 ++---
src/views/Settings.tsx | 319 +--
src/views/index.tsx | 26 +-
tsconfig.json | 21 +-
tsconfig.node.json | 3 +-
vite.config.ts | 17 +-
vk-hosting-config.json | 8 +-
yarn.lock | 1950 +++++++++++++----
84 files changed, 4197 insertions(+), 2834 deletions(-)
create mode 100644 .prettierrc
delete mode 100644 .yarnclean
delete mode 100644 index-a12.html
create mode 100644 index1.html
create mode 100644 public/vite.svg
delete mode 100644 src/methods/bridge/appStorageSet.ts
delete mode 100644 src/methods/bridge/getCookie.ts
delete mode 100644 src/methods/bridge/getUserId.ts
delete mode 100644 src/methods/bridge/getVkStorageData.ts
delete mode 100644 src/methods/bridge/getVkStorageKeys.ts
delete mode 100644 src/modals/ModalContext.tsx
create mode 100644 src/store/index.ts
create mode 100644 src/store/lessonSlice.ts
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 0b7bb09d..f958eeb0 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -1,68 +1,32 @@
module.exports = {
- env: {
- browser: true,
- es2021: true,
- },
+ extends: ['eslint:recommended', 'plugin:preact/recommended', 'prettier'],
parser: '@typescript-eslint/parser',
- plugins: ['react', '@typescript-eslint', '@typescript-eslint/eslint-plugin'],
- extends: ['airbnb', 'airbnb-typescript'],
parserOptions: {
- ecmaVersion: 'latest',
+ ecmaVersion: 2021,
sourceType: 'module',
- project: ['./tsconfig.json'],
},
- settings: {
- react: {
- version: '^18.2.0',
- },
+ env: {
+ browser: true,
+ es6: true,
},
+ plugins: ['@typescript-eslint', 'preact', 'prettier'],
rules: {
- quotes: ['error', 'single'],
- semi: [1, 'always'],
- 'max-len': ['warn', { code: 150 }],
+ "no-unused-vars": "off",
+ "@typescript-eslint/no-unused-vars": [
+ "error",
+ { "argsIgnorePattern": "^_" }
+ ],
+ "prettier/prettier": "error",
+ "prefer-arrow-callback": "error",
+ "react/jsx-no-bind": "off",
+ "no-console": "off",
},
- overrides: [
- {
- files: ['bin/*.js', 'lib/*.js', '*.ts', '*.tsx'],
- extends: [
- 'plugin:@typescript-eslint/recommended',
- 'plugin:@typescript-eslint/recommended-requiring-type-checking',
- ],
+ settings: {
+ react: {
+ version: "^17.0",
},
- {
- files: ['*.tsx', '*.ts'],
- rules: {
- 'linebreak-style': 'off',
- 'import/prefer-default-export': 'off',
- '@typescript-eslint/no-non-null-assertion': 'off',
- 'react/react-in-jsx-scope': 'off',
- '@typescript-eslint/no-misused-promises': 'off',
- '@typescript-eslint/no-floating-promises': 'off',
- 'react/require-default-props': 'off',
- 'react/jsx-fragments': 'off',
- 'no-console': 'off',
- 'import/no-extraneous-dependencies': 'off',
- // @see https://stackoverflow.com/questions/46735483/error-do-not-use-array-index-in-keys
- // Обычно так делать нельзя, но в рамках нашего проекта - можно
- // Т.к. наши массивы статичны и юзер не может как-либо менять порядок / удалять элементы,
- // мы можем использовать индекс как key
- 'react/no-array-index-key': 'off',
- '@typescript-eslint/ban-ts-comment': 'off',
- '@typescript-eslint/no-unsafe-member-access': 'off',
- 'no-nested-ternary': 'off',
- 'react/jsx-props-no-spreading': 'off',
- 'no-param-reassign': 'off',
- 'max-classes-per-file': 'off',
- 'jsx-quotes': [2, 'prefer-single'],
- 'react/function-component-definition': [2, {
- namedComponents: 'arrow-function',
- unnamedComponents: 'arrow-function',
- },
- ],
- },
- parserOptions: {
- project: ['./tsconfig.json'],
- },
+ jest: {
+ version: 26,
},
- ],
+ },
};
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..0de65eac
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "trailingComma": "es5",
+ "semi": false,
+ "singleQuote": true,
+ "useTabs": false
+}
diff --git a/.yarnclean b/.yarnclean
deleted file mode 100644
index b591611e..00000000
--- a/.yarnclean
+++ /dev/null
@@ -1,45 +0,0 @@
-# test directories
-__tests__
-test
-tests
-powered-test
-
-# asset directories
-docs
-doc
-website
-images
-assets
-
-# examples
-example
-examples
-
-# code coverage directories
-coverage
-.nyc_output
-
-# build scripts
-Makefile
-Gulpfile.js
-Gruntfile.js
-
-# configs
-appveyor.yml
-circle.yml
-codeship-services.yml
-codeship-steps.yml
-wercker.yml
-.tern-project
-.gitattributes
-.editorconfig
-.*ignore
-.eslintrc
-.jshintrc
-.flowconfig
-.documentup.json
-.yarn-metadata.json
-.travis.yml
-
-# misc
-*.md
diff --git a/index-a12.html b/index-a12.html
deleted file mode 100644
index 6e2e7070..00000000
--- a/index-a12.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
- Имба дневник
-
-
-
-
-
-
diff --git a/index1.html b/index1.html
new file mode 100644
index 00000000..ca7182c3
--- /dev/null
+++ b/index1.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ Vite + Preact + TS
+
+
+
+
+
+
diff --git a/package.json b/package.json
index c4b05bf5..3de95bcd 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,7 @@
{
"name": "dnevnik-ts",
"private": true,
- "homepage": ".",
- "version": "6.0.0",
+ "version": "7.0.0",
"type": "module",
"scripts": {
"dev": "vite",
@@ -13,39 +12,48 @@
"preview": "vite preview"
},
"dependencies": {
- "@vkontakte/icons": "^2.66.0",
+ "@reduxjs/toolkit": "^1.9.7",
+ "@vkontakte/icons": "^2.72.0",
"@vkontakte/vk-bridge": "^2.11.2",
"@vkontakte/vk-bridge-react": "^1.0.0",
"@vkontakte/vk-mini-apps-router": "^1.1.1",
- "@vkontakte/vkui": "^5.8.1",
+ "@vkontakte/vkui": "^5.9.4",
"jshashes": "^1.0.8",
- "react": "^18.2.0",
- "react-dom": "^18.2.0"
+ "preact": "^10.16.0",
+ "react-redux": "^8.1.3"
},
"devDependencies": {
- "@rollup/plugin-terser": "^0.4.3",
- "@types/node": "^20.6.1",
- "@types/react": "^18.2.15",
- "@types/react-dom": "^18.2.7",
+ "@babel/eslint-parser": "^7.22.15",
+ "@preact/preset-vite": "^2.5.0",
+ "@rollup/plugin-terser": "^0.4.4",
+ "@types/node": "^20.8.7",
"@typescript-eslint/eslint-plugin": "^6.0.0",
- "@typescript-eslint/parser": "^6.0.0",
- "@vitejs/plugin-basic-ssl": "^1.0.1",
- "@vitejs/plugin-react-swc": "^3.3.2",
+ "@typescript-eslint/parser": "^6.8.0",
"@vkontakte/vk-miniapps-deploy": "^0.1.6",
- "diary-shared": "1.8.0",
- "eslint": "^8.45.0",
+ "diary-shared": "^1.8.0",
+ "eslint": "^8.52.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^17.1.0",
+ "eslint-config-preact": "^1.3.0",
+ "eslint-config-prettier": "^9.0.0",
"eslint-config-standard-with-typescript": "^38.0.0",
"eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-jest": "^27.4.3",
"eslint-plugin-jsx-a11y": "^6.5.1",
"eslint-plugin-n": "^16.0.2",
+ "eslint-plugin-preact": "^0.1.0",
+ "eslint-plugin-prettier": "^5.0.1",
"eslint-plugin-promise": "^6.0.0",
"eslint-plugin-react": "^7.32.2",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.3",
- "prop-types": "^15.8.1",
- "typescript": "^5.0.2",
+ "prettier": "^3.0.3",
+ "typescript": "^5.2.2",
"vite": "^4.4.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0-dom",
+ "react": "^18.1.0",
+ "react-dom": "^18.1.0"
}
}
diff --git a/public/vite.svg b/public/vite.svg
new file mode 100644
index 00000000..e7b8dfb1
--- /dev/null
+++ b/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/App.tsx b/src/App.tsx
index 47912e60..8ad518f7 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,64 +1,78 @@
import {
- AppRoot, PanelHeader, ScreenSpinner, SplitCol, SplitLayout,
-} from '@vkontakte/vkui';
-import { lazy, useEffect, useState } from 'react';
-import { useActiveVkuiLocation, usePopout, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import { useInsets } from '@vkontakte/vk-bridge-react';
-import { MAIN_SETTINGS, VIEW_SCHEDULE } from './routes';
-import { getCookie } from './methods';
-import { Pages } from './types';
-import Suspense from './components/UI/Suspense';
+ AppRoot,
+ PanelHeader,
+ ScreenSpinner,
+ SplitCol,
+ SplitLayout,
+} from '@vkontakte/vkui'
+import {
+ useActiveVkuiLocation,
+ usePopout,
+ useRouteNavigator,
+} from '@vkontakte/vk-mini-apps-router'
+import { useInsets } from '@vkontakte/vk-bridge-react'
+import { lazy } from 'preact/compat'
+import { useEffect, useState } from 'preact/hooks'
+import { MAIN_SETTINGS, VIEW_SCHEDULE } from './routes'
+import { Pages } from './types'
+import Suspense from './components/UI/Suspense'
-const ModalRoot = lazy(() => import('./modals/ModalRoot'));
-const Epic = lazy(() => import('./components/UI/Epic'));
+const ModalRoot = lazy(() => import('./modals/ModalRoot'))
+const Epic = lazy(() => import('./components/UI/Epic'))
const App = () => {
- const [isLoading, setIsLoading] = useState(false);
- const { view: activeView = MAIN_SETTINGS } = useActiveVkuiLocation();
- const routeNavigator = useRouteNavigator();
- const modals = ;
+ const [isLoading, setIsLoading] = useState(false)
+ const routeNavigator = useRouteNavigator()
+ const modals =
+ const { view: activeView = MAIN_SETTINGS } = useActiveVkuiLocation()
+ const cookieValue = localStorage.getItem('cookie')
- const routerPopout = usePopout();
- const vkBridgeInsets = useInsets() || undefined;
+ const routerPopout = usePopout()
+ const vkBridgeInsets = useInsets() || undefined
useEffect(() => {
- getCookie().then(async (cookieValue) => {
+ const onRoute = async () => {
if (!cookieValue) {
- await routeNavigator.replace('/');
- setIsLoading(false);
- } else if ((cookieValue) && activeView === MAIN_SETTINGS) {
- await routeNavigator.replace(`/${VIEW_SCHEDULE}`);
- setIsLoading(false);
+ await routeNavigator.replace('/')
+ setIsLoading(false)
+ } else if (cookieValue && activeView === MAIN_SETTINGS) {
+ await routeNavigator.replace(`/${VIEW_SCHEDULE}`)
+ setIsLoading(false)
}
- });
- }, [activeView, localStorage, window.location]);
+ }
- const onStoryChange = async (currentView: Pages) => {
- const cookieValue = await getCookie();
+ onRoute()
+ }, [activeView, localStorage, window.location])
+ const onStoryChange = async (currentView: Pages) => {
if (cookieValue) {
try {
- await routeNavigator.push(`/${currentView}`);
- return;
+ await routeNavigator.push(`/${currentView}`)
+ return
} catch (e) {
- console.error(e);
+ console.error(e)
}
}
- await routeNavigator.replace('/');
- };
+ await routeNavigator.replace('/')
+ }
return (
- } style={{ justifyContent: 'center' }}>
-
- {isLoading && }
-
+ }
+ style={{ justifyContent: 'center' }}
+ >
+
+ {isLoading && }
+
- );
-};
+ )
+}
-export default App;
+export default App
diff --git a/src/AppWrapper.tsx b/src/AppWrapper.tsx
index b752ec53..d6509ca3 100644
--- a/src/AppWrapper.tsx
+++ b/src/AppWrapper.tsx
@@ -1,21 +1,26 @@
-import { FC, lazy } from 'react';
-import { AdaptivityProvider, ConfigProvider, usePlatform } from '@vkontakte/vkui';
-import { RouterProvider } from '@vkontakte/vk-mini-apps-router';
-import vkBridge from '@vkontakte/vk-bridge';
-import { useAdaptivity, useAppearance } from '@vkontakte/vk-bridge-react';
-import { ModalProvider } from './modals/ModalContext';
-import { router } from './routes';
-import Suspense from './components/UI/Suspense';
-import { transformVKBridgeAdaptivity } from './transformers/transformVKBridgeAdaptivity';
+import {
+ AdaptivityProvider,
+ ConfigProvider,
+ usePlatform,
+} from '@vkontakte/vkui'
+import { RouterProvider } from '@vkontakte/vk-mini-apps-router'
+import vkBridge from '@vkontakte/vk-bridge'
+import { useAdaptivity, useAppearance } from '@vkontakte/vk-bridge-react'
+import { FC, lazy } from 'preact/compat'
+import { Provider } from 'react-redux'
+import { router } from './routes'
+import Suspense from './components/UI/Suspense'
+import { transformVKBridgeAdaptivity } from './transformers/transformVKBridgeAdaptivity'
+import store from './store'
-const NotFound = lazy(() => import('./components/UI/NotFound'));
-const App = lazy(() => import('./App'));
+const NotFound = lazy(() => import('./components/UI/NotFound'))
+const App = lazy(() => import('./App.tsx'))
-vkBridge.send('VKWebAppInit');
+vkBridge.send('VKWebAppInit')
const NotFoundCorrect: FC = () => {
- const platform = usePlatform();
- const vkBridgeAppearance = useAppearance() || undefined;
+ const platform = usePlatform()
+ const vkBridgeAppearance = useAppearance() || undefined
return (
{
>
- );
-};
+ )
+}
const AppWrapper = () => {
- const platform = usePlatform();
- const vkBridgeAdaptivityProps = transformVKBridgeAdaptivity(useAdaptivity());
- const vkBridgeAppearance = useAppearance() || undefined;
+ const platform = usePlatform()
+ const vkBridgeAdaptivityProps = transformVKBridgeAdaptivity(useAdaptivity())
+ const vkBridgeAppearance = useAppearance() || undefined
return (
}>
-
+
-
+
-
+
- );
-};
+ )
+}
-export default AppWrapper;
+export default AppWrapper
diff --git a/src/components/HelpAccordion.tsx b/src/components/HelpAccordion.tsx
index c6344263..ed80b894 100644
--- a/src/components/HelpAccordion.tsx
+++ b/src/components/HelpAccordion.tsx
@@ -1,5 +1,6 @@
-import { Accordion, Div, Text } from '@vkontakte/vkui';
-import { FC, ReactNode, useState } from 'react';
+import { Accordion, Div, Text } from '@vkontakte/vkui'
+import { FC, ReactNode } from 'preact/compat'
+import { useState } from 'preact/hooks'
export interface IHelpAccordion {
id: number
@@ -7,22 +8,25 @@ export interface IHelpAccordion {
detail: ReactNode
}
-const infoStyle = { color: 'var(--vkui--color_text_subhead)' };
+const infoStyle = { color: 'var(--vkui--color_text_subhead)' }
const HelpAccordion: FC = ({ id, title, detail }) => {
- const [openId, setOpenId] = useState(null);
+ const [openId, setOpenId] = useState(null)
return (
// @ts-ignore
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
- e.target.open && setOpenId(id)}>
+
+ e.target.open && setOpenId(id)}
+ >
{title}
-
- {detail}
-
+ {/*//@ts-ignore типы React не совсем совместимы с Preact */}
+ {detail}
- );
-};
+ )
+}
-export default HelpAccordion;
+export default HelpAccordion
diff --git a/src/components/LessonCard.tsx b/src/components/LessonCard.tsx
index 8db65bb7..8699461d 100644
--- a/src/components/LessonCard.tsx
+++ b/src/components/LessonCard.tsx
@@ -1,41 +1,50 @@
-import { CSSProperties, FC } from 'react';
+import { CSSProperties, FC } from 'react'
import {
- Card, Footnote, Group, Header, Placeholder, SimpleCell,
-} from '@vkontakte/vkui';
-import { useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
+ Card,
+ Footnote,
+ Group,
+ Header,
+ Placeholder,
+ SimpleCell,
+} from '@vkontakte/vkui'
+import { useRouteNavigator } from '@vkontakte/vk-mini-apps-router'
import {
- AbsenceTypes, Day, Gradebook, LessonWorkType, Timetable,
-} from 'diary-shared';
-import { formatLessonDate, getDayOfWeek } from '../utils/formatLessonDate';
-import setDefaultMark from '../utils/setDefaultMark';
-import { isToday } from '../utils/isToday';
-import { MODAL_PAGE_LESSON } from '../modals/ModalRoot';
-import { useModal } from '../modals/ModalContext';
-import SubtitleWithBorder from './SubtitleWithBorder';
-import TimeRemaining from './TimeRemaining';
-import Mark from './UI/Mark';
-import { Grade } from '../types';
+ AbsenceTypes,
+ Day,
+ Gradebook,
+ LessonWorkType,
+ Timetable,
+} from 'diary-shared'
+import { useDispatch } from 'react-redux'
+import { formatLessonDate, getDayOfWeek } from '../utils/formatLessonDate'
+import setDefaultMark from '../utils/setDefaultMark'
+import { isToday } from '../utils/isToday'
+import { MODAL_PAGE_LESSON } from '../modals/ModalRoot'
+import SubtitleWithBorder from './SubtitleWithBorder'
+import TimeRemaining from './TimeRemaining'
+import Mark from './UI/Mark'
+import { Grade } from '../types'
+import { setLessonModalData } from '../store/lessonSlice.ts'
interface ILessonCard {
- lesson: Day;
+ lesson: Day
}
const LessonCard: FC = ({ lesson }) => {
- const routeNavigator = useRouteNavigator();
-
- const { openLessonModal } = useModal();
+ const routeNavigator = useRouteNavigator()
+ const dispatch = useDispatch()
const handleLessonClick = (
name: string,
endTime: string,
startTime: string,
timetable: Timetable,
- gradebook: Gradebook | undefined,
+ gradebook: Gradebook | undefined
) => {
- routeNavigator.showModal(MODAL_PAGE_LESSON);
+ routeNavigator.showModal(MODAL_PAGE_LESSON)
- const lessonDate = new Date(lesson.date);
- const lessonId = lessonDate.toISOString();
+ const lessonDate = new Date(lesson.date)
+ const lessonId = lessonDate.toISOString()
const modalData = {
name,
@@ -45,126 +54,166 @@ const LessonCard: FC = ({ lesson }) => {
gradebook,
tasks: gradebook?.tasks,
lessonId,
- };
+ }
- openLessonModal(modalData);
- };
+ dispatch(setLessonModalData(modalData))
+ }
- const currentDate = new Date();
- const formattedLessonDate = formatLessonDate(lesson.date);
- const lessonDate = new Date(lesson.date);
+ const currentDate = new Date()
+ const formattedLessonDate = formatLessonDate(lesson.date)
+ const lessonDate = new Date(lesson.date)
if (lessonDate.getDay() === 0) {
- return null;
+ return null
}
- const lessonYear = lessonDate.getFullYear().toString();
- const lessonMonth = (lessonDate.getMonth() + 1).toString().padStart(2, '0');
- const lessonDay = lessonDate.getDate().toString().padStart(2, '0');
- const lessonDayOfWeek = getDayOfWeek(lessonDate);
- const isLessonToday = isToday(lessonDate);
-
- const currentYear = currentDate.getFullYear().toString();
- const currentMonth = (currentDate.getMonth() + 1).toString().padStart(2, '0');
- const currentDay = currentDate.getDate().toString().padStart(2, '0');
-
- const dayEnded = currentYear === lessonYear && currentMonth === lessonMonth && currentDay > lessonDay;
-
- const displayDay = dayEnded ? ' День завершён' : isLessonToday ? 'Сегодня' : '';
- const displayEndDayStyles = dayEnded && '#888888';
- const displayCurrDayStyles = isLessonToday && 'var(--vkui--color_background_accent)';
+ const lessonYear = lessonDate.getFullYear().toString()
+ const lessonMonth = (lessonDate.getMonth() + 1).toString().padStart(2, '0')
+ const lessonDay = lessonDate.getDate().toString().padStart(2, '0')
+ const lessonDayOfWeek = getDayOfWeek(lessonDate)
+ const isLessonToday = isToday(lessonDate)
+
+ const currentYear = currentDate.getFullYear().toString()
+ const currentMonth = (currentDate.getMonth() + 1).toString().padStart(2, '0')
+ const currentDay = currentDate.getDate().toString().padStart(2, '0')
+
+ const dayEnded =
+ currentYear === lessonYear &&
+ currentMonth === lessonMonth &&
+ currentDay > lessonDay
+
+ const displayDay = dayEnded
+ ? ' День завершён'
+ : isLessonToday
+ ? 'Сегодня'
+ : ''
+ const displayEndDayStyles = dayEnded && '#888888'
+ const displayCurrDayStyles =
+ isLessonToday && 'var(--vkui--color_background_accent)'
const displayDayStyles: CSSProperties = {
color: displayEndDayStyles || displayCurrDayStyles || undefined,
padding: '3px 5px',
borderRadius: '5px',
border: `1px solid ${displayEndDayStyles || displayCurrDayStyles}`,
- };
+ }
return (
{displayDay}}>
+ header={
+ //@ts-ignore типы React не совсем совместимы с Preact
+ {displayDay}}
+ >
{lessonDayOfWeek && `${lessonDayOfWeek}. `}
{formattedLessonDate}
- )}
+ }
>
{lesson.lessons && lesson.lessons.length > 0 ? (
- lesson.lessons.map(({
- name, endTime, startTime, timetable, gradebook,
- }) => (
- name && (
- handleLessonClick(name, endTime, startTime, timetable, gradebook)}
- key={startTime as unknown as string}
- subtitle={!name || (
-
-
-
- {gradebook?.lessonType && (
-
- {LessonWorkType[gradebook?.lessonType]}
-
- )}
- {gradebook?.absenceType
- && (
-
- {AbsenceTypes[gradebook?.absenceType]}
-
- )}
-
-
-
-
- {startTime === undefined
- ? ''
- : `${startTime} — ${endTime}, каб. ${timetable?.classroom.name === '0' ? 'ДО' : timetable?.classroom.name}`}
-
-
+ lesson.lessons.map(
+ ({ name, endTime, startTime, timetable, gradebook }) =>
+ name && (
+
+ handleLessonClick(
+ name,
+ endTime,
+ startTime,
+ timetable,
+ gradebook
+ )
+ }
+ key={startTime}
+ subtitle={
+ !name || (
- {timetable?.teacher?.lastName
- ? `${timetable.teacher?.lastName} ${timetable.teacher?.firstName[0]}. ${timetable.teacher?.middleName[0]}.`
- : 'Не указан'}
-
-
- {gradebook?.tasks?.map((task, index) => (
- (task.isRequired || (Grade[setDefaultMark(task)])) && (
-
- )
- ))}
+
+
+ {gradebook?.lessonType && (
+
+ {LessonWorkType[gradebook?.lessonType]}
+
+ )}
+ {gradebook?.absenceType && (
+
+ {AbsenceTypes[gradebook?.absenceType]}
+
+ )}
+
+
+
+
+ {startTime === undefined
+ ? ''
+ : `${startTime} — ${endTime}, каб. ${
+ timetable?.classroom.name === '0'
+ ? 'ДО'
+ : timetable?.classroom.name
+ }`}
+
+
+
+ {timetable?.teacher?.lastName
+ ? `${timetable.teacher?.lastName} ${timetable.teacher?.firstName[0]}. ${timetable.teacher?.middleName[0]}.`
+ : 'Не указан'}
+
+
+ {gradebook?.tasks?.map(
+ (task, index) =>
+ (task.isRequired ||
+ Grade[setDefaultMark(task)]) && (
+
+ )
+ )}
+
+
-
-
- )}
- >
- {name}
-
- )
- ))
+ )
+ }
+ >
+ {name}
+
+ )
+ )
) : (
Пар нет
)}
- );
-};
+ )
+}
-export default LessonCard;
+export default LessonCard
diff --git a/src/components/MarksByGroup.tsx b/src/components/MarksByGroup.tsx
index 787b676d..1a5ee198 100644
--- a/src/components/MarksByGroup.tsx
+++ b/src/components/MarksByGroup.tsx
@@ -1,4 +1,4 @@
-import { FC } from 'react';
+import { FC } from 'react'
import {
Card,
CardGrid,
@@ -8,43 +8,54 @@ import {
HorizontalScroll,
MiniInfoCell,
Title,
-} from '@vkontakte/vkui';
+} from '@vkontakte/vkui'
import {
Icon20IncognitoOutline,
Icon20StatisticsOutline,
-} from '@vkontakte/icons';
+} from '@vkontakte/icons'
import {
- AbsenceType, AbsenceTypes, PerformanceCurrent, TextMark, AbsenceTypesKeys,
-} from 'diary-shared';
-import calculateAverageMark from '../utils/calculateAverageMark';
-import Mark from './UI/Mark';
-import { Grade, GradeKeys } from '../types';
+ AbsenceType,
+ AbsenceTypes,
+ AbsenceTypesKeys,
+ PerformanceCurrent,
+ TextMark,
+} from 'diary-shared'
+import calculateAverageMark from '../utils/calculateAverageMark'
+import Mark from './UI/Mark'
+import { Grade, GradeKeys } from '../types'
interface IMarksByGroup {
- marksForSubject: PerformanceCurrent | null;
+ marksForSubject: PerformanceCurrent | null
}
const MarksByGroup: FC = ({ marksForSubject }) => {
- const subjectMarksMap: Record = {};
+ const subjectMarksMap: Record<
+ string,
+ { date: string; marks: TextMark[]; absenceType?: AbsenceType }[]
+ > = {}
if (!marksForSubject) {
return (
- Оценки по дисциплинам}>
-
-
+ Оценки по дисциплинам}
+ >
+
+
-
Нет данных
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
+ Нет данных
- );
+ )
}
marksForSubject?.daysWithMarksForSubject?.map((subject) => {
- const { subjectName, daysWithMarks } = subject;
+ const { subjectName, daysWithMarks } = subject
if (!subjectMarksMap[subjectName]) {
- subjectMarksMap[subjectName] = [];
+ subjectMarksMap[subjectName] = []
}
daysWithMarks?.forEach((dayWithMark) => {
@@ -52,55 +63,76 @@ const MarksByGroup: FC = ({ marksForSubject }) => {
date: new Date(dayWithMark.day).toLocaleDateString(),
marks: dayWithMark.markValues,
absenceType: dayWithMark.absenceType,
- });
- });
- });
+ })
+ })
+ })
return (
- Оценки по дисциплинам}>
+ Оценки по дисциплинам}
+ >
{Object.keys(subjectMarksMap).map((subjectName, i) => (
-
-
+
+
-
{subjectName}
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
+ {subjectName}
- {subjectMarksMap[subjectName].map(({ date, marks, absenceType }) => (
-
- {marks.length > 0 && !absenceType ? (
- marks.map((mark, k) => (
-
- ))
- ) : absenceType ? (
-
- ) : null}
-
- ))}
+ {subjectMarksMap[subjectName].map(
+ ({ date, marks, absenceType }) => (
+
+ {marks.length > 0 && !absenceType ? (
+ marks.map((mark, k) => (
+
+ ))
+ ) : absenceType ? (
+
+ ) : null}
+
+ )
+ )}
- {marksForSubject && marksForSubject.daysWithMarksForSubject[i].averageMark ? (
+ {marksForSubject &&
+ marksForSubject.daysWithMarksForSubject[i].averageMark ? (
}
style={{ marginTop: 5 }}
after={calculateAverageMark(
- marksForSubject.daysWithMarksForSubject[i].daysWithMarks?.reduce(
+ marksForSubject.daysWithMarksForSubject[
+ i
+ ].daysWithMarks?.reduce(
(allMarks, day) => [...allMarks, ...day.markValues],
- [] as TextMark[],
- ),
+ [] as TextMark[]
+ )
)}
>
Средний балл:
) : (
- }>Нет оценок
+ }>
+ Нет оценок
+
)}
))}
- );
-};
+ )
+}
-export default MarksByGroup;
+export default MarksByGroup
diff --git a/src/components/ScheduleGroup.tsx b/src/components/ScheduleGroup.tsx
index 05f1191e..2e7230af 100644
--- a/src/components/ScheduleGroup.tsx
+++ b/src/components/ScheduleGroup.tsx
@@ -1,19 +1,21 @@
-import { FC } from 'react';
// TODO: Сделать переключатель для расписания
-import { CardGrid } from '@vkontakte/vkui';
-import { Day } from 'diary-shared';
-import LessonCard from './LessonCard';
+import { CardGrid } from '@vkontakte/vkui'
+import { Day } from 'diary-shared'
+import LessonCard from './LessonCard'
+import { FunctionComponent } from 'preact'
interface IScheduleGroup {
lessonsState?: Day[] | null
}
-const ScheduleGroup: FC = ({ lessonsState }) => (
-
- {lessonsState?.length && lessonsState?.length > 0 && lessonsState?.map((lesson) => (
-
- ))}
+const ScheduleGroup: FunctionComponent = ({ lessonsState }) => (
+
+ {lessonsState?.length &&
+ lessonsState?.length > 0 &&
+ lessonsState?.map((lesson) => (
+
+ ))}
-);
+)
-export default ScheduleGroup;
+export default ScheduleGroup
diff --git a/src/components/SubtitleWithBorder.tsx b/src/components/SubtitleWithBorder.tsx
index 0f1cc2ea..c5f67c7f 100644
--- a/src/components/SubtitleWithBorder.tsx
+++ b/src/components/SubtitleWithBorder.tsx
@@ -1,12 +1,24 @@
-import { CSSProperties, FC, ReactNode } from 'react';
+import { CSSProperties, ReactNode } from 'preact/compat'
+import { FunctionComponent } from 'preact'
interface ISubtitleWithBorder {
- children: ReactNode | string;
- color?: 'red' | 'green' | 'yellow' | 'red-outline' | 'green-outline' | 'yellow-outline' | 'default';
- style?: CSSProperties;
+ children: ReactNode | string
+ color?:
+ | 'red'
+ | 'green'
+ | 'yellow'
+ | 'red-outline'
+ | 'green-outline'
+ | 'yellow-outline'
+ | 'default'
+ style?: CSSProperties
}
-const SubtitleWithBorder: FC = ({ children, color = 'default', style }) => {
+const SubtitleWithBorder: FunctionComponent = ({
+ children,
+ color = 'default',
+ style,
+}) => {
const getColorStyles = () => {
switch (color) {
case 'red':
@@ -15,53 +27,53 @@ const SubtitleWithBorder: FC = ({ children, color = 'defaul
borderRadius: '5px',
border: '1px solid #DA0A35',
color: 'white',
- };
+ }
case 'green':
return {
backgroundColor: 'green',
borderRadius: '5px',
border: '1px solid green',
color: 'white',
- };
+ }
case 'green-outline':
return {
color: 'green',
borderRadius: '5px',
border: '1px solid green',
- };
+ }
case 'yellow-outline':
return {
borderRadius: '5px',
border: '1px solid #ffb060',
color: '#ffb060',
- };
+ }
case 'red-outline':
return {
borderRadius: '5px',
border: '1px solid #DA0A35',
color: '#DA0A35',
- };
+ }
case 'yellow':
return {
backgroundColor: '#ffb060',
borderRadius: '5px',
border: '1px solid #ffb060',
color: 'white',
- };
+ }
case 'default':
default:
return {
borderRadius: '5px',
border: '1px solid var(--vkui--color_background_accent_themed)',
color: 'var(--vkui--color_background_accent_themed)',
- };
+ }
}
- };
+ }
return (
= ({ children, color = 'defaul
>
{children}
- );
-};
+ )
+}
-export default SubtitleWithBorder;
+export default SubtitleWithBorder
diff --git a/src/components/TimeRemaining.tsx b/src/components/TimeRemaining.tsx
index 7a167e54..cffafee1 100644
--- a/src/components/TimeRemaining.tsx
+++ b/src/components/TimeRemaining.tsx
@@ -1,67 +1,84 @@
-import { FC } from 'react';
+import { FunctionComponent } from 'preact'
interface ITimeRemainingProps {
- lessonDate: Date;
- startTime: string;
- endTime: string;
+ lessonDate: Date
+ startTime: string
+ endTime: string
}
-const getTimeRemaining = (currentDate: Date, lessonDate: Date, endTime: string, startDate: Date): string | null => {
- const endDate = new Date(lessonDate);
- endDate.setHours(Number(endTime.split(':')[0]));
- endDate.setMinutes(Number(endTime.split(':')[1]));
+const getTimeRemaining = (
+ currentDate: Date,
+ lessonDate: Date,
+ endTime: string,
+ startDate: Date
+): string | null => {
+ const endDate = new Date(lessonDate)
+ endDate.setHours(Number(endTime.split(':')[0]))
+ endDate.setMinutes(Number(endTime.split(':')[1]))
- const timeToStart = (startDate.getTime() - currentDate.getTime()) / (1000 * 60);
+ const timeToStart =
+ (startDate.getTime() - currentDate.getTime()) / (1000 * 60)
if (timeToStart > 60) {
- return '';
+ return ''
}
if (currentDate > endDate) {
- return null;
+ return null
}
if (currentDate < startDate) {
- return `${Math.floor(timeToStart)} мин до начала`;
- } if (currentDate < endDate) {
- const remainingMinutes = (endDate.getTime() - currentDate.getTime()) / (1000 * 60);
- return `${Math.floor(remainingMinutes)} мин до конца`;
+ return `${Math.floor(timeToStart)} мин до начала`
}
- return null;
-};
+ if (currentDate < endDate) {
+ const remainingMinutes =
+ (endDate.getTime() - currentDate.getTime()) / (1000 * 60)
+ return `${Math.floor(remainingMinutes)} мин до конца`
+ }
+ return null
+}
-const TimeRemaining: FC = ({ lessonDate, startTime, endTime }) => {
+const TimeRemaining: FunctionComponent = ({
+ lessonDate,
+ startTime,
+ endTime,
+}) => {
if (!lessonDate || !startTime || !endTime) {
- return 'Нет времени';
+ return Нет времени
}
- const currentDate = new Date();
- const startDate = new Date(lessonDate);
- startDate.setHours(Number(startTime.split(':')[0]));
- startDate.setMinutes(Number(startTime.split(':')[1]));
+ const currentDate = new Date()
+ const startDate = new Date(lessonDate)
+ startDate.setHours(Number(startTime.split(':')[0]))
+ startDate.setMinutes(Number(startTime.split(':')[1]))
- const timeRemainingText = getTimeRemaining(currentDate, lessonDate, endTime, startDate);
+ const timeRemainingText = getTimeRemaining(
+ currentDate,
+ lessonDate,
+ endTime,
+ startDate
+ )
if (!timeRemainingText) {
- return null;
+ return null
}
- const isRed = parseInt(timeRemainingText, 10) < 30;
+ const isRed = parseInt(timeRemainingText, 10) < 30
const styles = {
margin: '5px 0',
display: 'inline-block',
padding: '3px 5px',
borderRadius: '5px',
- border: isRed ? '1px solid var(--vkui--color_background_negative)' : '1px solid var(--vkui--color_accent_violet)',
- color: isRed ? 'var(--vkui--color_background_negative)' : 'var(--vkui--color_accent_violet)',
- };
+ border: isRed
+ ? '1px solid var(--vkui--color_background_negative)'
+ : '1px solid var(--vkui--color_accent_violet)',
+ color: isRed
+ ? 'var(--vkui--color_background_negative)'
+ : 'var(--vkui--color_accent_violet)',
+ }
- return (
-
- {timeRemainingText}
-
- );
-};
+ return {timeRemainingText}
+}
-export default TimeRemaining;
+export default TimeRemaining
diff --git a/src/components/UI/CalendarRange.tsx b/src/components/UI/CalendarRange.tsx
index e4bfca2c..c84e3f1d 100644
--- a/src/components/UI/CalendarRange.tsx
+++ b/src/components/UI/CalendarRange.tsx
@@ -1,6 +1,3 @@
-import React, {
- FC, ReactNode, useEffect, useRef, useState,
-} from 'react';
import {
Button,
Calendar,
@@ -9,72 +6,82 @@ import {
FormLayoutGroup,
LocaleProvider,
unstable_Popper as Popper,
-} from '@vkontakte/vkui';
-import PropTypes from 'prop-types';
+} from '@vkontakte/vkui'
+import { ReactNode, forwardRef } from 'preact/compat'
+import { useEffect, useImperativeHandle, useRef, useState } from 'preact/hooks'
+import { FunctionalComponent } from 'preact'
interface CalendarRangeProps {
- label: string | ReactNode;
- onDateChange?: (newDate: Date) => void;
- value?: Date;
+ label: string | ReactNode
+ onDateChange?: (newDate: Date) => void
+ value?: Date
}
-const CalendarRange: FC = React.forwardRef(
+/*//@ts-ignore типы React не совсем совместимы с Preact*/
+const CalendarRange: FunctionalComponent = forwardRef(
+ //@ts-ignore типы React не совсем совместимы с Preact
({ label, onDateChange, value }, ref) => {
- const [startDate, setStartDate] = useState(value);
- const [shown, setShown] = useState(false);
- const buttonRef = useRef(null);
- const calendarRef = useRef(null);
+ const [startDate, setStartDate] = useState(value)
+ const [shown, setShown] = useState(false)
+ const buttonRef = useRef(null)
+ const calendarRef = useRef(null)
const handleButtonClick = () => {
- setShown(!shown);
- };
+ setShown(!shown)
+ }
const handleDateChange = (newDate: Date) => {
- setStartDate(newDate);
+ setStartDate(newDate)
if (onDateChange) {
- onDateChange(newDate);
+ onDateChange(newDate)
}
- };
+ }
const handleOutsideClick = (event: MouseEvent) => {
if (
- shown
- && buttonRef.current
- && calendarRef.current
- && !buttonRef.current.contains(event.target as Node)
- && !calendarRef.current.contains(event.target as Node)
+ shown &&
+ buttonRef.current &&
+ calendarRef.current &&
+ !buttonRef.current.contains(event.target as Node) &&
+ !calendarRef.current.contains(event.target as Node)
) {
- setShown(false);
+ setShown(false)
}
- };
+ }
useEffect(() => {
- document.addEventListener('click', handleOutsideClick);
+ document.addEventListener('click', handleOutsideClick)
return () => {
- document.removeEventListener('click', handleOutsideClick);
- };
- }, [shown]);
+ document.removeEventListener('click', handleOutsideClick)
+ }
+ }, [shown])
- React.useImperativeHandle(ref, () => ({
+ useImperativeHandle(ref, () => ({
close: () => {
- setShown(false);
+ setShown(false)
},
- }));
+ }))
return (
-
- {label}
- {' '}
+
+ {label}{' '}
{shown && (
-
+
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
-
+
= React.forwardRef(
disableFuture={false}
disablePickers
showNeighboringMonth={false}
- size='s'
+ size="s"
listenDayChangesForUpdate={false}
/>
@@ -94,14 +101,8 @@ const CalendarRange: FC = React.forwardRef(
)}
- );
- },
-);
-
-CalendarRange.propTypes = {
- label: PropTypes.node.isRequired,
- onDateChange: PropTypes.func,
- value: PropTypes.instanceOf(Date),
-};
+ )
+ }
+)
-export default CalendarRange;
+export default forwardRef
(CalendarRange)
diff --git a/src/components/UI/Epic.tsx b/src/components/UI/Epic.tsx
index 5f376e4d..cadf6cee 100644
--- a/src/components/UI/Epic.tsx
+++ b/src/components/UI/Epic.tsx
@@ -1,59 +1,73 @@
-import { FC } from 'react';
-import { useActiveVkuiLocation } from '@vkontakte/vk-mini-apps-router';
-import { useAdaptivityConditionalRender } from '@vkontakte/vkui';
-import { Epic as VKUIEpic } from '@vkontakte/vkui/dist/components/Epic/Epic';
+import { useActiveVkuiLocation } from '@vkontakte/vk-mini-apps-router'
+import { useAdaptivityConditionalRender } from '@vkontakte/vkui'
+import { Epic as VKUIEpic } from '@vkontakte/vkui/dist/components/Epic/Epic'
+import { FC } from 'preact/compat'
import {
- MAIN_SETTINGS, VIEW_ATTESTATION, VIEW_CONTACTS, VIEW_MARKS, VIEW_NOTIFICATIONS, VIEW_SCHEDULE, VIEW_SETTINGS,
-} from '../../routes';
-import { Pages } from '../../types';
+ MAIN_SETTINGS,
+ VIEW_ATTESTATION,
+ VIEW_CONTACTS,
+ VIEW_MARKS,
+ VIEW_NOTIFICATIONS,
+ VIEW_SCHEDULE,
+ VIEW_SETTINGS,
+} from '../../routes'
+import { Pages } from '../../types'
-import Tabbar from './Tabbar';
-import Suspense from './Suspense';
+import Tabbar from './Tabbar'
+import Suspense from './Suspense'
import {
- Attestation, Contacts, LoginForm, Marks, Notifications, Schedule, Settings,
-} from '../../views';
+ Attestation,
+ Contacts,
+ LoginForm,
+ Marks,
+ Notifications,
+ Schedule,
+ Settings,
+} from '../../views'
interface IEpic {
onStoryChange: (current: Pages) => void
}
const Epic: FC = ({ onStoryChange }) => {
- const {
- view: activeView = 'profile' as Pages,
- } = useActiveVkuiLocation();
- const { viewWidth } = useAdaptivityConditionalRender();
+ const { view: activeView = 'profile' as Pages } = useActiveVkuiLocation()
+ const { viewWidth } = useAdaptivityConditionalRender()
return (
+ viewWidth.tabletMinus && (
+
+ )
}
>
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- );
-};
+ )
+}
-export default Epic;
+export default Epic
diff --git a/src/components/UI/ExplanationTooltip.tsx b/src/components/UI/ExplanationTooltip.tsx
index b894442d..134a2ce2 100644
--- a/src/components/UI/ExplanationTooltip.tsx
+++ b/src/components/UI/ExplanationTooltip.tsx
@@ -1,29 +1,27 @@
-import { FC } from 'react';
-import {
- unstable_Popover as Popover, Subhead, Text,
-} from '@vkontakte/vkui';
-import { Icon16HelpOutline } from '@vkontakte/icons';
+import { unstable_Popover as Popover, Subhead, Text } from '@vkontakte/vkui'
+import { Icon16HelpOutline } from '@vkontakte/icons'
+import { FC } from 'preact/compat'
interface TooltipTextProps {
- text: string;
- tooltipContent: string;
+ text: string
+ tooltipContent: string
}
const ExplanationTooltip: FC = ({ text, tooltipContent }) => {
const textTooltip = (
-
+ //@ts-ignore типы React не совсем совместимы с Preact
+
{tooltipContent}
- );
+ )
return (
+ //@ts-ignore типы React не совсем совместимы с Preact
{text}
-
+
= ({ text, tooltipContent }) => {
/>
- );
-};
+ )
+}
-export default ExplanationTooltip;
+export default ExplanationTooltip
diff --git a/src/components/UI/Mark/index.tsx b/src/components/UI/Mark/index.tsx
index 1a09fa97..b86b91e5 100644
--- a/src/components/UI/Mark/index.tsx
+++ b/src/components/UI/Mark/index.tsx
@@ -1,47 +1,56 @@
-import { CSSProperties, FC } from 'react';
-import { Footnote } from '@vkontakte/vkui';
-import { AbsenceTypesKeys } from 'diary-shared';
-import { TMark } from '../../../types';
+import { Footnote } from '@vkontakte/vkui'
+import { AbsenceTypesKeys } from 'diary-shared'
+import { CSSProperties, FC } from 'preact/compat'
+import { TMark } from '../../../types'
-type Sizes = 'l' | 's';
-type ReturnedMark = TMark | AbsenceTypesKeys;
+type Sizes = 'l' | 's'
+type ReturnedMark = 'Н' | TMark | AbsenceTypesKeys
interface IMark {
- mark?: ReturnedMark;
- size?: Sizes;
- bottom?: string;
- useMargin?: boolean;
- style?: CSSProperties;
+ mark?: ReturnedMark
+ size?: Sizes
+ bottom?: string
+ useMargin?: boolean
+ style?: CSSProperties
}
const getBackgroundColor = (score?: ReturnedMark) => {
if (Number(score) > 5) {
- return 'var(--vkui--color_accent_purple)';
- } if (Number(score) >= 4) {
- return 'linear-gradient(135deg,#50c750,#32b332)';
- } if (score === 3) {
- return '#F59802';
- // FIXME: 'The two values in this comparison do not have a shared enum type @typescript-eslint/no-unsafe-enum-comparison'
- } if (score === 'ДЗ') {
- return '#4966CF';
- } if (score === 'О') {
- return '#ffb060';
+ return 'var(--vkui--color_accent_purple)'
+ }
+ if (Number(score) >= 4) {
+ return 'linear-gradient(135deg,#50c750,#32b332)'
+ }
+ if (score === 3) {
+ return '#F59802'
+ // FIXME: 'The two values in this comparison do not have a shared enum type @typescript-eslint/no-unsafe-enum-comparison'
+ }
+ if (score === 'ДЗ') {
+ return '#4966CF'
+ }
+ if (score === 'О') {
+ return '#ffb060'
}
- return '#DA0A35';
-};
+ return '#DA0A35'
+}
const Mark: FC = ({
- mark, size = 'l', useMargin = true, bottom, style,
+ mark,
+ size = 'l',
+ useMargin = true,
+ bottom,
+ style,
}) => {
const getSize = (size: Sizes) => {
if (size === 's') {
- return '1rem';
- } if (size === 'l') {
- return '3rem';
+ return '1rem'
}
- return undefined;
- };
+ if (size === 'l') {
+ return '3rem'
+ }
+ return undefined
+ }
const styles: CSSProperties = {
padding: size === 'l' ? '10px 29px' : '5px 10px',
@@ -51,19 +60,17 @@ const Mark: FC = ({
color: 'white',
marginLeft: useMargin ? 10 : undefined,
display: 'inline-block',
- };
+ }
+
return (
-
- {mark}
-
+
{mark}
{bottom && (
-
- {bottom}
-
+ // @ts-ignore
+
{bottom}
)}
- );
-};
+ )
+}
-export default Mark;
+export default Mark
diff --git a/src/components/UI/MarksByDay/index.tsx b/src/components/UI/MarksByDay/index.tsx
index a0230b7e..e64c7f45 100644
--- a/src/components/UI/MarksByDay/index.tsx
+++ b/src/components/UI/MarksByDay/index.tsx
@@ -1,27 +1,32 @@
-import { FC } from 'react';
+import { Fragment, FunctionalComponent } from 'preact'
import {
- Group, Header, HorizontalCell, HorizontalScroll,
-} from '@vkontakte/vkui';
-import { PerformanceCurrent } from 'diary-shared';
-import Mark from '../Mark';
-import { Grade } from '../../../types';
-import './index.css';
-import { extractMarksByDay } from '../../../utils/extractMarksByDay';
-import { sortByDay } from '../../../utils/sortByDay';
-import { truncateString } from '../../../utils/truncateString';
+ Group,
+ Header,
+ HorizontalCell,
+ HorizontalScroll,
+} from '@vkontakte/vkui'
+import { PerformanceCurrent } from 'diary-shared'
+import Mark from '../Mark'
+import { Grade } from '../../../types'
+import './index.css'
+import { extractMarksByDay } from '../../../utils/extractMarksByDay'
+import { sortByDay } from '../../../utils/sortByDay'
+import { truncateString } from '../../../utils/truncateString'
interface IPerformanceCurrent {
- performanceData: PerformanceCurrent | null;
+ performanceData: PerformanceCurrent | null
}
export interface IMarksByDay {
[key: string]: {
- [lessonName: string]: Grade[];
- };
+ [lessonName: string]: Grade[]
+ }
}
-const MarksByDay: FC = ({ performanceData }) => {
- const marksByDay = extractMarksByDay(performanceData);
+const MarksByDay: FunctionalComponent = ({
+ performanceData,
+}) => {
+ const marksByDay = extractMarksByDay(performanceData)
return (
= ({ performanceData }) => {
getScrollToLeft={(i) => i - 120}
getScrollToRight={(i) => i + 120}
>
- Недавние оценки}>
-
+
Недавние оценки}>
+
{Object.entries(sortByDay(marksByDay)).map(([day, lessonGrades]) => (
-
+
{Object.entries(lessonGrades).map(([lessonName, grades]) => (
{grades.map((grade, gradeIndex) => (
-
-
+ // @ts-ignore
+
+
+
+
))}
@@ -56,7 +67,7 @@ const MarksByDay: FC
= ({ performanceData }) => {
- );
-};
+ )
+}
-export default MarksByDay;
+export default MarksByDay
diff --git a/src/components/UI/NotFound.tsx b/src/components/UI/NotFound.tsx
index e9b44a09..b0916c2b 100644
--- a/src/components/UI/NotFound.tsx
+++ b/src/components/UI/NotFound.tsx
@@ -1,9 +1,7 @@
-import { CSSProperties } from 'react';
-import {
- AppRoot, Button, Div,
-} from '@vkontakte/vkui';
-import { useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import { useInsets } from '@vkontakte/vk-bridge-react';
+import { AppRoot, Button, Div } from '@vkontakte/vkui'
+import { useRouteNavigator } from '@vkontakte/vk-mini-apps-router'
+import { useInsets } from '@vkontakte/vk-bridge-react'
+import { CSSProperties } from 'preact/compat'
const notFoundStyle: CSSProperties = {
display: 'flex',
@@ -13,7 +11,7 @@ const notFoundStyle: CSSProperties = {
alignItems: 'center',
justifyContent: 'center',
textAlign: 'center',
-};
+}
const text: CSSProperties = {
padding: '0px 8px',
@@ -23,11 +21,11 @@ const text: CSSProperties = {
background: 'rgba(63, 138, 224, 0.08)',
borderRadius: 8,
marginBottom: 40,
-};
+}
const NotFound = () => {
- const routeNavigator = useRouteNavigator();
- const vkBridgeInsets = useInsets() || undefined;
+ const routeNavigator = useRouteNavigator()
+ const vkBridgeInsets = useInsets() || undefined
return (
@@ -35,16 +33,16 @@ const NotFound = () => {
404
- );
-};
+ )
+}
-export default NotFound;
+export default NotFound
diff --git a/src/components/UI/PanelHeaderWithBack.tsx b/src/components/UI/PanelHeaderWithBack.tsx
index f14ac18f..93b39db0 100644
--- a/src/components/UI/PanelHeaderWithBack.tsx
+++ b/src/components/UI/PanelHeaderWithBack.tsx
@@ -1,26 +1,19 @@
-import { FC, useEffect } from 'react';
-import { PanelHeader, PanelHeaderBack } from '@vkontakte/vkui';
-import { useActiveVkuiLocation, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import { getCookie } from '../../methods';
-import { MAIN_SETTINGS } from '../../routes';
+import { FunctionalComponent } from 'preact'
+import { PanelHeader, PanelHeaderBack } from '@vkontakte/vkui'
+import { useRouteNavigator } from '@vkontakte/vk-mini-apps-router'
-const PanelHeaderWithBack: FC<{ title: string }> = ({ title }) => {
- const routeNavigator = useRouteNavigator();
- const storageCookie = localStorage.getItem('cookie');
- const { view } = useActiveVkuiLocation();
-
- useEffect(() => {
- getCookie().then((cookieValue) => {
- console.log(cookieValue);
- if ((!storageCookie || !cookieValue) && view !== MAIN_SETTINGS) {
- routeNavigator.replace('/');
- }
- });
- }, [view, localStorage, window.location]);
+const PanelHeaderWithBack: FunctionalComponent<{ title: string }> = ({
+ title,
+}) => {
+ const routeNavigator = useRouteNavigator()
return (
-
routeNavigator.back()} />}>{title}
- );
-};
+
routeNavigator.back()} />}
+ >
+ {title}
+
+ )
+}
-export default PanelHeaderWithBack;
+export default PanelHeaderWithBack
diff --git a/src/components/UI/SubjectsList.tsx b/src/components/UI/SubjectsList.tsx
index 11579c18..d56f9f63 100644
--- a/src/components/UI/SubjectsList.tsx
+++ b/src/components/UI/SubjectsList.tsx
@@ -1,55 +1,67 @@
-import { FC } from 'react';
import {
- Card, CardGrid, Div, Group, Header, InfoRow, Subhead, Title,
-} from '@vkontakte/vkui';
-import { ExaminationType, Examinations } from 'diary-shared';
+ Card,
+ CardGrid,
+ Div,
+ Group,
+ Header,
+ InfoRow,
+ Subhead,
+ Title,
+} from '@vkontakte/vkui'
+import { ExaminationType, Examinations } from 'diary-shared'
+import { FunctionalComponent } from 'preact'
export interface Subject {
- id: string;
- name: string;
- examinationType: ExaminationType;
- marks: Record
>;
+ id: string
+ name: string
+ examinationType: ExaminationType
+ marks: Record>
}
interface SubjectListProps {
- semesters: Record;
- studentName: string | null;
- year: number | null;
+ semesters: Record
+ studentName: string | null
+ year: number | null
}
-const SubjectList: FC = ({ semesters, studentName, year }) => (
+const SubjectList: FunctionalComponent = ({
+ semesters,
+ studentName,
+ year,
+}) => (
{Object.keys(semesters).map((semesterKey) => (
+ header={
+
- )}
+ }
>
{semesters[semesterKey].map((subject) => (
-
-
+
+
-
{subject.name}
-
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
+ {subject.name}
+
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
{Examinations[subject.examinationType]}
-
+
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
- {subject.marks[subject.id] && Object.keys(subject.marks[subject.id]).length > 0 ? (
- Object.keys(subject.marks[subject.id]).map((studentId) => (
-
- {subject.marks[subject.id][studentId]}
-
- ))
- ) : (
- 'Оценок нет'
- )}
+ {subject.marks[subject.id] &&
+ Object.keys(subject.marks[subject.id]).length > 0
+ ? Object.keys(subject.marks[subject.id]).map(
+ (studentId) => (
+
+ {subject.marks[subject.id][studentId]}
+
+ )
+ )
+ : 'Оценок нет'}
@@ -59,6 +71,6 @@ const SubjectList: FC = ({ semesters, studentName, year }) =>
))}
-);
+)
-export default SubjectList;
+export default SubjectList
diff --git a/src/components/UI/Summary.tsx b/src/components/UI/Summary.tsx
index da598614..3d4fdcd1 100644
--- a/src/components/UI/Summary.tsx
+++ b/src/components/UI/Summary.tsx
@@ -1,51 +1,55 @@
-import { FC } from 'react';
-import {
- Group, Header, MiniInfoCell,
-} from '@vkontakte/vkui';
-import { Icon20EducationOutline, Icon28BrainOutline } from '@vkontakte/icons';
-import Mark from './Mark';
-import { TMark } from '../../types';
+import { Group, Header, MiniInfoCell } from '@vkontakte/vkui'
+import { Icon20EducationOutline, Icon28BrainOutline } from '@vkontakte/icons'
+import { FC } from 'preact/compat'
+import Mark from './Mark'
+import { TMark } from '../../types'
interface ISummary {
- totalNumberOfMarks: string | null;
- averageMark: number | null;
- markCounts: Record | null;
+ totalNumberOfMarks: string | null
+ averageMark: number | null
+ markCounts: Record | null
}
-const Summary: FC = ({ markCounts, totalNumberOfMarks, averageMark }) => (
- Статистика}>
+const Summary: FC = ({
+ markCounts,
+ totalNumberOfMarks,
+ averageMark,
+}) => (
+ Статистика}>
}
- after={}
+ after={}
>
Суммарное количество оценок:
}
- after={}
+ before={
+
+ }
+ after={}
>
Общий средний балл:
{markCounts && (
-
- {[2, 3, 4, 5].map((mark) => (
- markCounts[mark] > 0 && (
- }
- >
- x
- {' '}
- {markCounts[mark]}
-
- )
- ))}
-
+
+ {[2, 3, 4, 5].map(
+ (mark) =>
+ markCounts[mark] > 0 && (
+ }>
+ x {markCounts[mark]}
+
+ )
+ )}
+
)}
-);
+)
-export default Summary;
+export default Summary
diff --git a/src/components/UI/Suspense.tsx b/src/components/UI/Suspense.tsx
index 583914e8..7742df41 100644
--- a/src/components/UI/Suspense.tsx
+++ b/src/components/UI/Suspense.tsx
@@ -1,34 +1,37 @@
-import { FC, ReactNode, Suspense as ReactSuspense } from 'react';
-import { PanelSpinner, ScreenSpinner, Spinner } from '@vkontakte/vkui';
+import { PanelSpinner, ScreenSpinner, Spinner } from '@vkontakte/vkui'
+import { FC, ReactNode, Suspense as ReactSuspense } from 'preact/compat'
interface ISpinner {
- size?: 'small' | 'regular' | 'medium' | 'large',
- mode?: 'panel' | 'screen' | 'default',
+ size?: 'small' | 'regular' | 'medium' | 'large'
+ mode?: 'panel' | 'screen' | 'default'
}
interface ISuspense extends ISpinner {
- children: ReactNode,
- id: string,
+ children: ReactNode
+ id: string
}
const SpinnerWrapper: FC = ({ size, mode }) => {
switch (mode) {
case 'panel':
- return ;
+ return
case 'screen':
- return ;
+ return
case 'default':
default:
- return ;
+ return
}
-};
+}
const Suspense: FC = ({
- children, size = 'regular', id, mode = 'panel',
+ children,
+ size = 'regular',
+ id,
+ mode = 'panel',
}) => (
}>
{children}
-);
+)
-export default Suspense;
+export default Suspense
diff --git a/src/components/UI/Tabbar.tsx b/src/components/UI/Tabbar.tsx
index de042aec..1e498734 100644
--- a/src/components/UI/Tabbar.tsx
+++ b/src/components/UI/Tabbar.tsx
@@ -1,80 +1,95 @@
-import { FC } from 'react';
-import { TabbarItem, Tabbar as VKUITabbar, useAdaptivityConditionalRender } from '@vkontakte/vkui';
import {
+ TabbarItem,
+ Tabbar as VKUITabbar,
+ useAdaptivityConditionalRender,
+} from '@vkontakte/vkui'
+import {
+ Icon28BookSpreadOutline,
Icon28EducationOutline,
Icon28GraphOutline,
Icon28HelpOutline,
Icon28HomeOutline,
Icon28SettingsOutline,
- Icon28BookSpreadOutline,
-} from '@vkontakte/icons';
+} from '@vkontakte/icons'
+import { FC } from 'preact/compat'
import {
- VIEW_ATTESTATION, VIEW_CONTACTS, VIEW_MARKS, VIEW_NOTIFICATIONS, VIEW_SCHEDULE, VIEW_SETTINGS,
-} from '../../routes';
-import { Pages } from '../../types';
+ VIEW_ATTESTATION,
+ VIEW_CONTACTS,
+ VIEW_MARKS,
+ VIEW_NOTIFICATIONS,
+ VIEW_SCHEDULE,
+ VIEW_SETTINGS,
+} from '../../routes'
+import { Pages } from '../../types'
interface ITabbar {
- onStoryChange: (current: Pages) => void;
- activeView: Pages;
+ onStoryChange: (current: Pages) => void
+ activeView: Pages
}
const Tabbar: FC = ({ onStoryChange, activeView }) => {
- const { viewWidth } = useAdaptivityConditionalRender();
+ const { viewWidth } = useAdaptivityConditionalRender()
return (
viewWidth.tabletMinus && (
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
onStoryChange(VIEW_SCHEDULE)}
selected={activeView === VIEW_SCHEDULE}
data-story={VIEW_SCHEDULE}
- text='Главная'
+ text="Главная"
>
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
onStoryChange(VIEW_MARKS)}
selected={activeView === VIEW_MARKS}
data-story={VIEW_MARKS}
- text='Успеваемость'
+ text="Успеваемость"
>
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
onStoryChange(VIEW_ATTESTATION)}
selected={activeView === VIEW_ATTESTATION}
data-story={VIEW_ATTESTATION}
- text='Аттестация'
+ text="Аттестация"
>
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
onStoryChange(VIEW_NOTIFICATIONS)}
selected={activeView === VIEW_NOTIFICATIONS}
data-story={VIEW_NOTIFICATIONS}
- text='Объявления'
+ text="Объявления"
>
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
onStoryChange(VIEW_CONTACTS)}
selected={activeView === VIEW_CONTACTS}
data-story={VIEW_CONTACTS}
- text='Помощь'
+ text="Помощь"
>
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
onStoryChange(VIEW_SETTINGS)}
selected={activeView === VIEW_SETTINGS}
data-story={VIEW_SETTINGS}
- text='Настройки'
+ text="Настройки"
>
)
- );
-};
+ )
+}
-export default Tabbar;
+export default Tabbar
diff --git a/src/components/UserInfo.tsx b/src/components/UserInfo.tsx
index 0f34c460..b838689a 100644
--- a/src/components/UserInfo.tsx
+++ b/src/components/UserInfo.tsx
@@ -1,17 +1,25 @@
-import { CSSProperties, useEffect, useState } from 'react';
+import { CSSProperties, useEffect, useState } from 'react'
import {
- Avatar, Button, Div, Gradient, Group, Header, ScreenSpinner, SimpleCell, Spinner, Text, Title,
-} from '@vkontakte/vkui';
-import { Icon28SchoolOutline, Icon20RefreshOutline } from '@vkontakte/icons';
-
-import bridge from '@vkontakte/vk-bridge';
-import { useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import { Organization } from 'diary-shared';
-import { getVkStorageData } from '../methods';
-import { useModal } from '../modals/ModalContext';
-import { useRateLimitExceeded } from '../hooks';
-import { MODAL_COLLEGE_INFO } from '../modals/ModalRoot';
-import getCollegeInfo from '../methods/server/getCollegeInfo';
+ Avatar,
+ Button,
+ Div,
+ Gradient,
+ Group,
+ Header,
+ ScreenSpinner,
+ SimpleCell,
+ Spinner,
+ Text,
+ Title,
+} from '@vkontakte/vkui'
+import { Icon20RefreshOutline, Icon28SchoolOutline } from '@vkontakte/icons'
+
+import bridge from '@vkontakte/vk-bridge'
+import { useRouteNavigator } from '@vkontakte/vk-mini-apps-router'
+// import { Organization } from 'diary-shared';
+import { useRateLimitExceeded } from '../hooks'
+import { MODAL_COLLEGE_INFO } from '../modals/ModalRoot'
+import { getCollegeInfo } from '../methods'
const styles: CSSProperties = {
margin: 0,
@@ -21,7 +29,7 @@ const styles: CSSProperties = {
justifyContent: 'center',
textAlign: 'center',
padding: 32,
-};
+}
interface UserData {
city: string
@@ -32,76 +40,76 @@ interface UserData {
const getUserAva = async (): Promise => {
try {
- const data = await bridge.send('VKWebAppGetUserInfo');
+ const data = await bridge.send('VKWebAppGetUserInfo')
if (data.id) {
- localStorage.setItem('ava', data.photo_100);
- return data.photo_100;
+ localStorage.setItem('ava', data.photo_100)
+ return data.photo_100
}
- return null;
+ return null
} catch (error) {
- console.error(error);
- return null;
+ console.error(error)
+ return null
}
-};
+}
const UserInfo = () => {
- const routeNavigator = useRouteNavigator();
+ const routeNavigator = useRouteNavigator()
- const { openCollegeModal } = useModal();
+ // Const { openCollegeModal } = useModal();
- const [isLoading, setIsLoading] = useState(false);
- const [isCollegeLoading, setIsCollegeLoading] = useState(false);
- const [userAva, setUserAva] = useState();
+ const [isLoading, setIsLoading] = useState(false)
+ const [isCollegeLoading, setIsCollegeLoading] = useState(false)
+ const [userAva, setUserAva] = useState()
const [userData, setUserData] = useState({
name: '',
org: '',
city: '',
group: '',
- });
+ })
const getCollegeInfoFromServer = async () => {
- setIsCollegeLoading(true);
+ setIsCollegeLoading(true)
try {
- const data = await getCollegeInfo();
+ const data = await getCollegeInfo()
if (data === 429) {
- useRateLimitExceeded();
- return;
+ useRateLimitExceeded()
+ return
}
- await routeNavigator.showModal(MODAL_COLLEGE_INFO);
- openCollegeModal(data as Organization);
- setIsCollegeLoading(false);
+ await routeNavigator.showModal(MODAL_COLLEGE_INFO)
+ // OpenCollegeModal(data as Organization);
+ setIsCollegeLoading(false)
} catch (e) {
- console.error(e);
+ console.error(e)
}
- };
+ }
const getUserInfo = async (handle?: boolean) => {
- setIsLoading(true);
+ setIsLoading(true)
- const localData = localStorage.getItem('userData');
- const avaFromStorage = localStorage.getItem('ava');
+ const localData = localStorage.getItem('userData')
+ const avaFromStorage = localStorage.getItem('ava')
if (localData && !handle) {
- const parsedData = JSON.parse(localData) as UserData;
+ const parsedData = JSON.parse(localData) as UserData
if (parsedData.name && parsedData.group) {
- setUserData(parsedData);
+ setUserData(parsedData)
if (avaFromStorage) {
- setUserAva(avaFromStorage);
+ setUserAva(avaFromStorage)
}
- setIsLoading(false);
- return;
+ setIsLoading(false)
+ return
}
}
- const newUserData = await getVkStorageData(['data']);
- const parsedUserData = JSON.parse(newUserData.keys[0].value) as UserData;
+ const newUserData = localStorage.getItem('data')
+ const parsedUserData = JSON.parse(newUserData) as UserData
- const ava = await getUserAva();
+ const ava = await getUserAva()
if (ava) {
- setUserAva(ava);
+ setUserAva(ava)
}
setUserData({
@@ -109,71 +117,75 @@ const UserInfo = () => {
org: parsedUserData.org || '',
city: parsedUserData.city || '',
group: parsedUserData.group || '',
- });
+ })
- localStorage.setItem('userData', JSON.stringify(newUserData));
+ localStorage.setItem('userData', JSON.stringify(newUserData))
- setIsLoading(false);
- };
+ setIsLoading(false)
+ }
useEffect(() => {
- getUserInfo();
- }, []);
+ getUserInfo()
+ }, [])
if (isLoading) {
return (
- );
+ )
}
const header = (
}
- aria-label='Обновить'
- mode='tertiary'
+ aria-label="Обновить"
+ mode="tertiary"
onClick={() => getUserInfo(true)}
/>
- )}
- mode='tertiary'
+ }
+ mode="tertiary"
>
Личная информация
- );
+ )
return (
-
-
+
+
-
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
+
{userData.name}
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
- Студент (
- {userData.group}
- )
+ Студент ({userData.group})
- Учебное заведение}>
+ Учебное заведение}
+ >
{isCollegeLoading && }
- } subtitle={userData.city} onClick={getCollegeInfoFromServer}>
+ }
+ subtitle={userData.city}
+ onClick={getCollegeInfoFromServer}
+ >
{userData.org}
- );
-};
+ )
+}
-export default UserInfo;
+export default UserInfo
diff --git a/src/components/data.ts b/src/components/data.ts
index 036b97f7..e1143acf 100644
--- a/src/components/data.ts
+++ b/src/components/data.ts
@@ -1,33 +1,33 @@
-import { IHelpAccordion } from './HelpAccordion';
+import { IHelpAccordion } from './HelpAccordion'
export const helpData: IHelpAccordion[] = [
{
id: 1,
title: 'Часто приходится удалять сервис',
detail:
- 'Как правило, эта проблема появляется на телефонах. Одно из возможных решений — не заходить по прямой ссылке в '
- + 'сервис, а через страницу Сервисы -> Для вас -> Дневник СПО.',
+ 'Как правило, эта проблема появляется на телефонах. Одно из возможных решений — не заходить по прямой ссылке в ' +
+ 'сервис, а через страницу Сервисы -> Для вас -> Дневник СПО.',
},
{
id: 2,
title: 'В сервисе стоит оценка, которой нет в журнале Сетевого города',
detail:
- 'Иногда в журнале может появиться отметка, которой нет в оригинальном дневнике (Сетевой город). Обычно это \'Д\''
- + ' (Долг), но если вы уверены, что долга у вас нет, то напишите нам.',
+ "Иногда в журнале может появиться отметка, которой нет в оригинальном дневнике (Сетевой город). Обычно это 'Д'" +
+ ' (Долг), но если вы уверены, что долга у вас нет, то напишите нам.',
},
{
id: 3,
title: 'На странице Успеваемость нет данных обо мне',
detail:
- 'Если на странице Успеваемость нет данных о вас, то перезайдите в сервис (Настройки - Выйти), но если они '
- + 'неправильные, то сообщите нам. Все данные, кроме аватарки, мы берём из Сетевого города.',
+ 'Если на странице Успеваемость нет данных о вас, то перезайдите в сервис (Настройки - Выйти), но если они ' +
+ 'неправильные, то сообщите нам. Все данные, кроме аватарки, мы берём из Сетевого города.',
},
{
id: 4,
title: 'Везде ошибка загрузки данных',
detail:
- 'Если вы при заходе на любую страницу получаете ошибку загрузки данных с сервера, то тут может быть несколько '
- + 'проблем: 1. Сервер сетевого города или наш упал(и) — обычно мы сообщаем об этом в группе. 2. Ваша cookie '
- + 'устарела и вам надо получить новую — перезайдите в аккаунт или обновите её в настройках.',
+ 'Если вы при заходе на любую страницу получаете ошибку загрузки данных с сервера, то тут может быть несколько ' +
+ 'проблем: 1. Сервер сетевого города или наш упал(и) — обычно мы сообщаем об этом в группе. 2. Ваша cookie ' +
+ 'устарела и вам надо получить новую — перезайдите в аккаунт или обновите её в настройках.',
},
-];
+]
diff --git a/src/hooks/index.tsx b/src/hooks/index.tsx
index deb23265..3bc4911d 100644
--- a/src/hooks/index.tsx
+++ b/src/hooks/index.tsx
@@ -1,4 +1,4 @@
-export { default as useRateLimitExceeded } from './useRateLimitExceeded';
-export { default as useSnackbar } from './useSnackbar';
-export { default as useScrollPosition } from './useScrollPosition';
-export { default as useDebouncedChangeWeek } from './useDebouncedChangeWeek';
+export { default as useRateLimitExceeded } from './useRateLimitExceeded'
+export { default as useSnackbar } from './useSnackbar'
+export { default as useScrollPosition } from './useScrollPosition'
+export { default as useDebouncedChangeWeek } from './useDebouncedChangeWeek'
diff --git a/src/hooks/useDebouncedChangeWeek.tsx b/src/hooks/useDebouncedChangeWeek.tsx
index bbab0dec..8f5d702e 100644
--- a/src/hooks/useDebouncedChangeWeek.tsx
+++ b/src/hooks/useDebouncedChangeWeek.tsx
@@ -1,59 +1,63 @@
-import { useCallback, useState } from 'react';
+import { useCallback, useState } from 'preact/hooks'
interface SendToServerIfValid {
- (start: Date, end: Date): void;
+ (start: Date, end: Date): void
}
+
const useDebouncedChangeWeek = (
startDate: Date,
endDate: Date,
setIsCurrent: (value: boolean) => void,
setStartDate: (startDate: Date) => void,
- setEndDate: (endDate: Date) => void,
+ setEndDate: (endDate: Date) => void
) => {
- const [clickCount, setClickCount] = useState(0);
- const [timeoutId, setTimeoutId] = useState(null);
+ const [clickCount, setClickCount] = useState(0)
+ const [timeoutId, setTimeoutId] = useState(null)
const debouncedChangeWeek = useCallback(
(direction: 'prev' | 'next', sendToServerIfValid: SendToServerIfValid) => {
- localStorage.setItem('isCurrent', JSON.stringify(false));
- setIsCurrent(false);
- const newStartDate = new Date(startDate);
- const newEndDate = new Date(endDate);
+ localStorage.setItem('isCurrent', JSON.stringify(false))
+ setIsCurrent(false)
+ const newStartDate = new Date(startDate)
+ const newEndDate = new Date(endDate)
if (clickCount > 0) {
- const weekDifference = clickCount * 7;
- newStartDate.setDate(newStartDate.getDate() + weekDifference);
- newEndDate.setDate(newEndDate.getDate() + weekDifference);
- setClickCount(0);
+ const weekDifference = clickCount * 7
+ newStartDate.setDate(newStartDate.getDate() + weekDifference)
+ newEndDate.setDate(newEndDate.getDate() + weekDifference)
+ setClickCount(0)
} else if (direction === 'prev') {
- newStartDate.setDate(newStartDate.getDate() - 7);
- newEndDate.setDate(newEndDate.getDate() - 7);
+ newStartDate.setDate(newStartDate.getDate() - 7)
+ newEndDate.setDate(newEndDate.getDate() - 7)
} else if (direction === 'next') {
- newStartDate.setDate(newStartDate.getDate() + 7);
- newEndDate.setDate(newEndDate.getDate() + 7);
+ newStartDate.setDate(newStartDate.getDate() + 7)
+ newEndDate.setDate(newEndDate.getDate() + 7)
}
- sendToServerIfValid(newStartDate, newEndDate);
- setStartDate(newStartDate);
- setEndDate(newEndDate);
+ sendToServerIfValid(newStartDate, newEndDate)
+ setStartDate(newStartDate)
+ setEndDate(newEndDate)
},
- [clickCount, startDate, endDate, setIsCurrent, setStartDate, setEndDate],
- );
-
- const handleButtonClick = (direction: 'prev' | 'next', sendToServerIfValid: SendToServerIfValid) => {
- setClickCount((prevCount) => prevCount + 1);
+ [clickCount, startDate, endDate, setIsCurrent, setStartDate, setEndDate]
+ )
+
+ const handleButtonClick = (
+ direction: 'prev' | 'next',
+ sendToServerIfValid: SendToServerIfValid
+ ) => {
+ setClickCount((prevCount) => prevCount + 1)
if (timeoutId) {
- clearTimeout(timeoutId);
+ clearTimeout(timeoutId)
}
const newTimeoutId = setTimeout(() => {
- debouncedChangeWeek(direction, sendToServerIfValid);
- setClickCount(0);
- }, 500);
+ debouncedChangeWeek(direction, sendToServerIfValid)
+ setClickCount(0)
+ }, 500)
- setTimeoutId(newTimeoutId);
- };
+ setTimeoutId(newTimeoutId)
+ }
- return { handleButtonClick };
-};
+ return { handleButtonClick }
+}
-export default useDebouncedChangeWeek;
+export default useDebouncedChangeWeek
diff --git a/src/hooks/useRateLimitExceeded.tsx b/src/hooks/useRateLimitExceeded.tsx
index 734dee34..9c132ef3 100644
--- a/src/hooks/useRateLimitExceeded.tsx
+++ b/src/hooks/useRateLimitExceeded.tsx
@@ -1,24 +1,27 @@
-import { ReactNode, useState } from 'react';
-import { Snackbar } from '@vkontakte/vkui';
-import { Icon28ErrorCircleOutline } from '@vkontakte/icons';
+import { Snackbar } from '@vkontakte/vkui'
+import { Icon28ErrorCircleOutline } from '@vkontakte/icons'
+import { useState } from 'preact/hooks'
+import { ReactNode } from 'preact/compat'
const useRateLimitExceeded = (): [ReactNode | null, () => void] => {
- const [rateSnackbar, setRateSnackbar] = useState(null);
+ const [rateSnackbar, setRateSnackbar] = useState(null)
const handleRateLimitExceeded = () => {
setRateSnackbar(
setRateSnackbar(null)}
- before={}
- subtitle='Вы временно заблокированы. Если вы считаете, что это ошибка, то сообщите нам'
+ before={
+
+ }
+ subtitle="Вы временно заблокированы. Если вы считаете, что это ошибка, то сообщите нам"
>
Слишком частые запросы
- ,
- );
- };
+
+ )
+ }
- return [rateSnackbar, handleRateLimitExceeded];
-};
+ return [rateSnackbar, handleRateLimitExceeded]
+}
-export default useRateLimitExceeded;
+export default useRateLimitExceeded
diff --git a/src/hooks/useScrollPosition.tsx b/src/hooks/useScrollPosition.tsx
index 53b42e7c..0a555e69 100644
--- a/src/hooks/useScrollPosition.tsx
+++ b/src/hooks/useScrollPosition.tsx
@@ -1,21 +1,21 @@
-import { useState, useEffect } from 'react';
+import { useEffect, useState } from 'preact/hooks'
const useScrollPosition = () => {
- const [scrollPosition, setScrollPosition] = useState(0);
+ const [scrollPosition, setScrollPosition] = useState(0)
const handleScroll = () => {
- const currentPosition = window.scrollY;
- setScrollPosition(currentPosition);
- };
+ const currentPosition = window.scrollY
+ setScrollPosition(currentPosition)
+ }
useEffect(() => {
- window.addEventListener('scroll', handleScroll);
+ window.addEventListener('scroll', handleScroll)
return () => {
- window.removeEventListener('scroll', handleScroll);
- };
- }, []);
+ window.removeEventListener('scroll', handleScroll)
+ }
+ }, [])
- return scrollPosition;
-};
+ return scrollPosition
+}
-export default useScrollPosition;
+export default useScrollPosition
diff --git a/src/hooks/useSnackbar.tsx b/src/hooks/useSnackbar.tsx
index 9ab8c928..cbb70ee0 100644
--- a/src/hooks/useSnackbar.tsx
+++ b/src/hooks/useSnackbar.tsx
@@ -1,33 +1,41 @@
-import React, { ReactNode, useCallback, useState } from 'react';
-import { Snackbar, SnackbarProps } from '@vkontakte/vkui';
-import { Icon28InfoCircleOutline } from '@vkontakte/icons';
+import { Snackbar, SnackbarProps } from '@vkontakte/vkui'
+import { Icon28InfoCircleOutline } from '@vkontakte/icons'
+import { CSSProperties, ReactNode } from 'preact/compat'
+import { useCallback, useState } from 'preact/hooks'
export interface SnackbarData {
- layout?: SnackbarProps['layout'];
- icon?: ReactNode;
- action?: string;
- onActionClick?: () => void;
- onClose?: () => void;
- duration?: number;
- style?: React.CSSProperties;
- title: string;
- subtitle?: string;
+ layout?: SnackbarProps['layout']
+ icon?: ReactNode
+ action?: string
+ onActionClick?: () => void
+ onClose?: () => void
+ duration?: number
+ style?: CSSProperties
+ title: string
+ subtitle?: string
}
-const useSnackbar = (): [ReactNode | null, (snackbarData: SnackbarData | null) => void] => {
- const [snackbar, setSnackbar] = useState(null);
+const useSnackbar = (): [
+ ReactNode | null,
+ (snackbarData: SnackbarData | null) => void,
+] => {
+ const [snackbar, setSnackbar] = useState(null)
const showSnackbar = useCallback((snackbarData: SnackbarData | null) => {
if (!snackbarData) {
- setSnackbar(null);
- return null;
+ setSnackbar(null)
+ return null
}
setSnackbar(
setSnackbar(null)}
- before={snackbarData.icon || }
+ before={
+ snackbarData.icon || (
+
+ )
+ }
action={snackbarData.action}
onActionClick={snackbarData.onActionClick}
duration={snackbarData.duration}
@@ -35,13 +43,13 @@ const useSnackbar = (): [ReactNode | null, (snackbarData: SnackbarData | null) =
subtitle={snackbarData.subtitle}
>
{snackbarData.title}
- ,
- );
+
+ )
- return null;
- }, []);
+ return null
+ }, [])
- return [snackbar, showSnackbar];
-};
+ return [snackbar, showSnackbar]
+}
-export default useSnackbar;
+export default useSnackbar
diff --git a/src/index.css b/src/index.css
index 82753354..59388051 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,16 +1,16 @@
._HorizontalCell__content_1q642_21 {
- word-break: unset !important;
+ word-break: unset !important;
}
-._SimpleCell__subtitle_rmh19_48, ._SimpleCell__extraSubtitle_rmh19_49 {
- width: 100%;
+._SimpleCell__subtitle_rmh19_48, ._SimpleCell__extraSubtitle_rmh19_49, .lesson ._Typography_182ve_1 {
+ width: 100%;
}
@media (max-width: 767.9px) {
- ._Tappable--sizeX-none_49f5u_121 {
- border-radius: 8px !important;
- }
+ ._Tappable--sizeX-none_49f5u_121 {
+ border-radius: 8px !important;
+ }
+}
+._HorizontalCell_1q642_1:first-child::before, ._HorizontalCell_1q642_1:last-child::after {
+ content: none !important;
}
- ._HorizontalCell_1q642_1:first-child::before, ._HorizontalCell_1q642_1:last-child::after {
- content: none !important;
- }
diff --git a/src/main.tsx b/src/main.tsx
index abb41303..9dc0e315 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -1,16 +1,12 @@
-import { lazy } from 'react';
-import { createRoot } from 'react-dom/client';
-import '@vkontakte/vkui/dist/cssm/styles/themes.css';
-import './index.css';
-import Suspense from './components/UI/Suspense';
+import { render } from 'preact'
+import './index.css'
+import '@vkontakte/vkui/dist/vkui.css'
+import Suspense from './components/UI/Suspense.tsx'
+import AppWrapper from './AppWrapper.tsx'
-const AppWrapper = lazy(() => import('./AppWrapper'));
-
-const domNode = document.getElementById('root')!;
-const root = createRoot(domNode);
-
-root.render(
-
+render(
+
,
-);
+ document.getElementById('app')!
+)
diff --git a/src/methods/bridge/appStorageSet.ts b/src/methods/bridge/appStorageSet.ts
deleted file mode 100644
index 11a33780..00000000
--- a/src/methods/bridge/appStorageSet.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import bridge from '@vkontakte/vk-bridge';
-
-export const appStorageSet = async (key: string, value: string): Promise => {
- try {
- const data = await bridge.send('VKWebAppStorageSet', {
- key,
- value,
- });
-
- if (data.result) {
- return data.result;
- }
-
- return false;
- } catch (error) {
- console.error(error);
- return error as string;
- }
-};
diff --git a/src/methods/bridge/getCookie.ts b/src/methods/bridge/getCookie.ts
deleted file mode 100644
index 3d7113da..00000000
--- a/src/methods/bridge/getCookie.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import bridge from '@vkontakte/vk-bridge';
-
-export const getCookie = async () => {
- try {
- const data = await bridge.send('VKWebAppStorageGet', {
- keys: ['cookie'],
- });
- if (data.keys) {
- console.log(data.keys);
- return data.keys[0].value;
- }
- return null;
- } catch (error) {
- console.error(error);
- return null;
- }
-};
diff --git a/src/methods/bridge/getUserId.ts b/src/methods/bridge/getUserId.ts
deleted file mode 100644
index e02faea0..00000000
--- a/src/methods/bridge/getUserId.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import bridge from '@vkontakte/vk-bridge';
-
-export const getUserId = async () => {
- try {
- const data = await bridge.send('VKWebAppStorageGet', {
- keys: ['id'],
- });
-
- if (data.keys) {
- return data.keys[0].value;
- }
- return 'no id';
- } catch (error) {
- console.error(error);
- return false;
- }
-};
diff --git a/src/methods/bridge/getVkStorageData.ts b/src/methods/bridge/getVkStorageData.ts
deleted file mode 100644
index 5e3e0dac..00000000
--- a/src/methods/bridge/getVkStorageData.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import bridge from '@vkontakte/vk-bridge';
-
-interface VKWebAppStorageGetResponse {
- keys: {
- key: string;
- value: string;
- }[]
-}
-
-export const getVkStorageData = async (keys: string[]): Promise => {
- try {
- return await bridge.send('VKWebAppStorageGet', {
- keys,
- });
- } catch (error) {
- console.error(error);
- return { keys: [] };
- }
-};
diff --git a/src/methods/bridge/getVkStorageKeys.ts b/src/methods/bridge/getVkStorageKeys.ts
deleted file mode 100644
index 419becf1..00000000
--- a/src/methods/bridge/getVkStorageKeys.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import bridge from '@vkontakte/vk-bridge';
-
-export const getVkStorageKeys = async () => {
- try {
- const data = await bridge.send('VKWebAppStorageGetKeys', {
- count: 20,
- offset: 0,
- });
-
- return data.keys || [];
- } catch (error) {
- console.error(error);
- return [];
- }
-};
diff --git a/src/methods/index.ts b/src/methods/index.ts
index cdc26ce5..c273ba73 100644
--- a/src/methods/index.ts
+++ b/src/methods/index.ts
@@ -1,12 +1,15 @@
-import { getVkStorageData } from './bridge/getVkStorageData';
-import { getVkStorageKeys } from './bridge/getVkStorageKeys';
-import { appStorageSet } from './bridge/appStorageSet';
-import { getCookie } from './bridge/getCookie';
-import { getUserId } from './bridge/getUserId';
-
-import { getPerformance } from './server/getPerformance';
-import { getLessons } from './server/getLessons';
+import { getPerformance } from './server/getPerformance'
+import { getLessons } from './server/getLessons'
+import { getAds } from './server/getAds.ts'
+import { getAttestation } from './server/getAttestation.ts'
+import { getCollegeInfo } from './server/getCollegeInfo.ts'
+import makeRequest from './server/makeRequest'
export {
- getCookie, getUserId, getLessons, appStorageSet, getPerformance, getVkStorageData, getVkStorageKeys,
-};
+ getLessons,
+ getPerformance,
+ getAds,
+ makeRequest,
+ getAttestation,
+ getCollegeInfo,
+}
diff --git a/src/methods/server/getAds.ts b/src/methods/server/getAds.ts
index c9d2ebb0..b4e01a37 100644
--- a/src/methods/server/getAds.ts
+++ b/src/methods/server/getAds.ts
@@ -1,6 +1,5 @@
-import { NotificationsResponse } from 'diary-shared';
-import makeRequest from './makeRequest';
+import { NotificationsResponse } from 'diary-shared'
+import makeRequest from './makeRequest'
-const getAds = async (): Promise => makeRequest('/ads');
-
-export default getAds;
+export const getAds = async (): Promise =>
+ makeRequest('/ads')
diff --git a/src/methods/server/getAttestation.ts b/src/methods/server/getAttestation.ts
index 13536085..8000210d 100644
--- a/src/methods/server/getAttestation.ts
+++ b/src/methods/server/getAttestation.ts
@@ -1,17 +1,15 @@
-import { AttestationResponse } from 'diary-shared';
-import { getCookie } from '../bridge/getCookie';
-import { getUserId } from '../bridge/getUserId';
-import makeRequest from './makeRequest';
+import { AttestationResponse } from 'diary-shared'
+import makeRequest from './makeRequest'
-const getAttestation = async (): Promise => {
- const cookie = await getCookie() ?? localStorage.getItem('cookie');
- const id = await getUserId();
+export const getAttestation = async (): Promise<
+ AttestationResponse | 418 | 429
+> => {
+ const cookie = localStorage.getItem('cookie')
+ const id = localStorage.getItem('id')
if (!cookie) {
- return 418;
+ return 418
}
- return makeRequest(`/attestation/${id}`);
-};
-
-export default getAttestation;
+ return makeRequest(`/attestation/${id}`)
+}
diff --git a/src/methods/server/getCollegeInfo.ts b/src/methods/server/getCollegeInfo.ts
index 3adf248d..8f37afe5 100644
--- a/src/methods/server/getCollegeInfo.ts
+++ b/src/methods/server/getCollegeInfo.ts
@@ -1,15 +1,5 @@
-import { Organization } from 'diary-shared';
-import { getCookie } from '../bridge/getCookie';
-import makeRequest from './makeRequest';
+import { Organization } from 'diary-shared'
+import makeRequest from './makeRequest'
-const getCollegeInfo = async (): Promise => {
- const cookie = await getCookie() ?? localStorage.getItem('cookie');
-
- if (!cookie) {
- return 418;
- }
-
- return makeRequest('/organization');
-};
-
-export default getCollegeInfo;
+export const getCollegeInfo = async (): Promise =>
+ makeRequest('/organization')
diff --git a/src/methods/server/getLessons.ts b/src/methods/server/getLessons.ts
index 92360355..4f3fa588 100644
--- a/src/methods/server/getLessons.ts
+++ b/src/methods/server/getLessons.ts
@@ -1,32 +1,30 @@
-import { Day } from 'diary-shared';
-import formatDateForRequest from '../../utils/formatDateForRequest';
-import { getUserId } from '../bridge/getUserId';
-import { getCookie } from '../bridge/getCookie';
-import makeRequest from './makeRequest';
+import { Day } from 'diary-shared'
+import formatDateForRequest from '../../utils/formatDateForRequest'
+import makeRequest from './makeRequest'
-export const getLessons = async (startDate?: Date, endDate?: Date): Promise => {
- const cookie = await getCookie() ?? localStorage.getItem('cookie');
- const id = await getUserId() || localStorage.getItem('id');
+export const getLessons = async (
+ startDate?: Date,
+ endDate?: Date
+): Promise => {
+ const id = localStorage.getItem('id')
if (!id) {
- return 418;
- }
-
- if (!cookie) {
- return 418;
+ return 418
}
if (!startDate) {
- startDate = new Date();
+ startDate = new Date()
}
if (!endDate) {
- endDate = new Date();
- endDate.setDate(endDate.getDate() + 7);
+ endDate = new Date()
+ endDate.setDate(endDate.getDate() + 7)
}
- const formattedStartDate = formatDateForRequest(startDate);
- const formattedEndDate = formatDateForRequest(endDate);
+ const formattedStartDate = formatDateForRequest(startDate)
+ const formattedEndDate = formatDateForRequest(endDate)
- return makeRequest(`/lessons/${id}/${formattedStartDate}/${formattedEndDate}`);
-};
+ return makeRequest(
+ `/lessons/${id}/${formattedStartDate}/${formattedEndDate}`
+ )
+}
diff --git a/src/methods/server/getPerformance.ts b/src/methods/server/getPerformance.ts
index d9a70cfa..4d040cc0 100644
--- a/src/methods/server/getPerformance.ts
+++ b/src/methods/server/getPerformance.ts
@@ -1,16 +1,15 @@
-import { PerformanceCurrent } from 'diary-shared';
-import { getCookie } from '../bridge/getCookie';
-import { getUserId } from '../bridge/getUserId';
-import makeRequest from './makeRequest';
+import { PerformanceCurrent } from 'diary-shared'
+import makeRequest from './makeRequest'
-export const getPerformance = async (): Promise => {
- const cookie = await getCookie() ?? localStorage.getItem('cookie');
- const id = await getUserId() || localStorage.getItem('id');
- console.log(id);
- console.log(cookie);
- if (!cookie) {
- return 418;
+export const getPerformance = async (): Promise<
+ PerformanceCurrent | 418 | 429
+> => {
+ const id = localStorage.getItem('id')
+ console.log(id)
+
+ if (!id) {
+ return 418
}
- return makeRequest(`/performance.current/${id}`);
-};
+ return makeRequest(`/performance.current/${id}`)
+}
diff --git a/src/methods/server/makeRequest.ts b/src/methods/server/makeRequest.ts
index f1db2639..535c1efc 100644
--- a/src/methods/server/makeRequest.ts
+++ b/src/methods/server/makeRequest.ts
@@ -1,15 +1,17 @@
-import { getCookie } from '../bridge/getCookie';
-
// TODO: move to config
-const BASE_URL = import.meta.env.VITE_SERVER_URL as string ?? '';
-const SECOND_SERVER_URL = import.meta.env.VITE_SERVER_URL_SECOND as string ?? '';
+//@ts-ignore типы React не совсем совместимы с Preact
+const BASE_URL = (import.meta.env.VITE_SERVER_URL as string) ?? ''
+//@ts-ignore типы React не совсем совместимы с Preact
+const SECOND_SERVER_URL =
+ (import.meta.env.VITE_SERVER_URL_SECOND as string) ?? ''
-const makeRequest = async (route: string): Promise< T | 418 | 429> => {
- const cookie = localStorage.getItem('cookie') ?? sessionStorage.getItem('cookie') ?? await getCookie();
- const url = `${BASE_URL}${route}`;
+const makeRequest = async (route: string): Promise => {
+ const cookie =
+ localStorage.getItem('cookie') ?? sessionStorage.getItem('cookie')
+ const url = `${BASE_URL}${route}`
if (!cookie) {
- return 418;
+ return 418
}
try {
@@ -19,14 +21,14 @@ const makeRequest = async (route: string): Promise< T | 418 | 429> => {
'Content-Type': 'application/json;charset=UTF-8',
secret: cookie,
},
- });
+ })
if (response.status === 429) {
- console.log(response.status);
- return response.status;
+ console.log(response.status)
+ return response.status
}
- console.log(response.ok);
+ console.log(response.ok)
if (!response.ok) {
const secondServerResponse = await fetch(SECOND_SERVER_URL + route, {
method: 'GET',
@@ -34,21 +36,21 @@ const makeRequest = async (route: string): Promise< T | 418 | 429> => {
'Content-Type': 'application/json;charset=UTF-8',
secret: cookie,
},
- });
+ })
if (secondServerResponse.status === 429) {
- console.log(secondServerResponse.status);
- return secondServerResponse.status;
+ console.log(secondServerResponse.status)
+ return secondServerResponse.status
}
if (!secondServerResponse.ok) {
- throw new Error(`Failed to fetch data from ${url} and SECOND_SERVER`);
+ throw new Error(`Failed to fetch data from ${url} and SECOND_SERVER`)
}
- return await secondServerResponse.json() as T;
+ return (await secondServerResponse.json()) as T
}
- return await response.json() as T;
+ return (await response.json()) as T
} catch (err) {
const secondServerResponse = await fetch(SECOND_SERVER_URL + route, {
method: 'GET',
@@ -56,20 +58,20 @@ const makeRequest = async (route: string): Promise< T | 418 | 429> => {
'Content-Type': 'application/json;charset=UTF-8',
secret: cookie,
},
- });
+ })
if (secondServerResponse.status === 429) {
- console.log(secondServerResponse.status);
- return secondServerResponse.status;
+ console.log(secondServerResponse.status)
+ return secondServerResponse.status
}
if (!secondServerResponse.ok) {
- throw new Error(`Failed to fetch data from ${url} and SECOND_SERVER`);
+ throw new Error(`Failed to fetch data from ${url} and SECOND_SERVER`)
}
- console.log(err);
- return await secondServerResponse.json() as T;
+ console.log(err)
+ return (await secondServerResponse.json()) as T
}
-};
+}
-export default makeRequest;
+export default makeRequest
diff --git a/src/modals/CollegeModal.tsx b/src/modals/CollegeModal.tsx
index 24dd1219..a9541dae 100644
--- a/src/modals/CollegeModal.tsx
+++ b/src/modals/CollegeModal.tsx
@@ -1,45 +1,47 @@
-import {
- Group, Header, InfoRow, Link, ModalPage, ModalPageHeader, SimpleCell,
-} from '@vkontakte/vkui';
-import { useModal } from './ModalContext';
-
-const CollegeModal = ({ id }: { id: string }) => {
- const { collegeModalData } = useModal();
-
- return (
-
- Подробнее о колледже
- Основная информация}>
-
- {collegeModalData?.name}
-
-
- {collegeModalData?.actualAddress}
-
-
- {collegeModalData?.directorName}
-
-
- Дополнительная информация}>
-
- {collegeModalData?.email}
-
-
- {collegeModalData?.fax}
-
-
- {collegeModalData?.phone}
-
-
-
-
- {collegeModalData?.site}
-
-
-
-
-
- );
-};
-
-export default CollegeModal;
+/*
+ * Import {
+ * Group, Header, InfoRow, Link, ModalPage, ModalPageHeader, SimpleCell,
+ * } from '@vkontakte/vkui';
+ * import { useModal } from './ModalContext';
+ *
+ * const CollegeModal = ({ id }: { id: string }) => {
+ * const { collegeModalData } = useModal();
+ *
+ * return (
+ *
+ * Подробнее о колледже
+ * Основная информация}>
+ *
+ * {collegeModalData?.name}
+ *
+ *
+ * {collegeModalData?.actualAddress}
+ *
+ *
+ * {collegeModalData?.directorName}
+ *
+ *
+ * Дополнительная информация}>
+ *
+ * {collegeModalData?.email}
+ *
+ *
+ * {collegeModalData?.fax}
+ *
+ *
+ * {collegeModalData?.phone}
+ *
+ *
+ *
+ *
+ * {collegeModalData?.site}
+ *
+ *
+ *
+ *
+ *
+ * );
+ * };
+ *
+ * export default CollegeModal;
+ */
diff --git a/src/modals/LessonModal.tsx b/src/modals/LessonModal.tsx
index 3324b5fb..eb94f2cf 100644
--- a/src/modals/LessonModal.tsx
+++ b/src/modals/LessonModal.tsx
@@ -1,44 +1,66 @@
-import { FC, useEffect, useState } from 'react';
import {
- Group, Header, InfoRow, ModalPage, ModalPageHeader, Separator, SimpleCell, Spacing, Text,
-} from '@vkontakte/vkui';
+ Group,
+ Header,
+ InfoRow,
+ ModalPage,
+ ModalPageHeader,
+ Separator,
+ SimpleCell,
+ Spacing,
+ Text,
+} from '@vkontakte/vkui'
import {
- AbsenceTypes, AbsenceTypesKeys, AbsenceTypesDescription, AbsenceTypesDescriptionKeys, Lesson, LessonType, LessonWorkType, TLesson,
-} from 'diary-shared';
-import setDefaultMark from '../utils/setDefaultMark';
-import textToLink from '../utils/textToLink';
-import { cleanData } from './data';
-import Mark from '../components/UI/Mark';
-import { useModal } from './ModalContext';
-import { Grade } from '../types';
-import ExplanationTooltip from '../components/UI/ExplanationTooltip';
+ AbsenceTypes,
+ AbsenceTypesDescription,
+ AbsenceTypesDescriptionKeys,
+ AbsenceTypesKeys,
+ Lesson,
+ LessonType,
+ LessonWorkType,
+ TLesson,
+} from 'diary-shared'
+import { FC } from 'preact/compat'
+import { useEffect, useState } from 'preact/hooks'
+import { useSelector } from 'react-redux'
+import setDefaultMark from '../utils/setDefaultMark'
+import textToLink from '../utils/textToLink'
+import { cleanData } from './data'
+import Mark from '../components/UI/Mark'
+import { Grade } from '../types'
+import ExplanationTooltip from '../components/UI/ExplanationTooltip'
+import { selectLessonModalData } from '../store/lessonSlice.ts'
interface ILessonModal {
- id: string;
+ id: string
}
const LessonModal: FC = ({ id }) => {
- const { lessonModalData } = useModal();
+ const lessonModalData = useSelector(selectLessonModalData)
- const [lessonData, setLessonData] = useState(cleanData);
+ const [lessonData, setLessonData] = useState(cleanData)
useEffect(() => {
if (lessonModalData) {
const {
- name, endTime, startTime, timetable, gradebook, tasks: tasksArray,
- } = lessonModalData;
+ name,
+ endTime,
+ startTime,
+ timetable,
+ gradebook,
+ tasks: tasksArray,
+ } = lessonModalData
- let lessonName = name || '';
+ let lessonName = name || ''
if (lessonName.includes('/')) {
- const parts = lessonName.split('/');
+ const parts = lessonName.split('/')
if (parts.length >= 2) {
- lessonName = parts[0];
- const additionalInfo = parts.slice(1).join('/');
+ lessonName = parts[0]
+ const additionalInfo = parts.slice(1).join('/')
if (additionalInfo.trim()) {
- lessonName += ` (${additionalInfo})`;
+ lessonName += ` (${additionalInfo})`
}
}
}
@@ -67,120 +89,137 @@ const LessonModal: FC = ({ id }) => {
},
startTime: startTime || 'Что-то не так с датой',
endTime: endTime || 'Что-то не так с датой',
- });
+ })
}
- }, [lessonModalData]);
+ }, [lessonModalData])
return (
Подробнее о паре
-
-
-
- )}
+
+
+
+ }
>
-
- {lessonData.name}
-
+ {lessonData.name}
-
+
{LessonWorkType[lessonData.gradebook?.lessonType as TLesson]}
-
- {lessonData.gradebook?.themes ? lessonData.gradebook?.themes.map((theme) => (
- textToLink(theme)
- )) : 'Не указана'}
+
+ {lessonData.gradebook?.themes
+ ? lessonData.gradebook?.themes.map((theme) => textToLink(theme))
+ : 'Не указана'}
-
+
{lessonData.timetable.teacher?.firstName
? `${lessonData?.timetable?.teacher?.lastName} ${lessonData.timetable.teacher?.firstName} ${lessonData.timetable.teacher?.middleName}`
: 'Не указан'}
- Место и время}>
+ Место и время}>
- )}
+ }
>
- {lessonData.timetable.classroom.name === '0'
- ? (
-
- )
- : lessonData.timetable.classroom.name}
+ {lessonData.timetable.classroom.name === '0' ? (
+
+ ) : (
+ lessonData.timetable.classroom.name
+ )}
- )}
+ }
>
- {lessonData.startTime.toLocaleString()}
- {' '}
- -
- {' '}
+ {lessonData.startTime.toLocaleString()} -{' '}
{lessonData.endTime.toLocaleString()}
- {((lessonData.gradebook?.tasks?.length && lessonData.gradebook.tasks.length > 0) || lessonData.gradebook?.absenceType)
- ? (
-
- 0) ||
+ lessonData.gradebook?.absenceType ? (
+
+
+
+ }
+ >
+ {lessonData.gradebook.tasks?.map((tasks, index) => (
+ <>
+ }
+ >
+ {LessonType[tasks.type]}
+
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
+ {tasks?.topic}
+
+
+
+
+
+ >
+ ))}
+ {lessonData.gradebook?.absenceType && (
+
-
+ }
+ >
+ {
+ AbsenceTypesDescription[
+ AbsenceTypes[
+ lessonData.gradebook?.absenceType
+ ] as AbsenceTypesDescriptionKeys
+ ]
+ }
+
)}
- >
- {lessonData.gradebook.tasks?.map((tasks, index) => (
- <>
- }>
-
- {LessonType[tasks.type]}
-
-
- {tasks?.topic}
-
-
-
-
-
- >
- ))}
- {lessonData.gradebook?.absenceType && (
- }>
- {AbsenceTypesDescription[AbsenceTypes[lessonData.gradebook?.absenceType] as AbsenceTypesDescriptionKeys]}
-
- )}
-
- ) : null}
+
+ ) : null}
- );
-};
+ )
+}
-export default LessonModal;
+export default LessonModal
diff --git a/src/modals/ModalContext.tsx b/src/modals/ModalContext.tsx
deleted file mode 100644
index 36358c9c..00000000
--- a/src/modals/ModalContext.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import React, {
- ReactNode, createContext, useContext, useState, useMemo,
-} from 'react';
-import { Lesson, Organization } from 'diary-shared';
-
-const ModalContext = createContext<{
- lessonModalData: Lesson | null;
- collegeModalData: Organization | null;
- openLessonModal:(data: Lesson) => void;
- openCollegeModal: (data: Organization) => void;
-} | undefined>(undefined);
-
-export const ModalProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
- const [lessonModalData, setLessonModalData] = useState(null);
- const [collegeModalData, setCollegeModalData] = useState(null);
-
- const openLessonModal = (data: Lesson) => {
- setLessonModalData(data);
- };
-
- const openCollegeModal = (data: Organization) => {
- setCollegeModalData(data);
- };
-
- const contextValue = useMemo(() => ({
- lessonModalData,
- collegeModalData,
- openLessonModal,
- openCollegeModal,
- }), [lessonModalData, collegeModalData]);
-
- return (
-
- {children}
-
- );
-};
-
-export const useModal = () => {
- const context = useContext(ModalContext);
- if (context === undefined) {
- throw new Error('useModal must be used within a ModalProvider');
- }
- return context;
-};
diff --git a/src/modals/ModalRoot.tsx b/src/modals/ModalRoot.tsx
index 7453851c..3a7f87d6 100644
--- a/src/modals/ModalRoot.tsx
+++ b/src/modals/ModalRoot.tsx
@@ -1,23 +1,27 @@
+import { ModalRoot as VKUIModalRoot } from '@vkontakte/vkui'
import {
- ModalRoot as VKUIModalRoot,
-} from '@vkontakte/vkui';
-import { useActiveVkuiLocation, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import LessonModal from './LessonModal';
-import CollegeModal from './CollegeModal';
+ useActiveVkuiLocation,
+ useRouteNavigator,
+} from '@vkontakte/vk-mini-apps-router'
+import LessonModal from './LessonModal'
+// Import CollegeModal from './CollegeModal';
-export const MODAL_PAGE_LESSON = 'lesson';
-export const MODAL_COLLEGE_INFO = 'college';
+export const MODAL_PAGE_LESSON = 'lesson'
+export const MODAL_COLLEGE_INFO = 'college'
const ModalRoot = () => {
- const routeNavigator = useRouteNavigator();
- const { modal: activeModal } = useActiveVkuiLocation();
+ const routeNavigator = useRouteNavigator()
+ const { modal: activeModal } = useActiveVkuiLocation()
return (
- routeNavigator.hideModal()}>
+ routeNavigator.hideModal()}
+ >
-
+ {/* */}
- );
-};
+ )
+}
-export default ModalRoot;
+export default ModalRoot
diff --git a/src/modals/data.ts b/src/modals/data.ts
index 45d91d2f..1c2bd343 100644
--- a/src/modals/data.ts
+++ b/src/modals/data.ts
@@ -1,4 +1,4 @@
-import { Lesson } from 'diary-shared';
+import { Lesson } from 'diary-shared'
export const cleanData: Lesson = {
name: '',
@@ -23,4 +23,4 @@ export const cleanData: Lesson = {
},
startTime: '',
endTime: '',
-};
+}
diff --git a/src/routes/index.ts b/src/routes/index.ts
index 9608eb0e..7a8fd671 100644
--- a/src/routes/index.ts
+++ b/src/routes/index.ts
@@ -1,21 +1,24 @@
-import { RouteWithoutRoot, createHashRouter } from '@vkontakte/vk-mini-apps-router';
+import {
+ RouteWithoutRoot,
+ createHashRouter,
+} from '@vkontakte/vk-mini-apps-router'
-export const PAGE_MAIN = '/';
-export const PAGE_SCHEDULE = '/schedule';
-export const PAGE_CONTACTS = '/contacts';
-export const PAGE_MARKS = '/marks';
-export const PAGE_SETTINGS = '/settings';
-export const PAGE_ATTESTATION = '/attestation';
-export const PAGE_NOTIFICATIONS = '/notifications';
+export const PAGE_MAIN = '/'
+export const PAGE_SCHEDULE = '/schedule'
+export const PAGE_CONTACTS = '/contacts'
+export const PAGE_MARKS = '/marks'
+export const PAGE_SETTINGS = '/settings'
+export const PAGE_ATTESTATION = '/attestation'
+export const PAGE_NOTIFICATIONS = '/notifications'
-export const VIEW_SCHEDULE = 'schedule';
-export const VIEW_CONTACTS = 'contacts';
-export const VIEW_MARKS = 'marks';
-export const VIEW_SETTINGS = 'settings';
+export const VIEW_SCHEDULE = 'schedule'
+export const VIEW_CONTACTS = 'contacts'
+export const VIEW_MARKS = 'marks'
+export const VIEW_SETTINGS = 'settings'
-export const MAIN_SETTINGS = 'login';
-export const VIEW_ATTESTATION = 'attestation';
-export const VIEW_NOTIFICATIONS = 'notifications';
+export const MAIN_SETTINGS = 'login'
+export const VIEW_ATTESTATION = 'attestation'
+export const VIEW_NOTIFICATIONS = 'notifications'
const routes: RouteWithoutRoot[] = [
{
@@ -53,6 +56,6 @@ const routes: RouteWithoutRoot[] = [
panel: VIEW_NOTIFICATIONS,
view: VIEW_NOTIFICATIONS,
},
-];
+]
-export const router = createHashRouter(routes);
+export const router = createHashRouter(routes)
diff --git a/src/store/index.ts b/src/store/index.ts
new file mode 100644
index 00000000..849ba455
--- /dev/null
+++ b/src/store/index.ts
@@ -0,0 +1,10 @@
+import { configureStore } from '@reduxjs/toolkit'
+import lessonReducer from './lessonSlice'
+
+const store = configureStore({
+ reducer: {
+ lesson: lessonReducer,
+ },
+})
+
+export default store
diff --git a/src/store/lessonSlice.ts b/src/store/lessonSlice.ts
new file mode 100644
index 00000000..55057f0c
--- /dev/null
+++ b/src/store/lessonSlice.ts
@@ -0,0 +1,25 @@
+import { PayloadAction, createSlice } from '@reduxjs/toolkit'
+import { Lesson } from 'diary-shared'
+
+interface LessonState {
+ lessonModalData: Lesson | null
+}
+
+const initialState: LessonState = {
+ lessonModalData: null,
+}
+
+const lessonSlice = createSlice({
+ name: 'lesson',
+ initialState,
+ reducers: {
+ setLessonModalData: (state, action: PayloadAction) => {
+ state.lessonModalData = action.payload
+ },
+ },
+})
+
+export const { setLessonModalData } = lessonSlice.actions
+export const selectLessonModalData = (state: { lesson: LessonState }) =>
+ state.lesson.lessonModalData
+export default lessonSlice.reducer
diff --git a/src/transformers/transformVKBridgeAdaptivity.ts b/src/transformers/transformVKBridgeAdaptivity.ts
index 78a4b83d..8fa63f97 100644
--- a/src/transformers/transformVKBridgeAdaptivity.ts
+++ b/src/transformers/transformVKBridgeAdaptivity.ts
@@ -1,11 +1,11 @@
import {
type AdaptivityProps,
- getViewWidthByViewportWidth,
- getViewHeightByViewportHeight,
- ViewWidth,
SizeType,
-} from '@vkontakte/vkui';
-import type { UseAdaptivity } from '@vkontakte/vk-bridge-react';
+ ViewWidth,
+ getViewHeightByViewportHeight,
+ getViewWidthByViewportWidth,
+} from '@vkontakte/vkui'
+import type { UseAdaptivity } from '@vkontakte/vk-bridge-react'
/**
* Требуется конвертировать данные из VK Bridge в те, что принимает AdaptivityProvider из VKUI.
@@ -20,15 +20,16 @@ export const transformVKBridgeAdaptivity = ({
return {
viewWidth: getViewWidthByViewportWidth(viewportWidth),
viewHeight: getViewHeightByViewportHeight(viewportHeight),
- };
+ }
case 'force_mobile':
case 'force_mobile_compact':
return {
viewWidth: ViewWidth.MOBILE,
sizeX: SizeType.COMPACT,
- sizeY: type === 'force_mobile_compact' ? SizeType.COMPACT : SizeType.REGULAR,
- };
+ sizeY:
+ type === 'force_mobile_compact' ? SizeType.COMPACT : SizeType.REGULAR,
+ }
default:
- return {};
+ return {}
}
-};
+}
diff --git a/src/types/hashes.d.ts b/src/types/hashes.d.ts
index a4475daf..38a4dcd0 100644
--- a/src/types/hashes.d.ts
+++ b/src/types/hashes.d.ts
@@ -3,61 +3,61 @@ declare module 'jshashes' {
/**
* Hexadecimal hash encoding from string.
*/
- hex(input: string): string;
+ hex(input: string): string
/**
* Base64 hash encoding from string.
*/
- b64(input: string): string;
+ b64(input: string): string
/**
* Custom hash algorithm values encoding.
*/
- any(input: string, encoding: string): string;
+ any(input: string, encoding: string): string
/**
* Hexadecimal hash with HMAC salt key.
*/
- hex_hmac(key: string, input: string): string;
+ hex_hmac(key: string, input: string): string
/**
* Custom hash values encoding with HMAC salt key support.
*/
- b64_hmac(key: string, input: string): string;
+ b64_hmac(key: string, input: string): string
/**
* Custom hash values encoding with HMAC salt key support.
*/
- any_hmac(key: string, input: string, encoding: string): string;
+ any_hmac(key: string, input: string, encoding: string): string
/**
* Simple self-test to see if working.
*/
- vm_test(): this;
+ vm_test(): this
/**
* Enable/disable uppercase hexadecimal returned string.
*/
- setUpperCase(isEnabled: boolean): this;
+ setUpperCase(isEnabled: boolean): this
/**
* Defines a custom base64 pad string. Default is '=' according with the RFC standard.
*/
- setPad(pad: string): this;
+ setPad(pad: string): this
/**
* Enable/disable UTF-8 character encoding.
*/
- setUTF8(isEnabled: boolean): this;
+ setUTF8(isEnabled: boolean): this
}
namespace Hashes {
- export class MD5 extends HashesClass { }
- export class SHA1 extends HashesClass { }
- export class SHA256 extends HashesClass { }
- export class SHA512 extends HashesClass { }
- export class RMD160 extends HashesClass { }
+ export class MD5 extends HashesClass {}
+ export class SHA1 extends HashesClass {}
+ export class SHA256 extends HashesClass {}
+ export class SHA512 extends HashesClass {}
+ export class RMD160 extends HashesClass {}
}
- export = Hashes;
+ export = Hashes
}
diff --git a/src/types/index.ts b/src/types/index.ts
index c1290a08..534fe64b 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -1,14 +1,20 @@
-export type Pages = 'schedule' | 'contacts' | 'marks' | 'settings' | 'attestation' | 'notifications';
+export type Pages =
+ | 'schedule'
+ | 'contacts'
+ | 'marks'
+ | 'settings'
+ | 'attestation'
+ | 'notifications'
export interface Storage {
- key: string;
+ key: string
value: string
}
/**
* FIXME: enum стал страшный и в целом enum многие по понятным причинам хейтят
* Поэтому когда-нибудь надо пофиксить
-*/
+ */
export enum Grade {
Five = 5,
Four = 4,
@@ -24,7 +30,7 @@ export enum Grade {
'О' = 'О',
}
-export type GradeKeys = keyof typeof Grade;
+export type GradeKeys = keyof typeof Grade
-export type TextMark = GradeKeys;
-export type TMark = typeof Grade[GradeKeys];
+export type TextMark = GradeKeys
+export type TMark = (typeof Grade)[GradeKeys]
diff --git a/src/utils/calculateAverageMark.ts b/src/utils/calculateAverageMark.ts
index 48cf7b0e..57e22563 100644
--- a/src/utils/calculateAverageMark.ts
+++ b/src/utils/calculateAverageMark.ts
@@ -1,13 +1,14 @@
-import { TextMark } from 'diary-shared';
-import { Grade } from '../types';
+import { TextMark } from 'diary-shared'
+import { Grade } from '../types'
const calculateAverageMark = (marks: TextMark[] | undefined): number | null => {
if (!marks || marks.length === 0) {
- return null;
+ return null
}
- const sum = marks.reduce((total, mark) => total + (Grade[mark] as number), 0);
- return Number((sum / marks.length).toFixed(2));
-};
+ // @ts-ignore
+ const sum = marks.reduce((total, mark) => total + (Grade[mark] as number), 0)
+ return Number((sum / marks.length).toFixed(2))
+}
-export default calculateAverageMark;
+export default calculateAverageMark
diff --git a/src/utils/extractMarksByDay.ts b/src/utils/extractMarksByDay.ts
index b5743cfc..1e40e8b9 100644
--- a/src/utils/extractMarksByDay.ts
+++ b/src/utils/extractMarksByDay.ts
@@ -1,29 +1,39 @@
-import { PerformanceCurrent } from 'diary-shared';
-import { Grade, GradeKeys } from '../types';
-import { IMarksByDay } from '../components/UI/MarksByDay';
+import { PerformanceCurrent } from 'diary-shared'
+import { Grade, GradeKeys } from '../types'
+import { IMarksByDay } from '../components/UI/MarksByDay'
-export const extractMarksByDay = (performanceData: PerformanceCurrent | null): IMarksByDay => {
- const marksByDay: IMarksByDay = {};
+export const extractMarksByDay = (
+ performanceData: PerformanceCurrent | null
+): IMarksByDay => {
+ const marksByDay: IMarksByDay = {}
performanceData?.daysWithMarksForSubject?.forEach((subject) => {
subject?.daysWithMarks?.forEach((markData) => {
- const day = new Date(markData.day).toLocaleDateString();
- const grades = markData.markValues.map((gradeText) => Grade[gradeText as GradeKeys]);
- const lessonName = subject.subjectName;
+ const day = new Date(markData.day).toLocaleDateString()
+ const grades = markData.markValues.map(
+ (gradeText) => Grade[gradeText as GradeKeys]
+ )
+ const lessonName = subject.subjectName
- if (grades.length > 0 && grades.every((grade) => !Number.isNaN(parseFloat(grade as string)))) {
+ if (
+ grades.length > 0 &&
+ grades.every((grade) => !Number.isNaN(parseFloat(grade as string)))
+ ) {
if (!marksByDay[day]) {
- marksByDay[day] = {};
+ marksByDay[day] = {}
}
if (!marksByDay[day][lessonName]) {
- marksByDay[day][lessonName] = [];
+ marksByDay[day][lessonName] = []
}
- marksByDay[day][lessonName] = [...marksByDay[day][lessonName], ...grades];
+ marksByDay[day][lessonName] = [
+ ...marksByDay[day][lessonName],
+ ...grades,
+ ]
}
- });
- });
+ })
+ })
- return marksByDay;
-};
+ return marksByDay
+}
diff --git a/src/utils/formatDate.ts b/src/utils/formatDate.ts
index 80bbe13d..b501baf9 100644
--- a/src/utils/formatDate.ts
+++ b/src/utils/formatDate.ts
@@ -1,4 +1,4 @@
export const formatDate = (dateString: string) => {
- const parts = dateString.split('.');
- return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0]));
-};
+ const parts = dateString.split('.')
+ return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0]))
+}
diff --git a/src/utils/formatDateForRequest.ts b/src/utils/formatDateForRequest.ts
index fb643cee..bc2bd865 100644
--- a/src/utils/formatDateForRequest.ts
+++ b/src/utils/formatDateForRequest.ts
@@ -1,8 +1,8 @@
const formatDateForRequest = (date: Date): string => {
- const year: number = date.getFullYear();
- const month: string = (date.getMonth() + 1).toString().padStart(2, '0');
- const day: string = date.getDate().toString().padStart(2, '0');
- return `${year}-${month}-${day}`;
-};
+ const year: number = date.getFullYear()
+ const month: string = (date.getMonth() + 1).toString().padStart(2, '0')
+ const day: string = date.getDate().toString().padStart(2, '0')
+ return `${year}-${month}-${day}`
+}
-export default formatDateForRequest;
+export default formatDateForRequest
diff --git a/src/utils/formatLessonDate.ts b/src/utils/formatLessonDate.ts
index 907ab1d2..0acf7c51 100644
--- a/src/utils/formatLessonDate.ts
+++ b/src/utils/formatLessonDate.ts
@@ -1,11 +1,11 @@
export const formatLessonDate = (dateString: Date | string) => {
- const options = { year: 'numeric', month: 'long', day: 'numeric' };
+ const options = { year: 'numeric', month: 'long', day: 'numeric' }
// @ts-ignore
- return new Date(dateString).toLocaleDateString(undefined, options);
-};
+ return new Date(dateString).toLocaleDateString(undefined, options)
+}
export function getDayOfWeek(date: Date) {
- const daysOfWeek = ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'];
- return daysOfWeek[date.getDay()];
+ const daysOfWeek = ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб']
+ return daysOfWeek[date.getDay()]
}
diff --git a/src/utils/formatStatisticsData.ts b/src/utils/formatStatisticsData.ts
index 5d48b410..6ccf6f7d 100644
--- a/src/utils/formatStatisticsData.ts
+++ b/src/utils/formatStatisticsData.ts
@@ -1,46 +1,48 @@
-import { PerformanceCurrent } from 'diary-shared';
-import { Grade, TextMark } from '../types';
+import { PerformanceCurrent } from 'diary-shared'
+import { Grade, TextMark } from '../types'
export const formatStatisticsData = (marks: PerformanceCurrent) => {
try {
const allMarks: TextMark[] = marks.daysWithMarksForSubject.reduce(
(marksArray: TextMark[], subject) => {
if (subject.daysWithMarks) {
- // @ts-ignore
- subject.daysWithMarks.forEach((day) => marksArray.push(...day.markValues));
+ subject.daysWithMarks.forEach((day) =>
+ // @ts-ignore
+ marksArray.push(...day.markValues)
+ )
}
- return marksArray;
+ return marksArray
},
- [],
- );
+ []
+ )
- const totalNumberOfMarks: number = allMarks.length;
+ const totalNumberOfMarks: number = allMarks.length
const totalSumOfMarks: number = allMarks.reduce(
(sum, mark) => sum + (Grade[mark] as number),
- 0,
- );
- const averageMark: number = totalSumOfMarks / totalNumberOfMarks;
+ 0
+ )
+ const averageMark: number = totalSumOfMarks / totalNumberOfMarks
const markCounts: Record = {
2: 0,
3: 0,
4: 0,
5: 0,
- };
+ }
allMarks.forEach((textMark: TextMark) => {
- const numericMark: number = Grade[textMark] as number;
+ const numericMark: number = Grade[textMark] as number
if (numericMark >= 2 && numericMark <= 5) {
- markCounts[numericMark] += 1;
+ markCounts[numericMark] += 1
}
- });
+ })
return {
totalNumberOfMarks: totalNumberOfMarks.toString(),
averageMark: Number(averageMark.toFixed(3)),
markCounts,
- };
+ }
} catch (e) {
- console.error(e);
- return null;
+ console.error(e)
+ return null
}
-};
+}
diff --git a/src/utils/handleResponse.ts b/src/utils/handleResponse.ts
index 89782087..e2c3c6ba 100644
--- a/src/utils/handleResponse.ts
+++ b/src/utils/handleResponse.ts
@@ -1,31 +1,33 @@
-import React from 'react';
-import { Icon28ErrorCircleOutline } from '@vkontakte/icons';
-import { SnackbarData } from '../hooks/useSnackbar';
+import { Icon28ErrorCircleOutline } from '@vkontakte/icons'
+import { createElement } from 'preact'
+import { SnackbarData } from '../hooks/useSnackbar'
export function handleResponse(
response: T,
errorCallback: () => void,
limitExceededCallback: () => void,
loadingCallback: (isLoading: boolean) => void,
- showSnackbar?: (snackbarData: SnackbarData) => void,
+ showSnackbar?: (snackbarData: SnackbarData) => void
): void {
if (response === 418) {
- const errorIcon = React.createElement(Icon28ErrorCircleOutline, { fill: 'var(--vkui--color_icon_negative)' });
+ const errorIcon = createElement(Icon28ErrorCircleOutline, {
+ fill: 'var(--vkui--color_icon_negative)',
+ })
if (showSnackbar) {
showSnackbar({
icon: errorIcon,
title: 'Ошибка при попытке сделать запрос',
subtitle: 'Попробуйте обновить страницу или обновите куки в настройках',
- });
+ })
}
- loadingCallback(false);
- errorCallback();
- return;
+ loadingCallback(false)
+ errorCallback()
+ return
}
if (response === 429) {
- limitExceededCallback();
- errorCallback();
- loadingCallback(false);
+ limitExceededCallback()
+ errorCallback()
+ loadingCallback(false)
}
}
diff --git a/src/utils/isToday.ts b/src/utils/isToday.ts
index a1c337cb..d94ef9a6 100644
--- a/src/utils/isToday.ts
+++ b/src/utils/isToday.ts
@@ -1,8 +1,8 @@
export const isToday = (date: Date) => {
- const today = new Date();
+ const today = new Date()
return (
- date.getDate() === today.getDate()
- && date.getMonth() === today.getMonth()
- && date.getFullYear() === today.getFullYear()
- );
-};
+ date.getDate() === today.getDate() &&
+ date.getMonth() === today.getMonth() &&
+ date.getFullYear() === today.getFullYear()
+ )
+}
diff --git a/src/utils/logOut.ts b/src/utils/logOut.ts
index 972b4184..b321a458 100644
--- a/src/utils/logOut.ts
+++ b/src/utils/logOut.ts
@@ -1,21 +1,6 @@
-import { appStorageSet, getVkStorageKeys } from '../methods';
-
-const clearVkStorage = async () => {
- try {
- const keys = await getVkStorageKeys();
-
- await Promise.all(keys.map(async (key) => {
- await appStorageSet(key, '');
- }));
- } catch (error) {
- console.error(error);
- }
-};
-
const logOut = async () => {
- await clearVkStorage();
- localStorage.clear();
- window.location.reload();
-};
+ localStorage.clear()
+ window.location.reload()
+}
-export default logOut;
+export default logOut
diff --git a/src/utils/setDefaultMark.ts b/src/utils/setDefaultMark.ts
index e4b6c8aa..531bccd2 100644
--- a/src/utils/setDefaultMark.ts
+++ b/src/utils/setDefaultMark.ts
@@ -1,17 +1,20 @@
-import { Task } from 'diary-shared';
-import { TextMark } from '../types';
-// TODO: можно с помощью неё фиксить ошибки с неправильными оценами
-// FIXME: Переписать
+import { Task } from 'diary-shared'
+import { TextMark } from '../types'
+
+/*
+ * TODO: можно с помощью неё фиксить ошибки с неправильными оценами
+ * FIXME: Переписать
+ */
const setDefaultMark = (task: Task): TextMark => {
if (task.isRequired && !task.mark) {
- return 'Д';
+ return 'Д'
}
if (task.type === 'Home' && !task.mark) {
- return 'ДЗ';
+ return 'ДЗ'
}
- return task.mark as TextMark;
-};
+ return task.mark as TextMark
+}
-export default setDefaultMark;
+export default setDefaultMark
diff --git a/src/utils/sortByDay.ts b/src/utils/sortByDay.ts
index 75d182ea..64f462b1 100644
--- a/src/utils/sortByDay.ts
+++ b/src/utils/sortByDay.ts
@@ -1,12 +1,14 @@
-import { IMarksByDay } from '../components/UI/MarksByDay';
-import { formatDate } from './formatDate';
+import { IMarksByDay } from '../components/UI/MarksByDay'
+import { formatDate } from './formatDate'
export const sortByDay = (marksByDay: IMarksByDay): IMarksByDay => {
- const sortedDays = Object.keys(marksByDay).sort((a, b) => formatDate(b).getTime() - formatDate(a).getTime());
- const marksByDaySort: IMarksByDay = {};
+ const sortedDays = Object.keys(marksByDay).sort(
+ (a, b) => formatDate(b).getTime() - formatDate(a).getTime()
+ )
+ const marksByDaySort: IMarksByDay = {}
sortedDays.forEach((day) => {
- marksByDaySort[day] = marksByDay[day];
- });
+ marksByDaySort[day] = marksByDay[day]
+ })
- return marksByDaySort;
-};
+ return marksByDaySort
+}
diff --git a/src/utils/textToLink.tsx b/src/utils/textToLink.tsx
index cda07c17..0159a104 100644
--- a/src/utils/textToLink.tsx
+++ b/src/utils/textToLink.tsx
@@ -1,16 +1,20 @@
-import { Link } from '@vkontakte/vkui';
+import { Link } from '@vkontakte/vkui'
const textToLink = (name: string) => {
- const urlRegex = /(https?:\/\/\S+)/g;
+ const urlRegex = /(https?:\/\/\S+)/g
- const parts = name.split(urlRegex);
+ const parts = name.split(urlRegex)
return parts.map((part, index) => {
if (part.match(urlRegex)) {
- return {part};
+ return (
+
+ {part}
+
+ )
}
- return part;
- });
-};
+ return part
+ })
+}
-export default textToLink;
+export default textToLink
diff --git a/src/utils/truncateString.ts b/src/utils/truncateString.ts
index 88a830ca..ebdf5a38 100644
--- a/src/utils/truncateString.ts
+++ b/src/utils/truncateString.ts
@@ -1,6 +1,6 @@
export const truncateString = (str: string, maxLength: number) => {
if (str.length > maxLength) {
- return `${str.substring(0, maxLength)}...`;
+ return `${str.substring(0, maxLength)}...`
}
- return str;
-};
+ return str
+}
diff --git a/src/views/Attestation.tsx b/src/views/Attestation.tsx
index f14af216..f5642e91 100644
--- a/src/views/Attestation.tsx
+++ b/src/views/Attestation.tsx
@@ -1,124 +1,135 @@
import {
- FC, lazy, useEffect, useState,
-} from 'react';
+ Button,
+ ButtonGroup,
+ Div,
+ Link,
+ Panel,
+ Placeholder,
+ ScreenSpinner,
+ View,
+} from '@vkontakte/vkui'
import {
- Button, ButtonGroup, Div, Link, Panel, Placeholder, ScreenSpinner, View,
-} from '@vkontakte/vkui';
-import { useActiveVkuiLocation, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import { AttestationResponse } from 'diary-shared';
-import getAttestation from '../methods/server/getAttestation';
-import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack';
-import { useRateLimitExceeded } from '../hooks';
-import { handleResponse } from '../utils/handleResponse';
+ useActiveVkuiLocation,
+ useRouteNavigator,
+} from '@vkontakte/vk-mini-apps-router'
+import { AttestationResponse } from 'diary-shared'
+import { FC, lazy } from 'preact/compat'
+import { useEffect, useState } from 'preact/hooks'
+import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack'
+import { useRateLimitExceeded } from '../hooks'
+import { handleResponse } from '../utils/handleResponse'
+import { getAttestation } from '../methods'
-const SubjectList = lazy(() => import('../components/UI/SubjectsList'));
+const SubjectList = lazy(() => import('../components/UI/SubjectsList'))
interface IAttestation {
- id: string;
+ id: string
}
const Attestation: FC = ({ id }) => {
- const { panel: activePanel, panelsHistory } = useActiveVkuiLocation();
- const routeNavigator = useRouteNavigator();
+ const { panel: activePanel, panelsHistory } = useActiveVkuiLocation()
+ const routeNavigator = useRouteNavigator()
- const [isError, setIsError] = useState(false);
- const [isDataLoading, setIsLoading] = useState(false);
- const [attestationData, setAttestationData] = useState(null);
+ const [isError, setIsError] = useState(false)
+ const [isDataLoading, setIsLoading] = useState(false)
+ const [attestationData, setAttestationData] =
+ useState(null)
const getUserAttestation = async () => {
- setIsLoading(true);
- setIsError(false);
+ setIsLoading(true)
+ setIsError(false)
try {
- const data = await getAttestation();
+ const data = await getAttestation()
handleResponse(
data,
() => {
- setIsError(true);
- setIsLoading(false);
+ setIsError(true)
+ setIsLoading(false)
},
() => {
- useRateLimitExceeded();
- setIsError(true);
- setIsLoading(false);
+ useRateLimitExceeded()
+ setIsError(true)
+ setIsLoading(false)
},
(isLoading) => {
- setIsLoading(isLoading);
- },
- );
+ setIsLoading(isLoading)
+ }
+ )
- setAttestationData(data as AttestationResponse);
+ setAttestationData(data as AttestationResponse)
} catch (error) {
- setIsError(true);
- console.error('Плоха-плоха:', error);
+ setIsError(true)
+ console.error('Плоха-плоха:', error)
} finally {
- setIsLoading(false);
+ setIsLoading(false)
}
- };
+ }
useEffect(() => {
- getUserAttestation();
- }, []);
+ getUserAttestation()
+ }, [])
- const semesters: Record = {};
- let year: number | null = null;
- let studentName: string | null = null;
+ const semesters: Record = {}
+ let studentName: string | null = null
+ let year: number | null = null
if (attestationData && attestationData.students) {
- year = attestationData.year;
+ year = attestationData.year
studentName = `
- ${attestationData.students[0].lastName}
- ${attestationData.students[0].firstName.slice(0, 1)}.
- ${attestationData.students[0].middleName.slice(0, 1)}.`;
+ ${attestationData.students[0].lastName}
+ ${attestationData.students[0].firstName.slice(0, 1)}.
+ ${attestationData.students[0].middleName.slice(0, 1)}.`
}
if (attestationData && attestationData.subjects) {
attestationData.subjects.forEach((subject) => {
- const semesterKey = `Семестр ${attestationData.termNumber}`;
+ const semesterKey = `Семестр ${attestationData.termNumber}`
if (!semesters[semesterKey]) {
- semesters[semesterKey] = [];
+ semesters[semesterKey] = []
}
- semesters[semesterKey].push(subject);
- });
+ semesters[semesterKey].push(subject)
+ })
}
return (
routeNavigator.back()}
>
-
+
- {attestationData
- && (
+ {attestationData && (
- )}
+ )}
{isDataLoading &&
}
- {isError
- && (
-
-
-
- Сообщить о проблеме
-
-
- )}
- />
- )}
+ {isError && (
+
+
+
+ Сообщить о проблеме
+
+
+ }
+ />
+ )}
- );
-};
+ )
+}
-export default Attestation;
+export default Attestation
diff --git a/src/views/Contacts.tsx b/src/views/Contacts.tsx
index 85d81694..9bb14fb7 100644
--- a/src/views/Contacts.tsx
+++ b/src/views/Contacts.tsx
@@ -1,64 +1,103 @@
-import { FC } from 'react';
import {
- Avatar, Card, Div, Footer, Footnote, Group, Header, Link, Panel, SimpleCell, View,
-} from '@vkontakte/vkui';
-import { useActiveVkuiLocation, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import { Icon28Users, Icon28Hearts2Outline } from '@vkontakte/icons';
-import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack';
-import HelpAccordion from '../components/HelpAccordion';
-import { helpData } from '../components/data';
-import winxAva from '../assets/winx48.webp';
-import scffsAva from '../assets/ava.jpg';
+ Avatar,
+ Card,
+ Div,
+ Footer,
+ Footnote,
+ Group,
+ Header,
+ Link,
+ Panel,
+ SimpleCell,
+ View,
+} from '@vkontakte/vkui'
+import {
+ useActiveVkuiLocation,
+ useRouteNavigator,
+} from '@vkontakte/vk-mini-apps-router'
+import { Icon28Hearts2Outline, Icon28Users } from '@vkontakte/icons'
+import { FC } from 'preact/compat'
+import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack'
+import HelpAccordion from '../components/HelpAccordion'
+import { helpData } from '../components/data'
+//@ts-ignore типы React не совсем совместимы с Preact
+import winxAva from '../assets/winx48.webp'
+//@ts-ignore типы React не совсем совместимы с Preact
+import scffsAva from '../assets/ava.jpg'
const Contacts: FC<{ id: string }> = ({ id }) => {
- const { panel: activePanel, panelsHistory } = useActiveVkuiLocation();
- const routeNavigator = useRouteNavigator();
+ const { panel: activePanel, panelsHistory } = useActiveVkuiLocation()
+ const routeNavigator = useRouteNavigator()
return (
routeNavigator.back()}
>
-
+
-
FAQ}>
-
+ FAQ}>
+
{helpData.map(({ detail, title, id: dataId }) => (
-
+
))}
- Контакты}>
+ Контакты}>
} src={scffsAva} />}
- subtitle='Разработчик | Любые вопросы'
+ before={
+ }
+ src={scffsAva}
+ />
+ }
+ subtitle="Разработчик | Любые вопросы"
style={{ borderRadius: '5px !important' }}
>
-
+
Семён Окулов
} src={winxAva} />}
- subtitle='Наша группа | Любые вопросы'
+ before={
+ }
+ src={winxAva}
+ />
+ }
+ subtitle="Наша группа | Любые вопросы"
style={{ borderRadius: '5px !important' }}
>
-
+
Дневник СПО
-
- );
-};
+ )
+}
-export default Contacts;
+export default Contacts
diff --git a/src/views/LoginForm.tsx b/src/views/LoginForm.tsx
index 53276204..9dec38f9 100644
--- a/src/views/LoginForm.tsx
+++ b/src/views/LoginForm.tsx
@@ -1,87 +1,93 @@
import {
- ChangeEvent, FC, useEffect, useState,
-} from 'react';
+ Button,
+ FormItem,
+ FormLayout,
+ FormStatus,
+ Group,
+ Input,
+ Panel,
+ View,
+} from '@vkontakte/vkui'
import {
- Button, FormItem, FormLayout, FormStatus, Group, Input, Panel, View,
-} from '@vkontakte/vkui';
-import { useActiveVkuiLocation, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import Hashes from 'jshashes';
-import { Icon28DoorArrowLeftOutline, Icon28ErrorCircleOutline } from '@vkontakte/icons';
-import { AuthData } from 'diary-shared';
-import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack';
-import { appStorageSet, getCookie } from '../methods';
-import { VIEW_SCHEDULE } from '../routes';
-import { useSnackbar } from '../hooks';
+ useActiveVkuiLocation,
+ useRouteNavigator,
+} from '@vkontakte/vk-mini-apps-router'
+import Hashes from 'jshashes'
+import {
+ Icon28DoorArrowLeftOutline,
+ Icon28ErrorCircleOutline,
+} from '@vkontakte/icons'
+import { AuthData } from 'diary-shared'
+import { useEffect, useState } from 'preact/hooks'
+import { ChangeEvent, FC } from 'preact/compat'
+import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack'
+import { VIEW_SCHEDULE } from '../routes'
+import { useSnackbar } from '../hooks'
const LoginForm: FC<{ id: string }> = ({ id }) => {
- const { panel: activePanel, panelsHistory } = useActiveVkuiLocation();
- const routeNavigator = useRouteNavigator();
+ const { panel: activePanel, panelsHistory } = useActiveVkuiLocation()
+ const routeNavigator = useRouteNavigator()
- const [login, setLogin] = useState('');
- const [password, setPassword] = useState('');
- const [isDataInvalid, setIsDataInvalid] = useState(false);
- const [isLoading, setIsLoading] = useState(false);
- const [snackbar, showSnackbar] = useSnackbar();
+ const [login, setLogin] = useState('')
+ const [password, setPassword] = useState('')
+ const [isDataInvalid, setIsDataInvalid] = useState(false)
+ const [isLoading, setIsLoading] = useState(false)
+ const [snackbar, showSnackbar] = useSnackbar()
- const createErrorSnackbar = () => showSnackbar({
- icon: ,
- subtitle: 'Попробуйте заного или сообщите об ошибке',
- title: 'Ошибка при попытке авторизации',
- });
+ const createErrorSnackbar = () =>
+ showSnackbar({
+ icon: (
+
+ ),
+ subtitle: 'Попробуйте заного или сообщите об ошибке',
+ title: 'Ошибка при попытке авторизации',
+ })
useEffect(() => {
- const storageCookie = localStorage.getItem('cookie');
- console.log(storageCookie);
- setIsLoading(true);
+ const storageCookie = localStorage.getItem('cookie')
+ console.log(storageCookie)
+ setIsLoading(true)
const getUserCookie = () => {
- getCookie().then((cookieValue) => {
- console.log(cookieValue);
- if (storageCookie || cookieValue) {
- routeNavigator.replace(`/${VIEW_SCHEDULE}`);
- setIsLoading(false);
- return;
- }
-
- setTimeout(() => {
- if (!storageCookie) {
- routeNavigator.replace('/');
- setIsLoading(false);
- showSnackbar({
- icon: ,
- subtitle: 'Заполни форму и войди в дневник',
- title: 'О вас нет данных, ты кто такой?',
- });
- }
- }, 500);
- });
- };
-
- getUserCookie();
- }, []);
+ if (!storageCookie) {
+ routeNavigator.replace('/')
+ setIsLoading(false)
+ showSnackbar({
+ icon: (
+
+ ),
+ subtitle: 'Заполни форму и войди в дневник',
+ title: 'О вас нет данных, ты кто такой?',
+ })
+ }
+ }
+
+ getUserCookie()
+ }, [])
const onChange = (e: ChangeEvent) => {
- const { name, value } = e.currentTarget;
+ const { name, value } = e.currentTarget
const setStateAction = {
login: setLogin,
password: setPassword,
- }[name];
- setIsDataInvalid(false);
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
- setStateAction && setStateAction(value);
- };
+ }[name]
+ setIsDataInvalid(false)
+
+ setStateAction && setStateAction(value)
+ }
- const loginPattern = /^[a-zA-Z0-9а-яА-ЯёЁ-]+$/;
+ const loginPattern = /^[a-zA-Z0-9а-яА-ЯёЁ-]+$/
const handleLogin = async () => {
if (!loginPattern.test(login)) {
- setIsDataInvalid(true);
- return;
+ setIsDataInvalid(true)
+ return
}
- const passwordHashed = (new Hashes.SHA256()).b64(password);
+ const passwordHashed = new Hashes.SHA256().b64(password)
- setIsLoading(true);
+ setIsLoading(true)
+ //@ts-ignore типы React не совсем совместимы с Preact
const response = await fetch(`${import.meta.env.VITE_SERVER_URL}/login`, {
method: 'POST',
headers: {
@@ -92,145 +98,163 @@ const LoginForm: FC<{ id: string }> = ({ id }) => {
password: passwordHashed,
isRemember: true,
}),
- });
+ })
if (response.status === 401) {
- setIsLoading(false);
- setIsDataInvalid(true);
- throw new Error('401');
+ setIsLoading(false)
+ setIsDataInvalid(true)
+ throw new Error('401')
} else if (!response.ok) {
showSnackbar({
- icon: ,
+ icon: (
+
+ ),
title: 'Ошибка при попытке сделать запрос',
subtitle: 'Попробуйте обновить страницу или обновите куки в настройках',
- });
- setIsLoading(false);
- createErrorSnackbar();
- throw new Error(`Failed to fetch login / status: ${response.status} / statusText: ${response.statusText}`);
+ })
+ setIsLoading(false)
+ createErrorSnackbar()
+ throw new Error(
+ `Failed to fetch login / status: ${response.status} / statusText: ${response.statusText}`
+ )
}
- const dataResp = await response.json() as AuthData;
+ const dataResp = (await response.json()) as AuthData
if (!String(dataResp.cookie)) {
- createErrorSnackbar();
+ createErrorSnackbar()
}
try {
- const basePath = dataResp.data.tenants[dataResp.data.tenantName];
+ const basePath = dataResp.data.tenants[dataResp.data.tenantName]
- const userId = String(basePath.studentRole.id);
- const { cookie } = dataResp;
- const name = ` ${String(basePath.lastName)} ${String(basePath.firstName)} ${String(basePath.middleName)}`;
- const org = String(basePath.settings.organization.abbreviation);
- const city = String(basePath.settings.organization.address.settlement);
- const group = String(basePath.students[0].groupName);
+ const userId = String(basePath.studentRole.id)
+ const { cookie } = dataResp
+ const name = ` ${String(basePath.lastName)} ${String(
+ basePath.firstName
+ )} ${String(basePath.middleName)}`
+ const org = String(basePath.settings.organization.abbreviation)
+ const city = String(basePath.settings.organization.address.settlement)
+ const group = String(basePath.students[0].groupName)
- localStorage.setItem('id', userId);
- localStorage.setItem('cookie', cookie);
+ localStorage.setItem('id', userId)
+ localStorage.setItem('cookie', cookie)
- localStorage.setItem('log', login);
- localStorage.setItem('main', passwordHashed);
+ localStorage.setItem('log', login)
+ localStorage.setItem('main', passwordHashed)
const userData = {
name,
org,
city,
group,
- };
+ }
- await Promise.all([
- appStorageSet('log', login),
- appStorageSet('main', passwordHashed),
- appStorageSet('cookie', cookie),
- appStorageSet('id', userId),
- appStorageSet('data', JSON.stringify(userData)),
- ]);
+ localStorage.setItem('data', JSON.stringify(userData))
showSnackbar({
title: 'Вхожу',
subtitle: 'Подождите немного',
- });
+ })
- setTimeout(async () => {
- await routeNavigator.replace(`/${VIEW_SCHEDULE}`);
- }, 3500);
+ await routeNavigator.replace(`/${VIEW_SCHEDULE}`)
} catch (e) {
- setIsLoading(false);
- console.error(e);
+ setIsLoading(false)
+ console.error(e)
} finally {
- setIsLoading(false);
+ setIsLoading(false)
}
- };
+ }
- const isLoginEmpty = login === '';
- const isPasswordEmpty = password === '';
- const isPasswordValid = password && !isPasswordEmpty;
+ const isLoginEmpty = login === ''
+ const isPasswordEmpty = password === ''
+ const isPasswordValid = password && !isPasswordEmpty
const loginTopText = isLoginEmpty
? 'Логин'
- : (loginPattern.test(login)
- ? 'Логин введён'
- : 'Введите корректный логин');
- const passwordTopText = password === ''
- ? 'Пароль'
- : (isPasswordValid
+ : loginPattern.test(login)
+ ? 'Логин введён'
+ : 'Введите корректный логин'
+ const passwordTopText =
+ password === ''
+ ? 'Пароль'
+ : isPasswordValid
? 'Пароль введён'
- : 'Введите корректный пароль');
+ : 'Введите корректный пароль'
return (
routeNavigator.back()}
>
-
+
{isDataInvalid && (
-
+
Проверьте правильность логина и пароля
)}
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
- );
-};
+ )
+}
-export default LoginForm;
+export default LoginForm
diff --git a/src/views/Marks.tsx b/src/views/Marks.tsx
index 062647af..d79ff4ec 100644
--- a/src/views/Marks.tsx
+++ b/src/views/Marks.tsx
@@ -1,158 +1,182 @@
-import { FC, useEffect, useState } from 'react';
import {
- Group, Panel, PanelSpinner, PullToRefresh, View,
-} from '@vkontakte/vkui';
-import { useActiveVkuiLocation, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import { Icon28ErrorCircleOutline, Icon28InfoCircle } from '@vkontakte/icons';
-import { PerformanceCurrent } from 'diary-shared';
-import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack';
-import Suspense from '../components/UI/Suspense';
-import Summary from '../components/UI/Summary';
-import MarksByGroup from '../components/MarksByGroup';
-import UserInfo from '../components/UserInfo';
-import { getPerformance } from '../methods';
-import { handleResponse } from '../utils/handleResponse';
-import { useSnackbar } from '../hooks';
-import { formatStatisticsData } from '../utils/formatStatisticsData';
+ Group,
+ Panel,
+ PanelSpinner,
+ PullToRefresh,
+ View,
+} from '@vkontakte/vkui'
+import {
+ useActiveVkuiLocation,
+ useRouteNavigator,
+} from '@vkontakte/vk-mini-apps-router'
+import { Icon28ErrorCircleOutline, Icon28InfoCircle } from '@vkontakte/icons'
+import { PerformanceCurrent } from 'diary-shared'
+import { FC } from 'preact/compat'
+import { useEffect, useState } from 'preact/hooks'
+import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack'
+import Suspense from '../components/UI/Suspense'
+import Summary from '../components/UI/Summary'
+import MarksByGroup from '../components/MarksByGroup'
+import UserInfo from '../components/UserInfo'
+import { getPerformance } from '../methods'
+import { handleResponse } from '../utils/handleResponse'
+import { useSnackbar } from '../hooks'
+import { formatStatisticsData } from '../utils/formatStatisticsData'
-const THIRD_SEC = 30 * 1000;
+const THIRD_SEC = 30 * 1000
const Marks: FC<{ id: string }> = ({ id }) => {
- const { panel: activePanel, panelsHistory } = useActiveVkuiLocation();
- const routeNavigator = useRouteNavigator();
+ const { panel: activePanel, panelsHistory } = useActiveVkuiLocation()
+ const routeNavigator = useRouteNavigator()
- const [isLoading, setIsLoading] = useState(false);
- const [snackbar, showSnackbar] = useSnackbar();
+ const [isLoading, setIsLoading] = useState(false)
+ const [snackbar, showSnackbar] = useSnackbar()
- const [marksForSubject, setMarksForSubject] = useState(null);
- const [totalNumberOfMarks, setTotalNumberOfMarks] = useState(null);
- const [averageMark, setAverageMark] = useState(null);
- const [markCounts, setMarkCounts] = useState | null>(null);
+ const [marksForSubject, setMarksForSubject] =
+ useState(null)
+ const [totalNumberOfMarks, setTotalNumberOfMarks] = useState(
+ null
+ )
+ const [averageMark, setAverageMark] = useState(null)
+ const [markCounts, setMarkCounts] = useState | null>(
+ null
+ )
const saveStatisticsData = (marks: PerformanceCurrent | null) => {
- if (!marks) return;
+ if (!marks) return
- const data = formatStatisticsData(marks);
+ const data = formatStatisticsData(marks)
if (data) {
- setTotalNumberOfMarks(data.totalNumberOfMarks);
- setAverageMark(data.averageMark);
- setMarkCounts(data.markCounts);
+ setTotalNumberOfMarks(data.totalNumberOfMarks)
+ setAverageMark(data.averageMark)
+ setMarkCounts(data.markCounts)
}
- };
+ }
- const fetchMarks = async (isHandle?: boolean): Promise => {
- setIsLoading(true);
+ const fetchMarks = async (
+ isHandle?: boolean
+ ): Promise => {
+ setIsLoading(true)
try {
- const lastFetchTime = localStorage.getItem('lastFetchTime');
+ const lastFetchTime = localStorage.getItem('lastFetchTime')
- if (!lastFetchTime || Date.now() - Number(lastFetchTime) >= THIRD_SEC || isHandle) {
- const marks = await getPerformance();
+ if (
+ !lastFetchTime ||
+ Date.now() - Number(lastFetchTime) >= THIRD_SEC ||
+ isHandle
+ ) {
+ const marks = await getPerformance()
handleResponse(
marks,
() => {
- setIsLoading(false);
- saveStatisticsData(marks as PerformanceCurrent);
+ setIsLoading(false)
+ saveStatisticsData(marks as PerformanceCurrent)
},
() => {
showSnackbar({
- icon: ,
+ icon: (
+
+ ),
title: 'Ошибка при попытке сделать запрос',
subtitle: 'Сообщите нам об этом',
- });
- setIsLoading(false);
+ })
+ setIsLoading(false)
},
setIsLoading,
- showSnackbar,
- );
- localStorage.setItem('savedMarks', JSON.stringify(marks));
- localStorage.setItem('lastFetchTime', String(Date.now()));
- setMarksForSubject(marks as PerformanceCurrent);
- saveStatisticsData(marks as PerformanceCurrent);
- setIsLoading(false);
- return marks;
+ showSnackbar
+ )
+ localStorage.setItem('savedMarks', JSON.stringify(marks))
+ localStorage.setItem('lastFetchTime', String(Date.now()))
+ setMarksForSubject(marks as PerformanceCurrent)
+ saveStatisticsData(marks as PerformanceCurrent)
+ setIsLoading(false)
+ return marks
}
- setIsLoading(false);
+ setIsLoading(false)
showSnackbar({
title: 'Оценки взяты из кеша',
onActionClick: () => fetchMarks(true),
action: 'Загрузить новые',
- icon: ,
- });
- const savedMarks = localStorage.getItem('savedMarks');
- const marks = savedMarks ? JSON.parse(savedMarks) as PerformanceCurrent : null;
- saveStatisticsData(marks);
- return marks ?? undefined;
+ icon: ,
+ })
+ const savedMarks = localStorage.getItem('savedMarks')
+ const marks = savedMarks
+ ? (JSON.parse(savedMarks) as PerformanceCurrent)
+ : null
+ saveStatisticsData(marks)
+ return marks ?? undefined
} catch (error) {
- setIsLoading(false);
+ setIsLoading(false)
showSnackbar({
- icon: ,
+ icon: (
+
+ ),
title: 'Ошибка при попытке загрузить оценки',
action: 'Попробовать снова',
onActionClick: () => fetchMarks(true),
- });
- console.error('Ошибка при получении оценок:', error);
- return undefined;
+ })
+ console.error('Ошибка при получении оценок:', error)
+ return undefined
}
- };
+ }
const fetchData = async () => {
try {
- const marks = await fetchMarks();
+ const marks = await fetchMarks()
- setMarksForSubject(marks as unknown as PerformanceCurrent);
+ setMarksForSubject(marks as unknown as PerformanceCurrent)
} catch (error) {
- console.error('Ошибка при получении данных:', error);
+ console.error('Ошибка при получении данных:', error)
}
- };
+ }
useEffect(() => {
- fetchData();
- }, []);
+ fetchData()
+ }, [])
return (
routeNavigator.back()}
>
-
- fetchMarks(true)} isFetching={isLoading}>
-
+
+ fetchMarks(true)}
+ isFetching={isLoading}
+ >
+
- {isLoading
- ? (
-
-
-
- )
- : (
-
- )}
- {isLoading
- ? (
-
-
-
- )
- : (
-
-
-
- )}
+ {isLoading ? (
+
+
+
+ ) : (
+
+ )}
+ {isLoading ? (
+
+
+
+ ) : (
+
+
+
+ )}
{snackbar}
- );
-};
+ )
+}
-export default Marks;
+export default Marks
diff --git a/src/views/Notifications.tsx b/src/views/Notifications.tsx
index 9bfc67f8..81b0d76a 100644
--- a/src/views/Notifications.tsx
+++ b/src/views/Notifications.tsx
@@ -1,166 +1,209 @@
-import { FC, useEffect, useState } from 'react';
import {
- Button, ButtonGroup, Card, Div, Group, Header, Link, Panel, Placeholder, Spinner, Title, View, Text, Subhead,
-} from '@vkontakte/vkui';
-import { useActiveVkuiLocation, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
-import { Icon28ErrorCircleOutline } from '@vkontakte/icons';
-import { NotificationsResponse } from 'diary-shared';
-import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack';
-import { handleResponse } from '../utils/handleResponse';
-import getAds from '../methods/server/getAds';
-import { useSnackbar } from '../hooks';
-import SubtitleWithBorder from '../components/SubtitleWithBorder';
+ Button,
+ ButtonGroup,
+ Card,
+ Div,
+ Group,
+ Header,
+ Link,
+ Panel,
+ Placeholder,
+ Spinner,
+ Subhead,
+ Text,
+ Title,
+ View,
+} from '@vkontakte/vkui'
+import {
+ useActiveVkuiLocation,
+ useRouteNavigator,
+} from '@vkontakte/vk-mini-apps-router'
+import { Icon28ErrorCircleOutline } from '@vkontakte/icons'
+import { NotificationsResponse } from 'diary-shared'
+import { useEffect, useState } from 'preact/hooks'
+import { FC } from 'preact/compat'
+import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack'
+import { handleResponse } from '../utils/handleResponse'
+import { useSnackbar } from '../hooks'
+import SubtitleWithBorder from '../components/SubtitleWithBorder'
+import { getAds } from '../methods'
const Notifications: FC<{ id: string }> = ({ id }) => {
- const { panel: activePanel, panelsHistory } = useActiveVkuiLocation();
- const routeNavigator = useRouteNavigator();
+ const { panel: activePanel, panelsHistory } = useActiveVkuiLocation()
+ const routeNavigator = useRouteNavigator()
- const [notifications, setNotifications] = useState(null);
- const [isLoading, setLoading] = useState(false);
- const [isError, setIsError] = useState(false);
- const [snackbar, showSnackbar] = useSnackbar();
+ const [notifications, setNotifications] = useState<
+ NotificationsResponse[] | null
+ >(null)
+ const [isLoading, setLoading] = useState(false)
+ const [isError, setIsError] = useState(false)
+ const [snackbar, showSnackbar] = useSnackbar()
const updateCache = (ads: NotificationsResponse[]) => {
- localStorage.setItem('savedAds', JSON.stringify(ads));
- localStorage.setItem('lastFetchTime', String(Date.now()));
- };
+ localStorage.setItem('savedAds', JSON.stringify(ads))
+ localStorage.setItem('lastFetchTime', String(Date.now()))
+ }
const handleError = () => {
- setLoading(false);
- setIsError(true);
- };
+ setLoading(false)
+ setIsError(true)
+ }
const fetchAds = async (isHandle?: boolean) => {
- setLoading(true);
+ setLoading(true)
try {
if (isHandle) {
- const ads = await getAds();
+ const ads = await getAds()
handleResponse(
ads,
handleError,
handleError,
() => {
- setLoading(false);
- setIsError(false);
+ setLoading(false)
+ setIsError(false)
},
- showSnackbar,
- );
- updateCache(ads as NotificationsResponse[]);
- setNotifications(ads as NotificationsResponse[]);
+ showSnackbar
+ )
+ updateCache(ads as NotificationsResponse[])
+ setNotifications(ads as NotificationsResponse[])
} else {
- const cachedAds = JSON.parse(localStorage.getItem('savedAds') || '') as NotificationsResponse[] | null;
- setNotifications(cachedAds);
+ const cachedAds = JSON.parse(localStorage.getItem('savedAds') || '') as
+ | NotificationsResponse[]
+ | null
+ setNotifications(cachedAds)
}
- setLoading(false);
+ setLoading(false)
} catch (error) {
- setLoading(false);
+ setLoading(false)
showSnackbar({
- icon: ,
+ icon: (
+
+ ),
title: 'Ошибка при попытке загрузить объявления',
action: 'Попробовать снова',
onActionClick: () => fetchAds(true),
- });
- console.error('Ошибка при получении объявлений:', error);
+ })
+ console.error('Ошибка при получении объявлений:', error)
}
- };
+ }
useEffect(() => {
- const cachedAds = localStorage.getItem('savedAds');
+ const cachedAds = localStorage.getItem('savedAds')
if (cachedAds) {
- setNotifications(JSON.parse(cachedAds) as NotificationsResponse[]);
+ setNotifications(JSON.parse(cachedAds) as NotificationsResponse[])
showSnackbar({
title: 'Данные взяты из кеша',
action: 'Загрузить новые',
onActionClick: () => fetchAds(true),
- });
+ })
} else {
- fetchAds(true);
+ fetchAds(true)
}
- }, []);
+ }, [])
return (
routeNavigator.back()}
>
-
+
- {notifications && notifications?.length > 0 && (
- notifications?.map(({
- title, id: _id, date, isForEmployees, isForParents, isForStudents, deleteInDays, text,
- }) => (
-
- {isForEmployees && Для работников}
- {isForParents && Для родителей}
- {isForStudents && Для студентов}
-
- )}
- header={(
-
- Удалится через
- {' '}
- {deleteInDays}
- {' '}
- дней
-
- )}
- >
- {new Date(date).toLocaleDateString()}
-
-)}
- >
-
-
-
{title}
- {text}
-
-
-
- ))
- )}
+ {notifications &&
+ notifications?.length > 0 &&
+ notifications?.map(
+ ({
+ title,
+ id: _id,
+ date,
+ isForEmployees,
+ isForParents,
+ isForStudents,
+ deleteInDays,
+ text,
+ }) => (
+
+ {isForEmployees && (
+ Для работников
+ )}
+ {isForParents && (
+
+ Для родителей
+
+ )}
+ {isForStudents && (
+
+ Для студентов
+
+ )}
+
+ }
+ header={
+ Удалится через {deleteInDays} дней
+ }
+ >
+ {new Date(date).toLocaleDateString()}
+
+ }
+ >
+
+
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
+
{title}
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/}
+ {text}
+
+
+
+ )
+ )}
{isLoading && (
-
-
-
+
+
+
)}
{isError && (
-
-
-
- Сообщить о проблеме
-
-
-)}
- />
+
+
+
+ Сообщить о проблеме
+
+
+ }
+ />
)}
- {notifications && notifications?.length < 1 &&
}
+ {notifications && notifications?.length < 1 && (
+
+ )}
{snackbar}
- );
-};
+ )
+}
-export default Notifications;
+export default Notifications
diff --git a/src/views/Schedule.tsx b/src/views/Schedule.tsx
index 9aa58600..f4e5caf4 100644
--- a/src/views/Schedule.tsx
+++ b/src/views/Schedule.tsx
@@ -1,120 +1,150 @@
import {
- FC, lazy, useEffect, useState,
-} from 'react';
+ Button,
+ ButtonGroup,
+ Div,
+ Group,
+ Header,
+ IconButton,
+ Link,
+ Panel,
+ PanelSpinner,
+ Placeholder,
+ PullToRefresh,
+ View,
+} from '@vkontakte/vkui'
import {
- Button, ButtonGroup, Div, Group, Header, IconButton, Link, Panel, PanelSpinner, Placeholder, PullToRefresh, View,
-} from '@vkontakte/vkui';
-import { useActiveVkuiLocation, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
+ useActiveVkuiLocation,
+ useRouteNavigator,
+} from '@vkontakte/vk-mini-apps-router'
import {
Icon16ArrowLeftOutline,
Icon16ArrowRightOutline,
- Icon28ErrorCircleOutline,
Icon24ChevronRightCircle,
-} from '@vkontakte/icons';
-import { addDays, endOfWeek, startOfWeek } from '@vkontakte/vkui/dist/lib/date';
-import { Day, PerformanceCurrent } from 'diary-shared';
-import { getLessons, getPerformance } from '../methods';
-import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack';
-import Suspense from '../components/UI/Suspense';
+ Icon28ErrorCircleOutline,
+} from '@vkontakte/icons'
+import { addDays, endOfWeek, startOfWeek } from '@vkontakte/vkui/dist/lib/date'
+import { Day, PerformanceCurrent } from 'diary-shared'
+import { FC, lazy } from 'preact/compat'
+import { useEffect, useState } from 'preact/hooks'
+import { getLessons, getPerformance } from '../methods'
+import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack'
+import Suspense from '../components/UI/Suspense'
import {
useDebouncedChangeWeek,
useRateLimitExceeded,
- useSnackbar,
useScrollPosition,
-} from '../hooks';
-import ExplanationTooltip from '../components/UI/ExplanationTooltip';
-import { handleResponse } from '../utils/handleResponse';
+ useSnackbar,
+} from '../hooks'
+import ExplanationTooltip from '../components/UI/ExplanationTooltip'
+import { handleResponse } from '../utils/handleResponse'
-const MarksByDay = lazy(() => import('../components/UI/MarksByDay'));
-const CalendarRange = lazy(() => import('../components/UI/CalendarRange'));
-const ScheduleGroup = lazy(() => import('../components/ScheduleGroup'));
+const MarksByDay = lazy(() => import('../components/UI/MarksByDay'))
+const CalendarRange = lazy(() => import('../components/UI/CalendarRange'))
+const ScheduleGroup = lazy(() => import('../components/ScheduleGroup'))
const Schedule: FC<{ id: string }> = ({ id }) => {
- const currentDate = new Date();
-
- const scrollPosition = useScrollPosition();
- const showToTopButton = scrollPosition > 700;
-
- const { panel: activePanel, panelsHistory } = useActiveVkuiLocation();
- const routeNavigator = useRouteNavigator();
- const [lessonsState, setLessons] = useState();
- const [startDate, setStartDate] = useState(startOfWeek(currentDate));
- const [endDate, setEndDate] = useState(endOfWeek(currentDate));
- const [isLoading, setIsLoading] = useState(false);
- const [isError, setIsError] = useState(false);
- const [marksData, setMarksData] = useState(null);
- const [isMarksLoading, setIsMarksLoading] = useState(false);
- const [rateSnackbar, handleRateLimitExceeded] = useRateLimitExceeded();
- const [snackbar, showSnackbar] = useSnackbar();
+ const currentDate = new Date()
+
+ const scrollPosition = useScrollPosition()
+ const showToTopButton = scrollPosition > 700
+
+ const { panel: activePanel, panelsHistory } = useActiveVkuiLocation()
+ const routeNavigator = useRouteNavigator()
+ const [lessonsState, setLessons] = useState()
+ const [startDate, setStartDate] = useState(startOfWeek(currentDate))
+ const [endDate, setEndDate] = useState(endOfWeek(currentDate))
+ const [isLoading, setIsLoading] = useState(false)
+ const [isError, setIsError] = useState(false)
+ const [marksData, setMarksData] = useState(null)
+ const [isMarksLoading, setIsMarksLoading] = useState(false)
+ const [rateSnackbar, handleRateLimitExceeded] = useRateLimitExceeded()
+ const [snackbar, showSnackbar] = useSnackbar()
const updateDatesFromData = (data: Day[]) => {
- const firstLessonDate = data && data.length > 0 ? new Date(data[0].date) : startDate;
- const lastLessonDate = data && data.length > 0 ? new Date(data[data.length - 1].date) : endDate;
- setStartDate(startOfWeek(firstLessonDate));
- setEndDate(endOfWeek(lastLessonDate));
- };
+ const firstLessonDate =
+ data && data.length > 0 ? new Date(data[0].date) : startDate
+ const lastLessonDate =
+ data && data.length > 0 ? new Date(data[data.length - 1].date) : endDate
+ setStartDate(startOfWeek(firstLessonDate))
+ setEndDate(endOfWeek(lastLessonDate))
+ }
const [isCurrent, setIsCurrent] = useState(() => {
- const storedIsCurrent = localStorage.getItem('isCurrent');
- return storedIsCurrent ? JSON.parse(storedIsCurrent) as boolean : true;
- });
+ const storedIsCurrent = localStorage.getItem('isCurrent')
+ return storedIsCurrent ? (JSON.parse(storedIsCurrent) as boolean) : true
+ })
const handleReloadData = async () => {
- setIsLoading(true);
- setIsMarksLoading(true);
- setIsError(false);
- localStorage.setItem('isCurrent', JSON.stringify(true));
- setIsCurrent(true);
- const newEndDate = new Date(endDate);
- newEndDate.setDate(newEndDate.getDate() + 7);
+ setIsLoading(true)
+ setIsMarksLoading(true)
+ setIsError(false)
+ localStorage.setItem('isCurrent', JSON.stringify(true))
+ setIsCurrent(true)
+ const newEndDate = new Date(endDate)
+ newEndDate.setDate(newEndDate.getDate() + 7)
try {
- const data = await getLessons(startDate, newEndDate);
- const marks = await getPerformance();
-
- handleResponse(data, () => {
- setIsMarksLoading(false);
- }, handleRateLimitExceeded, setIsLoading, showSnackbar);
-
- handleResponse(marks, () => {
- setIsMarksLoading(false);
- }, handleRateLimitExceeded, setIsLoading, showSnackbar);
-
- setMarksData(marks as PerformanceCurrent);
- setLessons(data as Day[]);
- updateDatesFromData(data as Day[]);
-
- localStorage.setItem('savedLessons', JSON.stringify(data));
- localStorage.setItem('savedMarks', JSON.stringify(marks));
+ const data = await getLessons(startDate, newEndDate)
+ const marks = await getPerformance()
+
+ handleResponse(
+ data,
+ () => {
+ setIsMarksLoading(false)
+ },
+ handleRateLimitExceeded,
+ setIsLoading,
+ showSnackbar
+ )
+
+ handleResponse(
+ marks,
+ () => {
+ setIsMarksLoading(false)
+ },
+ handleRateLimitExceeded,
+ setIsLoading,
+ showSnackbar
+ )
+
+ setMarksData(marks as PerformanceCurrent)
+ setLessons(data as Day[])
+ updateDatesFromData(data as Day[])
+
+ localStorage.setItem('savedLessons', JSON.stringify(data))
+ localStorage.setItem('savedMarks', JSON.stringify(marks))
} catch (error) {
- setIsError(true);
+ setIsError(true)
showSnackbar({
title: 'Ошибка при попытке получить новые данные',
action: 'Повторить',
onActionClick: handleReloadData,
- });
- console.error(error);
+ })
+ console.error(error)
} finally {
- setIsLoading(false);
- setIsMarksLoading(false);
+ setIsLoading(false)
+ setIsMarksLoading(false)
}
- };
+ }
- const getError = () => showSnackbar({
- title: 'Ошибка при попытке получить расписание',
- action: 'Повторить',
- onActionClick: handleReloadData,
- });
+ const getError = () =>
+ showSnackbar({
+ title: 'Ошибка при попытке получить расписание',
+ action: 'Повторить',
+ onActionClick: handleReloadData,
+ })
useEffect(() => {
- const savedLessons = localStorage.getItem('savedLessons');
- const getLastRequestTime = localStorage.getItem('lastRequestTime');
- const currentTime = Date.now();
- const lastRequestTime = getLastRequestTime ? parseInt(getLastRequestTime, 10) : 0;
- const timeSinceLastRequest = currentTime - lastRequestTime;
+ const savedLessons = localStorage.getItem('savedLessons')
+ const getLastRequestTime = localStorage.getItem('lastRequestTime')
+ const currentTime = Date.now()
+ const lastRequestTime = getLastRequestTime
+ ? parseInt(getLastRequestTime, 10)
+ : 0
+ const timeSinceLastRequest = currentTime - lastRequestTime
const gettedLessons = async () => {
- setIsLoading(true);
- setIsError(false);
+ setIsLoading(true)
+ setIsError(false)
if (savedLessons || timeSinceLastRequest < 30000) {
showSnackbar({
@@ -122,344 +152,415 @@ const Schedule: FC<{ id: string }> = ({ id }) => {
action: 'Загрузить новые',
onActionClick: handleReloadData,
title: 'Данные взяты из кеша',
- });
- setIsLoading(false);
- return;
+ })
+ setIsLoading(false)
+ return
}
try {
- const data = await getLessons(startDate, endDate);
+ const data = await getLessons(startDate, endDate)
- handleResponse(data, () => {
- setIsLoading(false);
- setIsMarksLoading(false);
- }, handleRateLimitExceeded, setIsLoading, showSnackbar);
+ handleResponse(
+ data,
+ () => {
+ setIsLoading(false)
+ setIsMarksLoading(false)
+ },
+ handleRateLimitExceeded,
+ setIsLoading,
+ showSnackbar
+ )
- setLessons(data as Day[]);
+ setLessons(data as Day[])
- localStorage.setItem('lastRequestTime', currentTime.toString());
+ localStorage.setItem('lastRequestTime', currentTime.toString())
- updateDatesFromData(data as Day[]);
+ updateDatesFromData(data as Day[])
} catch (error) {
- setIsError(true);
- getError();
- console.error(error);
+ setIsError(true)
+ getError()
+ console.error(error)
} finally {
- setIsLoading(false);
+ setIsLoading(false)
}
- };
+ }
if (savedLessons) {
- setLessons(JSON.parse(savedLessons) as Day[]);
- const firstLessonDate = JSON.parse(savedLessons)[0] ? new Date(JSON.parse(savedLessons)[0].date as string) : startDate;
- const lastLessonDate = JSON.parse(savedLessons)[JSON.parse(savedLessons).length - 1]
- ? new Date(JSON.parse(savedLessons)[JSON.parse(savedLessons).length - 1].date as string)
- : endDate;
- setStartDate(startOfWeek(firstLessonDate));
- setEndDate(endOfWeek(lastLessonDate));
+ setLessons(JSON.parse(savedLessons) as Day[])
+ const firstLessonDate = JSON.parse(savedLessons)[0]
+ ? new Date(JSON.parse(savedLessons)[0].date as string)
+ : startDate
+ const lastLessonDate = JSON.parse(savedLessons)[
+ JSON.parse(savedLessons).length - 1
+ ]
+ ? new Date(
+ JSON.parse(savedLessons)[JSON.parse(savedLessons).length - 1]
+ .date as string
+ )
+ : endDate
+ setStartDate(startOfWeek(firstLessonDate))
+ setEndDate(endOfWeek(lastLessonDate))
}
- gettedLessons();
- }, []);
+ gettedLessons()
+ }, [])
useEffect(() => {
- const savedMarks = localStorage.getItem('savedMarks');
+ const savedMarks = localStorage.getItem('savedMarks')
if (savedMarks) {
- setMarksData(JSON.parse(savedMarks) as PerformanceCurrent);
- setIsMarksLoading(false);
+ setMarksData(JSON.parse(savedMarks) as PerformanceCurrent)
+ setIsMarksLoading(false)
}
const fetchMarksData = async () => {
- setIsMarksLoading(true);
+ setIsMarksLoading(true)
if (savedMarks) {
- setIsMarksLoading(false);
- return;
+ setIsMarksLoading(false)
+ return
}
try {
- const marks = await getPerformance();
-
- handleResponse(marks, () => {
- setIsLoading(false);
- setIsMarksLoading(false);
- }, handleRateLimitExceeded, setIsLoading, showSnackbar);
+ const marks = await getPerformance()
+
+ handleResponse(
+ marks,
+ () => {
+ setIsLoading(false)
+ setIsMarksLoading(false)
+ },
+ handleRateLimitExceeded,
+ setIsLoading,
+ showSnackbar
+ )
if (typeof marks !== 'number') {
- setMarksData(marks);
- localStorage.setItem('savedMarks', JSON.stringify(marks));
+ setMarksData(marks)
+ localStorage.setItem('savedMarks', JSON.stringify(marks))
}
} catch (error) {
- console.error(error);
+ console.error(error)
showSnackbar({
title: 'Ошибка при попытке получить оценки',
action: 'Повторить',
icon: ,
onActionClick: fetchMarksData,
- });
+ })
} finally {
- setIsMarksLoading(false);
+ setIsMarksLoading(false)
}
- };
+ }
- fetchMarksData();
- }, []);
+ fetchMarksData()
+ }, [])
const sendToServerIfValid = async (start: Date, end: Date) => {
- setIsLoading(true);
- setIsCurrent(false);
+ setIsLoading(true)
+ setIsCurrent(false)
if (start <= end) {
- const differenceInDays = (end.getTime() - start.getTime()) / (1000 * 3600 * 24);
+ const differenceInDays =
+ (end.getTime() - start.getTime()) / (1000 * 3600 * 24)
if (differenceInDays <= 14) {
- const data = await getLessons(start, end);
-
- handleResponse(data, () => {
- setIsLoading(false);
- setIsMarksLoading(false);
- }, handleRateLimitExceeded, setIsLoading, showSnackbar);
-
- setLessons(data as Day[]);
-
- localStorage.setItem('savedLessons', JSON.stringify(data));
+ const data = await getLessons(start, end)
+
+ handleResponse(
+ data,
+ () => {
+ setIsLoading(false)
+ setIsMarksLoading(false)
+ },
+ handleRateLimitExceeded,
+ setIsLoading,
+ showSnackbar
+ )
+
+ setLessons(data as Day[])
+
+ localStorage.setItem('savedLessons', JSON.stringify(data))
} else {
- console.info('Разница между датами больше 14-и дней');
+ console.info('Разница между датами больше 14-и дней')
- const newEndDate = new Date(start);
- newEndDate.setDate(newEndDate.getDate() + 14);
+ const newEndDate = new Date(start)
+ newEndDate.setDate(newEndDate.getDate() + 14)
- setEndDate(newEndDate);
+ setEndDate(newEndDate)
if (!snackbar) {
showSnackbar({
title: 'Разница между датами больше 14-и дней',
subtitle: `Конечная дата будет автоматически изменена на ${newEndDate.toLocaleString()}`,
- });
+ })
}
- const data = await getLessons(start, newEndDate);
+ const data = await getLessons(start, newEndDate)
- handleResponse(data, () => {
- setIsLoading(false);
- setIsMarksLoading(false);
- }, handleRateLimitExceeded, setIsLoading, showSnackbar);
+ handleResponse(
+ data,
+ () => {
+ setIsLoading(false)
+ setIsMarksLoading(false)
+ },
+ handleRateLimitExceeded,
+ setIsLoading,
+ showSnackbar
+ )
- setLessons(data as Day[]);
+ setLessons(data as Day[])
- localStorage.setItem('savedLessons', JSON.stringify(data));
+ localStorage.setItem('savedLessons', JSON.stringify(data))
}
} else {
- console.info('Начальная дата больше конечной');
+ console.info('Начальная дата больше конечной')
if (!snackbar) {
showSnackbar({
- subtitle: 'Конечная дата будет автоматически установлена на 5 дней больше начальной',
+ subtitle:
+ 'Конечная дата будет автоматически установлена на 5 дней больше начальной',
title: 'Начальная дата больше конечной',
- });
+ })
- const newEndDate = new Date(start);
- newEndDate.setDate(newEndDate.getDate() + 5);
- setEndDate(newEndDate);
+ const newEndDate = new Date(start)
+ newEndDate.setDate(newEndDate.getDate() + 5)
+ setEndDate(newEndDate)
- const data = await getLessons(start, newEndDate);
+ const data = await getLessons(start, newEndDate)
- handleResponse(data, () => {
- setIsLoading(false);
- setIsMarksLoading(false);
- }, handleRateLimitExceeded, setIsLoading, showSnackbar);
+ handleResponse(
+ data,
+ () => {
+ setIsLoading(false)
+ setIsMarksLoading(false)
+ },
+ handleRateLimitExceeded,
+ setIsLoading,
+ showSnackbar
+ )
- setLessons(data as Day[]);
+ setLessons(data as Day[])
- localStorage.setItem('savedLessons', JSON.stringify(data));
+ localStorage.setItem('savedLessons', JSON.stringify(data))
}
}
- setIsLoading(false);
- };
+ setIsLoading(false)
+ }
const handleStartDateChange = (newStartDate: Date) => {
if (newStartDate.getTime() === startDate.getTime()) {
- return;
+ return
}
- setStartDate(newStartDate);
- sendToServerIfValid(newStartDate, endDate);
- };
+ setStartDate(newStartDate)
+ sendToServerIfValid(newStartDate, endDate)
+ }
const handleEndDateChange = (newEndDate: Date) => {
if (newEndDate.getTime() === endDate.getTime()) {
- return;
+ return
}
- setEndDate(newEndDate);
- sendToServerIfValid(startDate, newEndDate);
- };
+ setEndDate(newEndDate)
+ sendToServerIfValid(startDate, newEndDate)
+ }
const getCurrentWeek = async () => {
- const startWeek = startOfWeek(currentDate);
- const startOfCurrWeek = startOfWeek(startDate);
- const endWeek = addDays(endOfWeek(currentDate), 7);
+ const startWeek = startOfWeek(currentDate)
+ const startOfCurrWeek = startOfWeek(startDate)
+ const endWeek = addDays(endOfWeek(currentDate), 7)
const startWeekStr = startWeek.toLocaleString('default', {
month: 'short',
day: 'numeric',
year: 'numeric',
- });
+ })
const startOfCurrWeekStr = startOfCurrWeek.toLocaleString('default', {
month: 'short',
day: 'numeric',
year: 'numeric',
- });
+ })
if (startWeekStr === startOfCurrWeekStr) {
showSnackbar({
title: 'Вы уже на текущей неделе',
- });
- localStorage.setItem('isCurrent', JSON.stringify(true));
- setIsCurrent(true);
- return;
+ })
+ localStorage.setItem('isCurrent', JSON.stringify(true))
+ setIsCurrent(true)
+ return
}
- setIsLoading(true);
+ setIsLoading(true)
try {
- const data = await getLessons(startWeek, endWeek);
-
- handleResponse(data, () => {
- setIsLoading(false);
- setIsMarksLoading(false);
- }, handleRateLimitExceeded, setIsLoading, showSnackbar);
-
- setLessons(data as Day[]);
- setStartDate(startWeek);
- setEndDate(endWeek);
-
- localStorage.setItem('isCurrent', JSON.stringify(true));
- setIsCurrent(true);
+ const data = await getLessons(startWeek, endWeek)
+
+ handleResponse(
+ data,
+ () => {
+ setIsLoading(false)
+ setIsMarksLoading(false)
+ },
+ handleRateLimitExceeded,
+ setIsLoading,
+ showSnackbar
+ )
+
+ setLessons(data as Day[])
+ setStartDate(startWeek)
+ setEndDate(endWeek)
+
+ localStorage.setItem('isCurrent', JSON.stringify(true))
+ setIsCurrent(true)
} catch (e) {
- console.error(e);
- getError();
+ console.error(e)
+ getError()
} finally {
- setIsLoading(false);
+ setIsLoading(false)
}
- };
+ }
const debouncedChangeWeekHook = useDebouncedChangeWeek(
startDate,
endDate,
setIsCurrent,
setStartDate,
- setEndDate,
- );
- const { handleButtonClick: debouncedHandleButtonClick } = debouncedChangeWeekHook;
+ setEndDate
+ )
+ const { handleButtonClick: debouncedHandleButtonClick } =
+ debouncedChangeWeekHook
const Buttons = (
debouncedHandleButtonClick('prev', sendToServerIfValid)}
>
-
- );
+ )
const weekString = `
${startDate.getDate()}
- ${startDate.toLocaleString('default', { month: 'long' })
- .slice(0, 3)}
+ ${startDate.toLocaleString('default', { month: 'long' }).slice(0, 3)}
-
${endDate.getDate()}
- ${endDate.toLocaleString('default', { month: 'long' })
- .slice(0, 3)}`;
+ ${endDate.toLocaleString('default', { month: 'long' }).slice(0, 3)}`
return (
routeNavigator.back()}
>
-
+
-
- {isMarksLoading ? : }
+
+ {isMarksLoading ? (
+
+ ) : (
+
+ )}
Выбор даты}
- description='Разница между датами не может быть больше 14-и дней'
+ header={}
+ description="Разница между датами не может быть больше 14-и дней"
>
-
+
}
+ label={
+
+ }
value={startDate}
onDateChange={handleStartDateChange}
/>
}
+ label={
+
+ }
value={endDate}
onDateChange={handleEndDateChange}
/>
-
+
+ header={
+
- )}
+ }
>
- {isLoading
- ?
- : }
+ {isLoading ? (
+
+ ) : (
+
+ )}
- {isError
- && (
+ {isError && (
- Попробовать снова
-
+ header="Ошибка при загрузке"
+ action={
+
+
+ Попробовать снова
+
+
Сообщить о проблеме
- )}
+ }
/>
)}
{showToTopButton && (
{
window.scrollTo({
top: 0,
behavior: 'smooth',
- });
+ })
}}
>
)}
@@ -468,7 +569,7 @@ const Schedule: FC<{ id: string }> = ({ id }) => {
- );
-};
+ )
+}
-export default Schedule;
+export default Schedule
diff --git a/src/views/Settings.tsx b/src/views/Settings.tsx
index 00f5ac86..f4275677 100644
--- a/src/views/Settings.tsx
+++ b/src/views/Settings.tsx
@@ -1,165 +1,169 @@
-import {
- FC, useEffect, useRef, useState,
-} from 'react';
import {
Alert,
- CellButton, Group, Header, InfoRow, Panel, ScreenSpinner, SimpleCell, Subhead, Switch, View,
-} from '@vkontakte/vkui';
-import { useActiveVkuiLocation, useRouteNavigator } from '@vkontakte/vk-mini-apps-router';
+ CellButton,
+ Group,
+ Header,
+ InfoRow,
+ Panel,
+ ScreenSpinner,
+ SimpleCell,
+ Subhead,
+ Switch,
+ View,
+} from '@vkontakte/vkui'
+import {
+ useActiveVkuiLocation,
+ useRouteNavigator,
+} from '@vkontakte/vk-mini-apps-router'
import {
- Icon28ClearDataOutline,
+ // Icon28ClearDataOutline,
Icon28DoorArrowRightOutline,
Icon28HomeArrowDownOutline,
Icon28IncognitoOutline,
Icon28RefreshOutline,
Icon28ThumbsUpCircleFillGreen,
-} from '@vkontakte/icons';
-import bridge from '@vkontakte/vk-bridge';
-import { AuthData } from 'diary-shared';
-import { Storage } from '../types';
-import {
- appStorageSet, getVkStorageData, getVkStorageKeys,
-} from '../methods';
-import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack';
-import { useSnackbar } from '../hooks';
-import logOut from '../utils/logOut';
+} from '@vkontakte/icons'
+import bridge from '@vkontakte/vk-bridge'
+import { AuthData } from 'diary-shared'
+import { useEffect, useRef, useState } from 'preact/hooks'
+import { FunctionalComponent } from 'preact'
+import { Storage } from '../types'
+import PanelHeaderWithBack from '../components/UI/PanelHeaderWithBack'
+import { useSnackbar } from '../hooks'
+import logOut from '../utils/logOut'
interface ISettings {
- id: string,
+ id: string
}
-const Settings: FC = ({ id }) => {
- const { panel: activePanel, panelsHistory } = useActiveVkuiLocation();
- const routeNavigator = useRouteNavigator();
+const Settings: FunctionalComponent = ({ id }) => {
+ const { panel: activePanel, panelsHistory } = useActiveVkuiLocation()
+ const routeNavigator = useRouteNavigator()
- const [snackbar, showSnackbar] = useSnackbar();
- const cleatCacheSnackbar = () => {
- showSnackbar({
- title: 'Кеш очищен',
- subtitle: 'Необходимая информация загрузится при необходимости',
- });
- };
+ const [snackbar, showSnackbar] = useSnackbar()
+ // const cleatCacheSnackbar = () => {
+ // showSnackbar({
+ // title: 'Кеш очищен',
+ // subtitle: 'Необходимая информация загрузится при необходимости',
+ // })
+ // }
- const [cacheData, setCacheData] = useState([]);
- const [vkCacheData, setVkCacheData] = useState([]);
- const [isHomeScreenSupported, setIsHomeScreenSupported] = useState(false);
+ const [cacheData, setCacheData] = useState([])
+ const [isHomeScreenSupported, setIsHomeScreenSupported] =
+ useState(false)
- const switchRef = useRef(null);
- const [isSwitchChecked, setIsSwitchChecked] = useState(true);
- const [isLoading, setIsLoading] = useState(false);
+ const switchRef = useRef(null)
+ const [isSwitchChecked, setIsSwitchChecked] = useState(true)
+ const [isLoading, setIsLoading] = useState(false)
useEffect(() => {
const checkIsFeatureSupported = async () => {
- await bridge.send('VKWebAppAddToHomeScreenInfo')
+ await bridge
+ .send('VKWebAppAddToHomeScreenInfo')
.then(({ is_added_to_home_screen, is_feature_supported }) => {
if (is_feature_supported) {
- setIsHomeScreenSupported(true);
+ setIsHomeScreenSupported(true)
}
if (is_added_to_home_screen) {
- console.log(is_added_to_home_screen);
+ console.log(is_added_to_home_screen)
}
})
.catch((error) => {
- console.log(error);
- });
- };
-
- checkIsFeatureSupported();
- }, []);
-
- useEffect(() => {
- const allKeys = Object.keys(localStorage);
+ console.log(error)
+ })
+ }
- const getCache = allKeys.map((key) => ({ key, value: localStorage.getItem(key) || 'false' }));
- setCacheData(getCache);
- }, []);
+ checkIsFeatureSupported()
+ }, [])
useEffect(() => {
- const fetchData = async () => {
- const keys = await getVkStorageKeys();
- const data = await getVkStorageData(keys);
-
- const updatedVkCacheData = data.keys.map((item) => {
- if (item.key === 'cookie') {
- return { ...item, value: 'secret' };
- }
- return item;
- });
-
- setVkCacheData(updatedVkCacheData);
- };
+ const allKeys = Object.keys(localStorage)
- fetchData();
- }, []);
+ const getCache = allKeys.map((key) => ({
+ key,
+ value: localStorage.getItem(key) || 'false',
+ }))
+ setCacheData(getCache)
+ }, [])
- const clearCache = () => {
- localStorage.clear();
- setCacheData([]);
-
- if (!snackbar) {
- cleatCacheSnackbar();
- }
- };
+ // const clearCache = () => {
+ // localStorage.clear()
+ // setCacheData([])
+ //
+ // if (!snackbar) {
+ // cleatCacheSnackbar()
+ // }
+ // }
const handleLogOut = () => {
showSnackbar({
title: 'Выход',
- icon: ,
- subtitle: 'После удаления всех данных вы попадёте на страницу авторизации',
- });
+ //@ts-ignore типы React не совсем совместимы с Preact
+ icon: (
+ //@ts-ignore типы React не совсем совместимы с Preact
+
+ ),
+ subtitle:
+ 'После удаления всех данных вы попадёте на страницу авторизации',
+ })
setTimeout(async () => {
try {
- await logOut();
- await routeNavigator.replace('/');
+ await logOut()
+ await routeNavigator.replace('/')
} catch (error) {
- console.error('Error during logout:', error);
+ console.error('Error during logout:', error)
}
- }, 1500);
- };
+ }, 1500)
+ }
const addToHomeScreen = () => {
- bridge.send('VKWebAppAddToHomeScreen')
+ bridge
+ .send('VKWebAppAddToHomeScreen')
.then((data) => {
if (data.result) {
- console.log(data);
+ console.log(data)
}
})
.catch((error) => {
- console.log(error);
- });
- };
+ console.log(error)
+ })
+ }
- const clearCachePopup = (
- clearCache(),
- },
- ]}
- actionsLayout='horizontal'
- onClose={() => routeNavigator.hidePopout()}
- header='Очистка кеша'
- text='После удаления кеша вся информация (оценки, расписание и тд) загрузится повторно.'
- />
- );
+ // const clearCachePopup = (
+ // clearCache(),
+ // },
+ // ]}
+ // actionsLayout="horizontal"
+ // onClose={() => routeNavigator.hidePopout()}
+ // header="Очистка кеша"
+ // text="После удаления кеша вся информация (оценки, расписание и тд) загрузится повторно."
+ // />
+ // )
const logOutPopup = (
= ({ id }) => {
action: () => handleLogOut(),
},
]}
- actionsLayout='horizontal'
+ actionsLayout="horizontal"
onClose={() => routeNavigator.hidePopout()}
- header='Выход'
- text='Вы уверены, что хотите выйти из аккаунта?'
+ header="Выход"
+ text="Вы уверены, что хотите выйти из аккаунта?"
/>
- );
+ )
const reloadCookie = async () => {
- const login = await getVkStorageData(['log']).then((data) => data.keys[0].value);
- const password = await getVkStorageData(['main']).then((data) => data.keys[0].value);
+ const login = localStorage.getItem('log')
+ const password = localStorage.getItem('main')
if (!login || !password) {
showSnackbar({
title: 'Чего-то не хватает',
subtitle: 'Попробуйте перезайти в аккаунт или сообщите об ошибке',
- });
- return;
+ })
+ return
}
try {
- setIsLoading(true);
+ setIsLoading(true)
+ //@ts-ignore типы React не совсем совместимы с Preact
const response = await fetch(`${import.meta.env.VITE_SERVER_URL}/login`, {
method: 'POST',
headers: {
@@ -198,67 +203,64 @@ const Settings: FC = ({ id }) => {
password,
isRemember: true,
}),
- });
+ })
- const data = await response.json() as AuthData;
+ const data = (await response.json()) as AuthData
if (!data.cookie) {
showSnackbar({
title: 'Сервер вернул что-то плохое',
subtitle: 'Попробуйте перезайти в аккаунт или сообщите об ошибке',
- });
- return;
+ })
+ return
}
- await appStorageSet('cookie', data.cookie);
- localStorage.setItem('cookie', data.cookie);
+ localStorage.setItem('cookie', data.cookie)
showSnackbar({
title: 'Cookie обновлена',
icon: ,
subtitle: 'Не забывайте периодически это делать',
- });
+ })
} catch (e) {
showSnackbar({
title: 'Ошибка на сервере',
subtitle: 'Попробуйте перезайти в аккаунт или сообщите об ошибке',
- });
+ })
} finally {
- setIsLoading(false);
+ setIsLoading(false)
}
- };
+ }
return (
routeNavigator.back()}
>
-
- Действия}>
- {isLoading && }
+
+ Действия}>
+ {isLoading && }
}
onChange={() => setIsSwitchChecked(!isSwitchChecked)}
before={}
>
Показывать тех. инфрмацию
- }
- onClick={reloadCookie}
- >
+ } onClick={reloadCookie}>
Обновить cookie
- }
- onClick={() => routeNavigator.showPopout(clearCachePopup)}
- >
- Очистить кеш
-
+ {/*}*/}
+ {/* onClick={() => routeNavigator.showPopout(clearCachePopup)}*/}
+ {/*>*/}
+ {/* Очистить кеш*/}
+ {/**/}
}
onClick={() => routeNavigator.showPopout(logOutPopup)}
@@ -274,12 +276,21 @@ const Settings: FC = ({ id }) => {
)}
- {isSwitchChecked
- && (
- Техническая информация)}>
+ {isSwitchChecked && (
+ Техническая информация}
+ >
Хранится в LocalStorage}>Кеш)}
+ header={
+ //@ts-ignore типы React не совсем совместимы с Preact
+ Хранится в LocalStorage}
+ >
+ Кеш
+
+ }
>
{cacheData.map((item) => (
@@ -287,22 +298,12 @@ const Settings: FC = ({ id }) => {
))}
- VK Storage)}
- >
- {vkCacheData.map((item) => (
-
- {item.value.slice(0, 30)}
-
- ))}
-
- )}
+ )}
{snackbar}
- );
-};
+ )
+}
-export default Settings;
+export default Settings
diff --git a/src/views/index.tsx b/src/views/index.tsx
index f70bbaad..f2ee4ff1 100644
--- a/src/views/index.tsx
+++ b/src/views/index.tsx
@@ -1,13 +1,19 @@
-import { lazy } from 'react';
+import { lazy } from 'preact/compat'
-const Contacts = lazy(() => import('./Contacts'));
-const Schedule = lazy(() => import('./Schedule'));
-const Marks = lazy(() => import('./Marks'));
-const Settings = lazy(() => import('./Settings'));
-const LoginForm = lazy(() => import('./LoginForm'));
-const Attestation = lazy(() => import('./Attestation'));
-const Notifications = lazy(() => import('./Notifications'));
+const Contacts = lazy(() => import('./Contacts'))
+const Schedule = lazy(() => import('./Schedule'))
+const Marks = lazy(() => import('./Marks'))
+const Settings = lazy(() => import('./Settings'))
+const LoginForm = lazy(() => import('./LoginForm'))
+const Attestation = lazy(() => import('./Attestation'))
+const Notifications = lazy(() => import('./Notifications'))
export {
- Contacts, Marks, Schedule, Settings, LoginForm, Attestation, Notifications,
-};
+ Contacts,
+ Marks,
+ Schedule,
+ Settings,
+ LoginForm,
+ Attestation,
+ Notifications,
+}
diff --git a/tsconfig.json b/tsconfig.json
index 532497ae..4c3b6298 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,21 +2,32 @@
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
+ "noEmitOnError": false,
+ /* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
- "jsx": "react-jsx",
- "strict": true,
+ /* Linting */
+ "strict": false,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
- "allowSyntheticDefaultImports": true,
+ "jsx": "preserve",
+ "jsxFactory": "h",
+ "jsxFragmentFactory": "Fragment",
+ "jsxImportSource": "preact",
+ "paths": {
+ "react": ["./node_modules/preact/compat/"],
+ "react-dom": ["./node_modules/preact/compat/"]
+ }
},
- "include": ["src"],
+ "include": [
+ "src/**/*"
+ ],
"references": [{ "path": "./tsconfig.node.json" }]
}
diff --git a/tsconfig.node.json b/tsconfig.node.json
index 42872c59..8784fbe2 100644
--- a/tsconfig.node.json
+++ b/tsconfig.node.json
@@ -6,5 +6,6 @@
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
},
- "include": ["vite.config.ts"]
+ "include": ["vite.config.ts"],
+ "exclude": ["node_modules"]
}
diff --git a/vite.config.ts b/vite.config.ts
index 1d383f8e..8e89c013 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,11 +1,9 @@
import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react-swc';
-// https://vitejs.dev/config/
+import preact from '@preact/preset-vite'
+// https://vitejs.dev/config/
export default defineConfig({
- plugins: [
- react(),
- ],
+ plugins: [preact()],
resolve: {
alias: [{ find: /^@vkontakte\/vkui$/, replacement: '@vkontakte/vkui/dist/cssm' }],
},
@@ -26,15 +24,14 @@ export default defineConfig({
},
rollupOptions: {
logLevel: 'debug',
- input: 'index-a12.html',
+ input: 'index1.html',
output: {
manualChunks: {
- react: ['react', 'react-dom'],
+ '@reduxjs/toolkit': ['@reduxjs/toolkit'],
+ 'react-redux': ['react-redux'],
+ '@vkontakte/icons': ['@vkontakte/icons'],
},
},
},
},
- // Указывать только для dev сборки.
- // Либо index'у вернуть его исходное имя, а переименовывать только при деплое
- base: 'index-a12.html',
})
diff --git a/vk-hosting-config.json b/vk-hosting-config.json
index d447db3d..7518a847 100644
--- a/vk-hosting-config.json
+++ b/vk-hosting-config.json
@@ -1,9 +1,9 @@
{
"static_path": "dist",
- "app_id": 51740302,
+ "app_id": 51723411,
"endpoints": {
- "mobile": "index-a12.html",
- "mvk": "index-a12.html",
- "web": "index-a12.html"
+ "mobile": "index1.html",
+ "mvk": "index1.html",
+ "web": "index1.html"
}
}
diff --git a/yarn.lock b/yarn.lock
index 19034ba2..022db73e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7,13 +7,260 @@
resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
-"@babel/runtime@^7.20.7":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4"
- integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==
+"@ampproject/remapping@^2.2.0":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13":
+ version "7.22.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
+ integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
+ dependencies:
+ "@babel/highlight" "^7.22.13"
+ chalk "^2.4.2"
+
+"@babel/compat-data@^7.22.9":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc"
+ integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==
+
+"@babel/core@^7.13.16", "@babel/core@^7.22.1":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94"
+ integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.22.13"
+ "@babel/generator" "^7.23.0"
+ "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/helper-module-transforms" "^7.23.0"
+ "@babel/helpers" "^7.23.2"
+ "@babel/parser" "^7.23.0"
+ "@babel/template" "^7.22.15"
+ "@babel/traverse" "^7.23.2"
+ "@babel/types" "^7.23.0"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/eslint-parser@^7.13.14", "@babel/eslint-parser@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz#263f059c476e29ca4972481a17b8b660cb025a34"
+ integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==
+ dependencies:
+ "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
+ eslint-visitor-keys "^2.1.0"
+ semver "^6.3.1"
+
+"@babel/generator@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
+ integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
+ dependencies:
+ "@babel/types" "^7.23.0"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
+ jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
+ integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-compilation-targets@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52"
+ integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==
+ dependencies:
+ "@babel/compat-data" "^7.22.9"
+ "@babel/helper-validator-option" "^7.22.15"
+ browserslist "^4.21.9"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-environment-visitor@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+ integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
+"@babel/helper-function-name@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
+ integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+ dependencies:
+ "@babel/template" "^7.22.15"
+ "@babel/types" "^7.23.0"
+
+"@babel/helper-hoist-variables@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+ integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-module-imports@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
+ integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
+ dependencies:
+ "@babel/types" "^7.22.15"
+
+"@babel/helper-module-transforms@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e"
+ integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-module-imports" "^7.22.15"
+ "@babel/helper-simple-access" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/helper-validator-identifier" "^7.22.20"
+
+"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
+ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
+
+"@babel/helper-simple-access@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
+ integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-split-export-declaration@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+ integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-string-parser@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
+ integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+
+"@babel/helper-validator-identifier@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
+"@babel/helper-validator-option@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040"
+ integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==
+
+"@babel/helpers@^7.23.2":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767"
+ integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==
+ dependencies:
+ "@babel/template" "^7.22.15"
+ "@babel/traverse" "^7.23.2"
+ "@babel/types" "^7.23.0"
+
+"@babel/highlight@^7.22.13":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
+ integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.7.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
+ integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-decorators@^7.12.13":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff"
+ integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918"
+ integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-react-jsx-development@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87"
+ integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==
+ dependencies:
+ "@babel/plugin-transform-react-jsx" "^7.22.5"
+
+"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6"
+ integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-module-imports" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-jsx" "^7.22.5"
+ "@babel/types" "^7.22.15"
+
+"@babel/runtime@^7.12.1", "@babel/runtime@^7.20.7", "@babel/runtime@^7.9.2":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885"
+ integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==
dependencies:
regenerator-runtime "^0.14.0"
+"@babel/template@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
+ integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
+ dependencies:
+ "@babel/code-frame" "^7.22.13"
+ "@babel/parser" "^7.22.15"
+ "@babel/types" "^7.22.15"
+
+"@babel/traverse@^7.23.2", "@babel/traverse@^7.7.0":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
+ integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
+ dependencies:
+ "@babel/code-frame" "^7.22.13"
+ "@babel/generator" "^7.23.0"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/parser" "^7.23.0"
+ "@babel/types" "^7.23.0"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.7.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
+ integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
"@esbuild/android-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
@@ -132,9 +379,9 @@
eslint-visitor-keys "^3.3.0"
"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.0", "@eslint-community/regexpp@^4.6.1":
- version "4.8.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005"
- integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4"
+ integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==
"@eslint/eslintrc@^2.1.2":
version "2.1.2"
@@ -151,25 +398,25 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@8.48.0":
- version "8.48.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb"
- integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==
+"@eslint/js@8.52.0":
+ version "8.52.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c"
+ integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==
-"@floating-ui/core@^1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.4.1.tgz#0d633f4b76052668afb932492ac452f7ebe97f17"
- integrity sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==
+"@floating-ui/core@^1.4.2":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c"
+ integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==
dependencies:
- "@floating-ui/utils" "^0.1.1"
+ "@floating-ui/utils" "^0.1.3"
"@floating-ui/dom@^1.5.1":
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.1.tgz#88b70defd002fe851f17b4a25efb2d3c04d7a8d7"
- integrity sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa"
+ integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==
dependencies:
- "@floating-ui/core" "^1.4.1"
- "@floating-ui/utils" "^0.1.1"
+ "@floating-ui/core" "^1.4.2"
+ "@floating-ui/utils" "^0.1.3"
"@floating-ui/react-dom@^2.0.2":
version "2.0.2"
@@ -178,17 +425,17 @@
dependencies:
"@floating-ui/dom" "^1.5.1"
-"@floating-ui/utils@^0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.1.tgz#1a5b1959a528e374e8037c4396c3e825d6cf4a83"
- integrity sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==
+"@floating-ui/utils@^0.1.3":
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9"
+ integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==
-"@humanwhocodes/config-array@^0.11.10":
- version "0.11.11"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844"
- integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==
+"@humanwhocodes/config-array@^0.11.13":
+ version "0.11.13"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297"
+ integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==
dependencies:
- "@humanwhocodes/object-schema" "^1.2.1"
+ "@humanwhocodes/object-schema" "^2.0.1"
debug "^4.1.1"
minimatch "^3.0.5"
@@ -197,12 +444,12 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
-"@humanwhocodes/object-schema@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
- integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+"@humanwhocodes/object-schema@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044"
+ integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==
-"@jridgewell/gen-mapping@^0.3.0":
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
version "0.3.3"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
@@ -234,14 +481,31 @@
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
-"@jridgewell/trace-mapping@^0.3.9":
- version "0.3.19"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811"
- integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==
+"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.20"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
+ integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
+"@mdn/browser-compat-data@^3.3.14":
+ version "3.3.14"
+ resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz#b72a37c654e598f9ae6f8335faaee182bebc6b28"
+ integrity sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==
+
+"@mdn/browser-compat-data@^5.2.34", "@mdn/browser-compat-data@^5.3.13":
+ version "5.3.25"
+ resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.3.25.tgz#fe310bdb448fa4b39e7be155d225888887964af1"
+ integrity sha512-dzZ7Ot5SoiSrqzNR4+YqRrjRxm1K+0XEuTfIdRuUfGrAJp9EMmocLq7pXIJ4aXiX3T5+GZiXmylJzwWsTVYxWQ==
+
+"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
+ version "5.1.1-v1"
+ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129"
+ integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==
+ dependencies:
+ eslint-scope "5.1.1"
+
"@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"
@@ -263,156 +527,161 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
+"@pkgr/utils@^2.3.1":
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc"
+ integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==
+ dependencies:
+ cross-spawn "^7.0.3"
+ fast-glob "^3.3.0"
+ is-glob "^4.0.3"
+ open "^9.1.0"
+ picocolors "^1.0.0"
+ tslib "^2.6.0"
+
+"@preact/preset-vite@^2.5.0":
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/@preact/preset-vite/-/preset-vite-2.6.0.tgz#2b2c54ee2196d75b7b9e0297998497d3dbe37ce0"
+ integrity sha512-5nztNzXbCpqyVum/K94nB2YQ5PTnvWdz4u7/X0jc8+kLyskSSpkNUxLQJeI90zfGSFIX1Ibj2G2JIS/mySHWYQ==
+ dependencies:
+ "@babel/plugin-transform-react-jsx" "^7.22.15"
+ "@babel/plugin-transform-react-jsx-development" "^7.22.5"
+ "@prefresh/vite" "^2.4.1"
+ "@rollup/pluginutils" "^4.1.1"
+ babel-plugin-transform-hook-names "^1.0.2"
+ debug "^4.3.4"
+ kolorist "^1.8.0"
+ resolve "^1.22.8"
+
+"@prefresh/babel-plugin@0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@prefresh/babel-plugin/-/babel-plugin-0.5.0.tgz#61d8ef959007390077c9eddb7e9307c46e19277c"
+ integrity sha512-joAwpkUDwo7ZqJnufXRGzUb+udk20RBgfA8oLPBh5aJH2LeStmV1luBfeJTztPdyCscC2j2SmZ/tVxFRMIxAEw==
+
+"@prefresh/core@^1.5.1":
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/@prefresh/core/-/core-1.5.2.tgz#750e1936d82f3b0a1199d3cda5c35e3443128490"
+ integrity sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==
+
+"@prefresh/utils@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@prefresh/utils/-/utils-1.2.0.tgz#cbdfe549b207041e38bb6cc382408b30cd24fec8"
+ integrity sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==
+
+"@prefresh/vite@^2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@prefresh/vite/-/vite-2.4.1.tgz#c565ae2f8ec2c5ea03611969810dd02a779c2581"
+ integrity sha512-vthWmEqu8TZFeyrBNc9YE5SiC3DVSzPgsOCp/WQ7FqdHpOIJi7Z8XvCK06rBPOtG4914S52MjG9Ls22eVAiuqQ==
+ dependencies:
+ "@babel/core" "^7.22.1"
+ "@prefresh/babel-plugin" "0.5.0"
+ "@prefresh/core" "^1.5.1"
+ "@prefresh/utils" "^1.2.0"
+ "@rollup/pluginutils" "^4.2.1"
+
+"@reduxjs/toolkit@^1.9.7":
+ version "1.9.7"
+ resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.7.tgz#7fc07c0b0ebec52043f8cb43510cf346405f78a6"
+ integrity sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==
+ dependencies:
+ immer "^9.0.21"
+ redux "^4.2.1"
+ redux-thunk "^2.4.2"
+ reselect "^4.1.8"
+
"@remix-run/router@^1.7.1":
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.8.0.tgz#e848d2f669f601544df15ce2a313955e4bf0bafc"
- integrity sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.10.0.tgz#e2170dc2049b06e65bbe883adad0e8ddf8291278"
+ integrity sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw==
-"@rollup/plugin-terser@^0.4.3":
- version "0.4.3"
- resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz#c2bde2fe3a85e45fa68a454d48f4e73e57f98b30"
- integrity sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==
+"@rollup/plugin-terser@^0.4.4":
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz#15dffdb3f73f121aa4fbb37e7ca6be9aeea91962"
+ integrity sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==
dependencies:
serialize-javascript "^6.0.1"
smob "^1.0.0"
terser "^5.17.4"
-"@swc/core-darwin-arm64@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.82.tgz#bbf9874747b51053d8a59ea26c3e235c326f24a3"
- integrity sha512-JfsyDW34gVKD3uE0OUpUqYvAD3yseEaicnFP6pB292THtLJb0IKBBnK50vV/RzEJtc1bR3g1kNfxo2PeurZTrA==
-
-"@swc/core-darwin-x64@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.82.tgz#145cdde16678e0d793620035783e5b413a16ac43"
- integrity sha512-ogQWgNMq7qTpITjcP3dnzkFNj7bh6SwMr859GvtOTrE75H7L7jDWxESfH4f8foB/LGxBKiDNmxKhitCuAsZK4A==
-
-"@swc/core-linux-arm-gnueabihf@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.82.tgz#0c2f32c5793f2ac8e8ccf416aec84d016c30ef7b"
- integrity sha512-7TMXG1lXlNhD0kUiEqs+YlGV4irAdBa2quuy+XI3oJf2fBK6dQfEq4xBy65B3khrorzQS3O0oDGQ+cmdpHExHA==
-
-"@swc/core-linux-arm64-gnu@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.82.tgz#2313d4901fa0ebdd2a0f189909073e1e8a07f1d6"
- integrity sha512-26JkOujbzcItPAmIbD5vHJxQVy5ihcSu3YHTKwope1h28sApZdtE7S3e2G3gsZRTIdsCQkXUtAQeqHxGWWR3pw==
-
-"@swc/core-linux-arm64-musl@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.82.tgz#6e96cf6e52e647fecf27511d766bea90e96f8a2f"
- integrity sha512-8Izj9tuuMpoc3cqiPBRtwqpO1BZ/+sfZVsEhLxrbOFlcSb8LnKyMle1g3JMMUwI4EU75RGVIzZMn8A6GOKdJbA==
-
-"@swc/core-linux-x64-gnu@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.82.tgz#6275c10d7c8c0768550bc7934c9dd8cde4881d92"
- integrity sha512-0GSrIBScQwTaPv46T2qB7XnDYxndRCpwH4HMjh6FN+I+lfPUhTSJKW8AonqrqT1TbpFIgvzQs7EnTsD7AnSCow==
-
-"@swc/core-linux-x64-musl@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.82.tgz#edb98c30bd0de42bf1a63469937630d942c71988"
- integrity sha512-KJUnaaepDKNzrEbwz4jv0iC3/t9x0NSoe06fnkAlhh2+NFKWKKJhVCOBTrpds8n7eylBDIXUlK34XQafjVMUdg==
-
-"@swc/core-win32-arm64-msvc@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.82.tgz#0a8e9b361aac37d01f684c8a3d3e94e5f8c3b14f"
- integrity sha512-TR3MHKhDYIyGyFcyl2d/p1ftceXcubAhX5wRSOdtOyr5+K/v3jbyCCqN7bbqO5o43wQVCwwR/drHleYyDZvg8Q==
-
-"@swc/core-win32-ia32-msvc@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.82.tgz#096854ff764282766271f1354ee1214358a8bf01"
- integrity sha512-ZX4HzVVt6hs84YUg70UvyBJnBOIspmQQM0iXSzBvOikk3zRoN7BnDwQH4GScvevCEBuou60+i4I6d5kHLOfh8Q==
-
-"@swc/core-win32-x64-msvc@1.3.82":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.82.tgz#1181070bff4a13a7fcc7f1020eef1571f8c1257a"
- integrity sha512-4mJMnex21kbQoaHeAmHnVwQN9/XAfPszJ6n9HI7SVH+aAHnbBIR0M59/b50/CJMjTj5niUGk7EwQ3nhVNOG32g==
-
-"@swc/core@^1.3.61":
- version "1.3.82"
- resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.82.tgz#8f6c53db3c23a1769b6c5085fbcb3b1df9548a40"
- integrity sha512-jpC1a18HMH67018Ij2jh+hT7JBFu7ZKcQVfrZ8K6JuEY+kjXmbea07P9MbQUZbAe0FB+xi3CqEVCP73MebodJQ==
- dependencies:
- "@swc/types" "^0.1.4"
- optionalDependencies:
- "@swc/core-darwin-arm64" "1.3.82"
- "@swc/core-darwin-x64" "1.3.82"
- "@swc/core-linux-arm-gnueabihf" "1.3.82"
- "@swc/core-linux-arm64-gnu" "1.3.82"
- "@swc/core-linux-arm64-musl" "1.3.82"
- "@swc/core-linux-x64-gnu" "1.3.82"
- "@swc/core-linux-x64-musl" "1.3.82"
- "@swc/core-win32-arm64-msvc" "1.3.82"
- "@swc/core-win32-ia32-msvc" "1.3.82"
- "@swc/core-win32-x64-msvc" "1.3.82"
-
-"@swc/helpers@^0.5.0", "@swc/helpers@^0.5.1":
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a"
- integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==
+"@rollup/pluginutils@^4.1.1", "@rollup/pluginutils@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d"
+ integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==
+ dependencies:
+ estree-walker "^2.0.1"
+ picomatch "^2.2.2"
+
+"@swc/helpers@^0.5.0", "@swc/helpers@^0.5.1", "@swc/helpers@^0.5.2", "@swc/helpers@^0.5.3":
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.3.tgz#98c6da1e196f5f08f977658b80d6bd941b5f294f"
+ integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==
dependencies:
tslib "^2.4.0"
-"@swc/types@^0.1.4":
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.4.tgz#8d647e111dc97a8e2881bf71c2ee2d011698ff10"
- integrity sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg==
+"@types/hoist-non-react-statics@^3.3.1":
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.4.tgz#cc477ce0283bb9d19ea0cbfa2941fe2c8493a1be"
+ integrity sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ==
+ dependencies:
+ "@types/react" "*"
+ hoist-non-react-statics "^3.3.0"
-"@types/json-schema@^7.0.12":
- version "7.0.12"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
- integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
+"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.9":
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1"
+ integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
-"@types/node@^20.6.1":
- version "20.6.1"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.1.tgz#8b589bba9b2af0128796461a0979764562687e6f"
- integrity sha512-4LcJvuXQlv4lTHnxwyHQZ3uR9Zw2j7m1C9DfuwoTFQQP4Pmu04O6IfLYgMmHoOCt0nosItLLZAH+sOrRE0Bo8g==
+"@types/node@^20.8.7":
+ version "20.8.7"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25"
+ integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==
+ dependencies:
+ undici-types "~5.25.1"
"@types/prop-types@*":
- 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==
+ version "15.7.9"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.9.tgz#b6f785caa7ea1fe4414d9df42ee0ab67f23d8a6d"
+ integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==
-"@types/react-dom@^18.2.7":
- version "18.2.7"
- resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63"
- integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==
- dependencies:
- "@types/react" "*"
-
-"@types/react@*", "@types/react@^18.2.15":
- version "18.2.21"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9"
- integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==
+"@types/react@*":
+ version "18.2.31"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.31.tgz#74ae2630e4aa9af599584157abd3b95d96fb9b40"
+ integrity sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/scheduler@*":
- version "0.16.3"
- resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5"
- integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==
+ version "0.16.5"
+ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.5.tgz#4751153abbf8d6199babb345a52e1eb4167d64af"
+ integrity sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==
-"@types/semver@^7.5.0":
- version "7.5.1"
- resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367"
- integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==
+"@types/semver@^7.3.12", "@types/semver@^7.5.0":
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff"
+ integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==
+
+"@types/use-sync-external-store@^0.0.3":
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43"
+ integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==
"@typescript-eslint/eslint-plugin@^6.0.0":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.5.0.tgz#5cee33edf0d45d5ec773e3b3111206b098ac8599"
- integrity sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz#06abe4265e7c82f20ade2dcc0e3403c32d4f148b"
+ integrity sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==
dependencies:
"@eslint-community/regexpp" "^4.5.1"
- "@typescript-eslint/scope-manager" "6.5.0"
- "@typescript-eslint/type-utils" "6.5.0"
- "@typescript-eslint/utils" "6.5.0"
- "@typescript-eslint/visitor-keys" "6.5.0"
+ "@typescript-eslint/scope-manager" "6.8.0"
+ "@typescript-eslint/type-utils" "6.8.0"
+ "@typescript-eslint/utils" "6.8.0"
+ "@typescript-eslint/visitor-keys" "6.8.0"
debug "^4.3.4"
graphemer "^1.4.0"
ignore "^5.2.4"
@@ -420,85 +689,156 @@
semver "^7.5.4"
ts-api-utils "^1.0.1"
-"@typescript-eslint/parser@^6.0.0", "@typescript-eslint/parser@^6.1.0":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.5.0.tgz#3d6ed231c5e307c5f5f4a0d86893ec01e92b8c77"
- integrity sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==
+"@typescript-eslint/experimental-utils@^2.5.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f"
+ integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==
+ dependencies:
+ "@types/json-schema" "^7.0.3"
+ "@typescript-eslint/typescript-estree" "2.34.0"
+ eslint-scope "^5.0.0"
+ eslint-utils "^2.0.0"
+
+"@typescript-eslint/experimental-utils@^5.0.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741"
+ integrity sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==
dependencies:
- "@typescript-eslint/scope-manager" "6.5.0"
- "@typescript-eslint/types" "6.5.0"
- "@typescript-eslint/typescript-estree" "6.5.0"
- "@typescript-eslint/visitor-keys" "6.5.0"
+ "@typescript-eslint/utils" "5.62.0"
+
+"@typescript-eslint/parser@^6.1.0", "@typescript-eslint/parser@^6.8.0":
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.8.0.tgz#bb2a969d583db242f1ee64467542f8b05c2e28cb"
+ integrity sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==
+ dependencies:
+ "@typescript-eslint/scope-manager" "6.8.0"
+ "@typescript-eslint/types" "6.8.0"
+ "@typescript-eslint/typescript-estree" "6.8.0"
+ "@typescript-eslint/visitor-keys" "6.8.0"
debug "^4.3.4"
-"@typescript-eslint/scope-manager@6.5.0":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz#f2cb20895aaad41b3ad27cc3a338ce8598f261c5"
- integrity sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==
+"@typescript-eslint/scope-manager@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c"
+ integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==
+ dependencies:
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/visitor-keys" "5.62.0"
+
+"@typescript-eslint/scope-manager@6.8.0":
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz#5cac7977385cde068ab30686889dd59879811efd"
+ integrity sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==
dependencies:
- "@typescript-eslint/types" "6.5.0"
- "@typescript-eslint/visitor-keys" "6.5.0"
+ "@typescript-eslint/types" "6.8.0"
+ "@typescript-eslint/visitor-keys" "6.8.0"
-"@typescript-eslint/type-utils@6.5.0":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.5.0.tgz#6d246c93739282bc0d2e623f28d0dec6cfcc38d7"
- integrity sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==
+"@typescript-eslint/type-utils@6.8.0":
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz#50365e44918ca0fd159844b5d6ea96789731e11f"
+ integrity sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==
dependencies:
- "@typescript-eslint/typescript-estree" "6.5.0"
- "@typescript-eslint/utils" "6.5.0"
+ "@typescript-eslint/typescript-estree" "6.8.0"
+ "@typescript-eslint/utils" "6.8.0"
debug "^4.3.4"
ts-api-utils "^1.0.1"
-"@typescript-eslint/types@6.5.0":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.5.0.tgz#f4e55cfd99ac5346ea772770bf212a3e689a8f04"
- integrity sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==
+"@typescript-eslint/types@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
+ integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
+
+"@typescript-eslint/types@6.8.0":
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.8.0.tgz#1ab5d4fe1d613e3f65f6684026ade6b94f7e3ded"
+ integrity sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==
-"@typescript-eslint/typescript-estree@6.5.0":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz#1cef6bc822585e9ef89d88834bc902d911d747ed"
- integrity sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==
+"@typescript-eslint/typescript-estree@2.34.0":
+ version "2.34.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5"
+ integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==
dependencies:
- "@typescript-eslint/types" "6.5.0"
- "@typescript-eslint/visitor-keys" "6.5.0"
+ debug "^4.1.1"
+ eslint-visitor-keys "^1.1.0"
+ glob "^7.1.6"
+ is-glob "^4.0.1"
+ lodash "^4.17.15"
+ semver "^7.3.2"
+ tsutils "^3.17.1"
+
+"@typescript-eslint/typescript-estree@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b"
+ integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==
+ dependencies:
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/visitor-keys" "5.62.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/typescript-estree@6.8.0":
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz#9565f15e0cd12f55cf5aa0dfb130a6cb0d436ba1"
+ integrity sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==
+ dependencies:
+ "@typescript-eslint/types" "6.8.0"
+ "@typescript-eslint/visitor-keys" "6.8.0"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
semver "^7.5.4"
ts-api-utils "^1.0.1"
-"@typescript-eslint/utils@6.5.0":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.5.0.tgz#6668bee4f7f24978b11df8a2ea42d56eebc4662c"
- integrity sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==
+"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86"
+ integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@types/json-schema" "^7.0.9"
+ "@types/semver" "^7.3.12"
+ "@typescript-eslint/scope-manager" "5.62.0"
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/typescript-estree" "5.62.0"
+ eslint-scope "^5.1.1"
+ semver "^7.3.7"
+
+"@typescript-eslint/utils@6.8.0":
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.8.0.tgz#d42939c2074c6b59844d0982ce26a51d136c4029"
+ integrity sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@types/json-schema" "^7.0.12"
"@types/semver" "^7.5.0"
- "@typescript-eslint/scope-manager" "6.5.0"
- "@typescript-eslint/types" "6.5.0"
- "@typescript-eslint/typescript-estree" "6.5.0"
+ "@typescript-eslint/scope-manager" "6.8.0"
+ "@typescript-eslint/types" "6.8.0"
+ "@typescript-eslint/typescript-estree" "6.8.0"
semver "^7.5.4"
-"@typescript-eslint/visitor-keys@6.5.0":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz#1a6f474a0170a447b76f0699ce6700110fd11436"
- integrity sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==
+"@typescript-eslint/visitor-keys@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e"
+ integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==
dependencies:
- "@typescript-eslint/types" "6.5.0"
- eslint-visitor-keys "^3.4.1"
-
-"@vitejs/plugin-basic-ssl@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz#48c46eab21e0730921986ce742563ae83fe7fe34"
- integrity sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==
+ "@typescript-eslint/types" "5.62.0"
+ eslint-visitor-keys "^3.3.0"
-"@vitejs/plugin-react-swc@^3.3.2":
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz#34a82c1728066f48a86dfecb2f15df60f89207fb"
- integrity sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==
+"@typescript-eslint/visitor-keys@6.8.0":
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz#cffebed56ae99c45eba901c378a6447b06be58b8"
+ integrity sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==
dependencies:
- "@swc/core" "^1.3.61"
+ "@typescript-eslint/types" "6.8.0"
+ eslint-visitor-keys "^3.4.1"
+
+"@ungap/structured-clone@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
+ integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
"@vkontakte/icons-sprite@2.0.0":
version "2.0.0"
@@ -507,10 +847,10 @@
dependencies:
"@swc/helpers" "^0.5.1"
-"@vkontakte/icons@^2.62.0", "@vkontakte/icons@^2.66.0":
- version "2.66.0"
- resolved "https://registry.yarnpkg.com/@vkontakte/icons/-/icons-2.66.0.tgz#53fa1cacb05d30ac116d6c0a22a313a4722e5613"
- integrity sha512-p9hY1JKtVfdkRebpo0Y8kEipcUXbRMkdDHnKgHhapwro8iCRmYpZjfVZ0u2+FE15GUZN4YNZHG7owuzV7KkQNg==
+"@vkontakte/icons@^2.62.0", "@vkontakte/icons@^2.72.0":
+ version "2.72.0"
+ resolved "https://registry.yarnpkg.com/@vkontakte/icons/-/icons-2.72.0.tgz#2af0c747ba68dbe9f0a983f7467d022ae78decf5"
+ integrity sha512-jN4nVjZmpoLgq8OPvuTEtT5SBAzMDZcavVleSme72NeQnzm6tA/do3+I02ddTaKv4J4Y90AWr2epa+tstihHkg==
dependencies:
"@vkontakte/icons-sprite" "2.0.0"
@@ -554,16 +894,24 @@
dependencies:
"@swc/helpers" "^0.5.0"
-"@vkontakte/vkui@^5.8.1":
- version "5.8.1"
- resolved "https://registry.yarnpkg.com/@vkontakte/vkui/-/vkui-5.8.1.tgz#d4789c6f7514b44e6d6a5a6cf29f91ce224f9ed9"
- integrity sha512-YVqyX7Y+6JaFNU6ebI2Bk4UVYfBx6crPJMizvoIa3lOB/oxiIYqmQ7ktzCzbCFmMXnjL+j0bUfY1fAHo5mBYBQ==
+"@vkontakte/vkui-floating-ui@^0.1.0":
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/@vkontakte/vkui-floating-ui/-/vkui-floating-ui-0.1.0.tgz#d355f1e47fa617349e14030797cbbf4f8775ecc1"
+ integrity sha512-wG9PAXXBDtTmkvLCUL3qJ4lHo2fsOFRHSJcNe6Pknb1cYbOro2rLtKQPL7nf3to8Fb6TSSmFE1DpgIOzc1laTw==
dependencies:
"@floating-ui/react-dom" "^2.0.2"
- "@swc/helpers" "^0.5.1"
+ "@swc/helpers" "^0.5.3"
+
+"@vkontakte/vkui@^5.9.4":
+ version "5.9.4"
+ resolved "https://registry.yarnpkg.com/@vkontakte/vkui/-/vkui-5.9.4.tgz#c716847875d222a05f30601bddaa8354572cab8f"
+ integrity sha512-RonJKm1n2Ozk5wRrOED8kVybuup9vyfgaTYk1YpwALVsRlrgHYE6FoW13NP6D9hcpWhafCCBMjfx4M7L2+cWvw==
+ dependencies:
+ "@swc/helpers" "^0.5.2"
"@vkontakte/icons" "^2.62.0"
"@vkontakte/vkjs" "^1.1.0"
- dayjs "^1.11.9"
+ "@vkontakte/vkui-floating-ui" "^0.1.0"
+ dayjs "^1.11.10"
mitt "^3.0.1"
acorn-jsx@^5.3.2:
@@ -591,6 +939,13 @@ ansi-regex@^5.0.1:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
@@ -647,15 +1002,15 @@ array-buffer-byte-length@^1.0.0:
call-bind "^1.0.2"
is-array-buffer "^3.0.1"
-array-includes@^3.1.6:
- version "3.1.6"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f"
- integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==
+array-includes@^3.1.6, array-includes@^3.1.7:
+ version "3.1.7"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda"
+ integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
- get-intrinsic "^1.1.3"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ get-intrinsic "^1.2.1"
is-string "^1.0.7"
array-union@^2.1.0:
@@ -663,7 +1018,7 @@ array-union@^2.1.0:
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-array.prototype.findlastindex@^1.2.2:
+array.prototype.findlastindex@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207"
integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==
@@ -674,49 +1029,64 @@ array.prototype.findlastindex@^1.2.2:
es-shim-unscopables "^1.0.0"
get-intrinsic "^1.2.1"
-array.prototype.flat@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2"
- integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==
+array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18"
+ integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
-array.prototype.flatmap@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183"
- integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==
+array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527"
+ integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
array.prototype.tosorted@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532"
- integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd"
+ integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
- get-intrinsic "^1.1.3"
+ get-intrinsic "^1.2.1"
-arraybuffer.prototype.slice@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb"
- integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==
+arraybuffer.prototype.slice@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12"
+ integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==
dependencies:
array-buffer-byte-length "^1.0.0"
call-bind "^1.0.2"
define-properties "^1.2.0"
+ es-abstract "^1.22.1"
get-intrinsic "^1.2.1"
is-array-buffer "^3.0.2"
is-shared-array-buffer "^1.0.2"
+ast-metadata-inferer@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.7.0.tgz#c45d874cbdecabea26dc5de11fc6fa1919807c66"
+ integrity sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q==
+ dependencies:
+ "@mdn/browser-compat-data" "^3.3.14"
+
+ast-metadata-inferer@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz#0f94c3425e310d8da45823ab2161142e3f134343"
+ integrity sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==
+ dependencies:
+ "@mdn/browser-compat-data" "^5.2.34"
+
ast-types-flow@^0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
@@ -752,9 +1122,9 @@ available-typed-arrays@^1.0.5:
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
axe-core@^4.6.2:
- version "4.7.2"
- resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0"
- integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==
+ version "4.8.2"
+ resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae"
+ integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==
axobject-query@^3.1.1:
version "3.2.1"
@@ -763,6 +1133,23 @@ axobject-query@^3.1.1:
dependencies:
dequal "^2.0.3"
+babel-eslint@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+ integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/parser" "^7.7.0"
+ "@babel/traverse" "^7.7.0"
+ "@babel/types" "^7.7.0"
+ eslint-visitor-keys "^1.0.0"
+ resolve "^1.12.0"
+
+babel-plugin-transform-hook-names@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz#0d75c2d78e8bbcdb258241131562b9cf07f010f3"
+ integrity sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==
+
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -773,6 +1160,11 @@ base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+big-integer@^1.6.44:
+ version "1.6.51"
+ resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
+ integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
+
bl@^4.0.3:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
@@ -782,6 +1174,13 @@ bl@^4.0.3:
inherits "^2.0.4"
readable-stream "^3.4.0"
+bplist-parser@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e"
+ integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==
+ dependencies:
+ big-integer "^1.6.44"
+
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -797,6 +1196,16 @@ braces@^3.0.2:
dependencies:
fill-range "^7.0.1"
+browserslist@^4.16.8, browserslist@^4.21.10, browserslist@^4.21.9:
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619"
+ integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==
+ dependencies:
+ caniuse-lite "^1.0.30001541"
+ electron-to-chromium "^1.4.535"
+ node-releases "^2.0.13"
+ update-browserslist-db "^1.0.13"
+
buffer-crc32@^0.2.1, buffer-crc32@^0.2.13:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
@@ -822,19 +1231,41 @@ builtins@^5.0.1:
dependencies:
semver "^7.0.0"
-call-bind@^1.0.0, call-bind@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
- integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+bundle-name@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a"
+ integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==
dependencies:
- function-bind "^1.1.1"
- get-intrinsic "^1.0.2"
+ run-applescript "^5.0.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
+ integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==
+ dependencies:
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.1"
+ set-function-length "^1.1.1"
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+caniuse-lite@^1.0.30001251, caniuse-lite@^1.0.30001524, caniuse-lite@^1.0.30001541:
+ version "1.0.30001553"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz#e64e7dc8fd4885cd246bb476471420beb5e474b5"
+ integrity sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
chalk@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
@@ -851,6 +1282,13 @@ chalk@^4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
@@ -858,6 +1296,11 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
@@ -907,6 +1350,16 @@ confusing-browser-globals@^1.0.10:
resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81"
integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+core-js@^3.16.2:
+ version "3.33.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.1.tgz#ef3766cfa382482d0a2c2bc5cb52c6d88805da52"
+ integrity sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==
+
core-util-is@~1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
@@ -927,7 +1380,7 @@ crc@^3.4.4:
dependencies:
buffer "^5.1.0"
-cross-spawn@^7.0.2:
+cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -951,10 +1404,10 @@ damerau-levenshtein@^1.0.8:
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==
-dayjs@^1.11.9:
- version "1.11.9"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a"
- integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==
+dayjs@^1.11.10:
+ version "1.11.10"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0"
+ integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==
debug@^3.2.7:
version "3.2.7"
@@ -963,7 +1416,7 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
-debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@@ -975,11 +1428,44 @@ deep-is@^0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
-define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5"
- integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==
+default-browser-id@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c"
+ integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==
+ dependencies:
+ bplist-parser "^0.2.0"
+ untildify "^4.0.0"
+
+default-browser@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da"
+ integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==
dependencies:
+ bundle-name "^3.0.0"
+ default-browser-id "^3.0.0"
+ execa "^7.1.1"
+ titleize "^3.0.0"
+
+define-data-property@^1.0.1, define-data-property@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3"
+ integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==
+ dependencies:
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+define-lazy-prop@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
+ integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
+
+define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
@@ -993,7 +1479,7 @@ dequal@^2.0.3:
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
-diary-shared@1.8.0:
+diary-shared@^1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/diary-shared/-/diary-shared-1.8.0.tgz#a7bf08d4e92c1fd968c335a6295f6b5b77acaba6"
integrity sha512-YI0bmOeO7wuDQX0BxaNkksoTwElCq06tHWmf6/NX43j6GTnPpTfem63okJLIh99k1Vrw01UVqR7Lv0dRDzhuhg==
@@ -1026,6 +1512,11 @@ dot-prop@^5.2.0:
dependencies:
is-obj "^2.0.0"
+electron-to-chromium@^1.4.535:
+ version "1.4.563"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz#dabb424202754c1fed2d2938ff564b23d3bbf0d3"
+ integrity sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==
+
emoji-regex@^9.2.2:
version "9.2.2"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
@@ -1038,26 +1529,26 @@ end-of-stream@^1.4.1:
dependencies:
once "^1.4.0"
-es-abstract@^1.20.4, es-abstract@^1.22.1:
- version "1.22.1"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc"
- integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==
+es-abstract@^1.22.1:
+ version "1.22.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32"
+ integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==
dependencies:
array-buffer-byte-length "^1.0.0"
- arraybuffer.prototype.slice "^1.0.1"
+ arraybuffer.prototype.slice "^1.0.2"
available-typed-arrays "^1.0.5"
- call-bind "^1.0.2"
+ call-bind "^1.0.5"
es-set-tostringtag "^2.0.1"
es-to-primitive "^1.2.1"
- function.prototype.name "^1.1.5"
- get-intrinsic "^1.2.1"
+ function.prototype.name "^1.1.6"
+ get-intrinsic "^1.2.2"
get-symbol-description "^1.0.0"
globalthis "^1.0.3"
gopd "^1.0.1"
- has "^1.0.3"
has-property-descriptors "^1.0.0"
has-proto "^1.0.1"
has-symbols "^1.0.3"
+ hasown "^2.0.0"
internal-slot "^1.0.5"
is-array-buffer "^3.0.2"
is-callable "^1.2.7"
@@ -1065,32 +1556,32 @@ es-abstract@^1.20.4, es-abstract@^1.22.1:
is-regex "^1.1.4"
is-shared-array-buffer "^1.0.2"
is-string "^1.0.7"
- is-typed-array "^1.1.10"
+ is-typed-array "^1.1.12"
is-weakref "^1.0.2"
- object-inspect "^1.12.3"
+ object-inspect "^1.13.1"
object-keys "^1.1.1"
object.assign "^4.1.4"
- regexp.prototype.flags "^1.5.0"
- safe-array-concat "^1.0.0"
+ regexp.prototype.flags "^1.5.1"
+ safe-array-concat "^1.0.1"
safe-regex-test "^1.0.0"
- string.prototype.trim "^1.2.7"
- string.prototype.trimend "^1.0.6"
- string.prototype.trimstart "^1.0.6"
+ string.prototype.trim "^1.2.8"
+ string.prototype.trimend "^1.0.7"
+ string.prototype.trimstart "^1.0.7"
typed-array-buffer "^1.0.0"
typed-array-byte-length "^1.0.0"
typed-array-byte-offset "^1.0.0"
typed-array-length "^1.0.4"
unbox-primitive "^1.0.2"
- which-typed-array "^1.1.10"
+ which-typed-array "^1.1.13"
es-iterator-helpers@^1.0.12:
- version "1.0.14"
- resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz#19cd7903697d97e21198f3293b55e8985791c365"
- integrity sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==
+ version "1.0.15"
+ resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40"
+ integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==
dependencies:
asynciterator.prototype "^1.0.0"
call-bind "^1.0.2"
- define-properties "^1.2.0"
+ define-properties "^1.2.1"
es-abstract "^1.22.1"
es-set-tostringtag "^2.0.1"
function-bind "^1.1.1"
@@ -1100,24 +1591,24 @@ es-iterator-helpers@^1.0.12:
has-proto "^1.0.1"
has-symbols "^1.0.3"
internal-slot "^1.0.5"
- iterator.prototype "^1.1.0"
- safe-array-concat "^1.0.0"
+ iterator.prototype "^1.1.2"
+ safe-array-concat "^1.0.1"
es-set-tostringtag@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
- integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9"
+ integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==
dependencies:
- get-intrinsic "^1.1.3"
- has "^1.0.3"
+ get-intrinsic "^1.2.2"
has-tostringtag "^1.0.0"
+ hasown "^2.0.0"
es-shim-unscopables@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
- integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
+ integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
dependencies:
- has "^1.0.3"
+ hasown "^2.0.0"
es-to-primitive@^1.2.1:
version "1.2.1"
@@ -1156,6 +1647,16 @@ esbuild@^0.18.10:
"@esbuild/win32-ia32" "0.18.20"
"@esbuild/win32-x64" "0.18.20"
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
@@ -1187,6 +1688,37 @@ eslint-config-airbnb@^19.0.4:
object.assign "^4.1.2"
object.entries "^1.1.5"
+eslint-config-developit@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-developit/-/eslint-config-developit-1.2.0.tgz#798e28cf132f218bd15c3c5b295ddf59e5b2034d"
+ integrity sha512-uUXirRR5R06sqsPgOk8XlA65HRxXNSlg5vPmyLvFwksCibZZLI/RxszuAn6R2EZ6tJUIJupLrVw8fkDYX3TVsQ==
+ dependencies:
+ babel-eslint "^10.1.0"
+ eslint-plugin-compat "^3.5.1"
+ eslint-plugin-jest "^23.8.2"
+ eslint-plugin-mocha "^6.3.0"
+ eslint-plugin-react "^7.0.0"
+
+eslint-config-preact@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-preact/-/eslint-config-preact-1.3.0.tgz#17b72813078f4d1d4d2b79938ec21f92338bc9c0"
+ integrity sha512-yHYXg5qNzEJd3D/30AmsIW0W8MuY858KpApXp7xxBF08IYUljSKCOqMx+dVucXHQnAm7+11wOnMkgVHIBAechw==
+ dependencies:
+ "@babel/core" "^7.13.16"
+ "@babel/eslint-parser" "^7.13.14"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-decorators" "^7.12.13"
+ "@babel/plugin-syntax-jsx" "^7.12.13"
+ eslint-plugin-compat "^4.0.0"
+ eslint-plugin-jest "^25.2.4"
+ eslint-plugin-react "^7.27.0"
+ eslint-plugin-react-hooks "^4.3.0"
+
+eslint-config-prettier@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f"
+ integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==
+
eslint-config-standard-with-typescript@^38.0.0:
version "38.1.0"
resolved "https://registry.yarnpkg.com/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-38.1.0.tgz#26e981539db7fcd4728caf88694ffc9e24a3e0cc"
@@ -1200,7 +1732,7 @@ eslint-config-standard@17.1.0:
resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975"
integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==
-eslint-import-resolver-node@^0.3.7:
+eslint-import-resolver-node@^0.3.9:
version "0.3.9"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac"
integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
@@ -1216,6 +1748,33 @@ eslint-module-utils@^2.8.0:
dependencies:
debug "^3.2.7"
+eslint-plugin-compat@^3.5.1:
+ version "3.13.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-3.13.0.tgz#fade6f2ad25263cf93f8d23c988533551ced8663"
+ integrity sha512-cv8IYMuTXm7PIjMVDN2y4k/KVnKZmoNGHNq27/9dLstOLydKblieIv+oe2BN2WthuXnFNhaNvv3N1Bvl4dbIGA==
+ dependencies:
+ "@mdn/browser-compat-data" "^3.3.14"
+ ast-metadata-inferer "^0.7.0"
+ browserslist "^4.16.8"
+ caniuse-lite "^1.0.30001251"
+ core-js "^3.16.2"
+ find-up "^5.0.0"
+ lodash.memoize "4.1.2"
+ semver "7.3.5"
+
+eslint-plugin-compat@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz#eeaf80daa1afe495c88a47e9281295acae45c0aa"
+ integrity sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==
+ dependencies:
+ "@mdn/browser-compat-data" "^5.3.13"
+ ast-metadata-inferer "^0.8.0"
+ browserslist "^4.21.10"
+ caniuse-lite "^1.0.30001524"
+ find-up "^5.0.0"
+ lodash.memoize "^4.1.2"
+ semver "^7.5.4"
+
eslint-plugin-es-x@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.2.0.tgz#5779d742ad31f8fd780b9481331481e142b72311"
@@ -1225,28 +1784,49 @@ eslint-plugin-es-x@^7.1.0:
"@eslint-community/regexpp" "^4.6.0"
eslint-plugin-import@^2.25.2:
- version "2.28.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4"
- integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==
- dependencies:
- array-includes "^3.1.6"
- array.prototype.findlastindex "^1.2.2"
- array.prototype.flat "^1.3.1"
- array.prototype.flatmap "^1.3.1"
+ version "2.29.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155"
+ integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==
+ dependencies:
+ array-includes "^3.1.7"
+ array.prototype.findlastindex "^1.2.3"
+ array.prototype.flat "^1.3.2"
+ array.prototype.flatmap "^1.3.2"
debug "^3.2.7"
doctrine "^2.1.0"
- eslint-import-resolver-node "^0.3.7"
+ eslint-import-resolver-node "^0.3.9"
eslint-module-utils "^2.8.0"
- has "^1.0.3"
- is-core-module "^2.13.0"
+ hasown "^2.0.0"
+ is-core-module "^2.13.1"
is-glob "^4.0.3"
minimatch "^3.1.2"
- object.fromentries "^2.0.6"
- object.groupby "^1.0.0"
- object.values "^1.1.6"
+ object.fromentries "^2.0.7"
+ object.groupby "^1.0.1"
+ object.values "^1.1.7"
semver "^6.3.1"
tsconfig-paths "^3.14.2"
+eslint-plugin-jest@^23.8.2:
+ version "23.20.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.20.0.tgz#e1d69c75f639e99d836642453c4e75ed22da4099"
+ integrity sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw==
+ dependencies:
+ "@typescript-eslint/experimental-utils" "^2.5.0"
+
+eslint-plugin-jest@^25.2.4:
+ version "25.7.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a"
+ integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==
+ dependencies:
+ "@typescript-eslint/experimental-utils" "^5.0.0"
+
+eslint-plugin-jest@^27.4.3:
+ version "27.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.4.3.tgz#7b2330a9e1819b66d06e66b45dfa8e8ef0c23f79"
+ integrity sha512-7S6SmmsHsgIm06BAGCAxL+ABd9/IB3MWkz2pudj6Qqor2y1qQpWPfuFU4SG9pWj4xDjF0e+D7Llh5useuSzAZw==
+ dependencies:
+ "@typescript-eslint/utils" "^5.10.0"
+
eslint-plugin-jsx-a11y@^6.5.1:
version "6.7.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976"
@@ -1269,26 +1849,50 @@ eslint-plugin-jsx-a11y@^6.5.1:
object.fromentries "^2.0.6"
semver "^6.3.0"
+eslint-plugin-mocha@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz#72bfd06a5c4323e17e30ef41cd726030e8cdb8fd"
+ integrity sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==
+ dependencies:
+ eslint-utils "^2.0.0"
+ ramda "^0.27.0"
+
eslint-plugin-n@^16.0.2:
- version "16.0.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz#5b2c0ad8dd9b724244d30fad2cc49ff4308a2152"
- integrity sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-16.2.0.tgz#3f98ca9fadd9f7bdaaf60068533118ecb685bfb5"
+ integrity sha512-AQER2jEyQOt1LG6JkGJCCIFotzmlcCZFur2wdKrp1JX2cNotC7Ae0BcD/4lLv3lUAArM9uNS8z/fsvXTd0L71g==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
builtins "^5.0.1"
eslint-plugin-es-x "^7.1.0"
+ get-tsconfig "^4.7.0"
ignore "^5.2.4"
is-core-module "^2.12.1"
minimatch "^3.1.2"
resolve "^1.22.2"
semver "^7.5.3"
+eslint-plugin-preact@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-preact/-/eslint-plugin-preact-0.1.0.tgz#f0eb44cc32a246fb8dd06c5c24df8f91f10236e8"
+ integrity sha512-/ZNTjrTLhDOkZmW8cY6W91lfrGEhyF5i0KFRhjlvCAPcWENxeXlx1TKbKgzjyvGtei8c2WlvWCgxO5PdyXe0EA==
+ dependencies:
+ eslint-config-developit "^1.1.1"
+
+eslint-plugin-prettier@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz#a3b399f04378f79f066379f544e42d6b73f11515"
+ integrity sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==
+ dependencies:
+ prettier-linter-helpers "^1.0.0"
+ synckit "^0.8.5"
+
eslint-plugin-promise@^6.0.0:
version "6.1.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816"
integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==
-eslint-plugin-react-hooks@^4.6.0:
+eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
@@ -1298,7 +1902,7 @@ eslint-plugin-react-refresh@^0.4.3:
resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz#59dae8c00a119f06ea16b1d3e6891df3775947c7"
integrity sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==
-eslint-plugin-react@^7.32.2:
+eslint-plugin-react@^7.0.0, eslint-plugin-react@^7.27.0, eslint-plugin-react@^7.32.2:
version "7.33.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608"
integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==
@@ -1320,6 +1924,14 @@ eslint-plugin-react@^7.32.2:
semver "^6.3.1"
string.prototype.matchall "^4.0.8"
+eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
eslint-scope@^7.2.2:
version "7.2.2"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
@@ -1328,23 +1940,41 @@ eslint-scope@^7.2.2:
esrecurse "^4.3.0"
estraverse "^5.2.0"
+eslint-utils@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+ integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+ integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint-visitor-keys@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
version "3.4.3"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
-eslint@^8.45.0:
- version "8.48.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155"
- integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==
+eslint@^8.52.0:
+ version "8.52.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc"
+ integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.6.1"
"@eslint/eslintrc" "^2.1.2"
- "@eslint/js" "8.48.0"
- "@humanwhocodes/config-array" "^0.11.10"
+ "@eslint/js" "8.52.0"
+ "@humanwhocodes/config-array" "^0.11.13"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
+ "@ungap/structured-clone" "^1.2.0"
ajv "^6.12.4"
chalk "^4.0.0"
cross-spawn "^7.0.2"
@@ -1399,22 +2029,67 @@ esrecurse@^4.3.0:
dependencies:
estraverse "^5.2.0"
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+estree-walker@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
esutils@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+execa@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9"
+ integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.1"
+ human-signals "^4.3.0"
+ is-stream "^3.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^5.1.0"
+ onetime "^6.0.0"
+ signal-exit "^3.0.7"
+ strip-final-newline "^3.0.0"
+
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.2.9:
+fast-diff@^1.1.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
+ integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
+
+fast-glob@^3.2.9, fast-glob@^3.3.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
@@ -1465,18 +2140,18 @@ find-up@^5.0.0:
path-exists "^4.0.0"
flat-cache@^3.0.4:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f"
- integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b"
+ integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==
dependencies:
- flatted "^3.2.7"
+ flatted "^3.2.9"
keyv "^4.5.3"
rimraf "^3.0.2"
-flatted@^3.2.7:
- version "3.2.7"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
- integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
+flatted@^3.2.9:
+ version "3.2.9"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf"
+ integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==
for-each@^0.3.3:
version "0.3.3"
@@ -1518,12 +2193,12 @@ fsevents@~2.3.2:
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-function-bind@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
- integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+function-bind@^1.1.1, function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
-function.prototype.name@^1.1.5:
+function.prototype.name@^1.1.5, function.prototype.name@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
@@ -1538,15 +2213,25 @@ functions-have-names@^1.2.3:
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
-get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82"
- integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==
+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"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b"
+ integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==
dependencies:
- function-bind "^1.1.1"
- has "^1.0.3"
+ function-bind "^1.1.2"
has-proto "^1.0.1"
has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-stream@^6.0.0, get-stream@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
get-symbol-description@^1.0.0:
version "1.0.0"
@@ -1556,6 +2241,13 @@ get-symbol-description@^1.0.0:
call-bind "^1.0.2"
get-intrinsic "^1.1.1"
+get-tsconfig@^4.7.0:
+ version "4.7.2"
+ resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce"
+ integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==
+ dependencies:
+ resolve-pkg-maps "^1.0.0"
+
glob-parent@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -1582,10 +2274,15 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
globals@^13.19.0:
- version "13.21.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571"
- integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==
+ version "13.23.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02"
+ integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==
dependencies:
type-fest "^0.20.2"
@@ -1630,17 +2327,22 @@ has-bigints@^1.0.1, has-bigints@^1.0.2:
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
has-property-descriptors@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
- integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340"
+ integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==
dependencies:
- get-intrinsic "^1.1.1"
+ get-intrinsic "^1.2.2"
has-proto@^1.0.1:
version "1.0.1"
@@ -1660,11 +2362,33 @@ has-tostringtag@^1.0.0:
has-symbols "^1.0.2"
has@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
- integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6"
+ integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==
+
+hasown@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
+ integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
dependencies:
- function-bind "^1.1.1"
+ function-bind "^1.1.2"
+
+hoist-non-react-statics@^3.3.0, 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==
+ dependencies:
+ react-is "^16.7.0"
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+human-signals@^4.3.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
+ integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
ieee754@^1.1.13:
version "1.2.1"
@@ -1676,6 +2400,11 @@ ignore@^5.2.0, ignore@^5.2.4:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
+immer@^9.0.21:
+ version "9.0.21"
+ resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176"
+ integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
+
import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -1703,12 +2432,12 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
internal-slot@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
- integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930"
+ integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==
dependencies:
- get-intrinsic "^1.2.0"
- has "^1.0.3"
+ get-intrinsic "^1.2.2"
+ hasown "^2.0.0"
side-channel "^1.0.4"
is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
@@ -1747,12 +2476,12 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.9.0:
- version "2.13.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db"
- integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==
+is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.13.1:
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
+ integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
dependencies:
- has "^1.0.3"
+ hasown "^2.0.0"
is-date-object@^1.0.1, is-date-object@^1.0.5:
version "1.0.5"
@@ -1761,6 +2490,16 @@ is-date-object@^1.0.1, is-date-object@^1.0.5:
dependencies:
has-tostringtag "^1.0.0"
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-docker@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
+ integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -1787,6 +2526,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
dependencies:
is-extglob "^2.1.1"
+is-inside-container@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
+ integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
+ dependencies:
+ is-docker "^3.0.0"
+
is-map@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
@@ -1839,6 +2585,16 @@ is-shared-array-buffer@^1.0.2:
dependencies:
call-bind "^1.0.2"
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
+ integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+
is-string@^1.0.5, is-string@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
@@ -1853,7 +2609,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
dependencies:
has-symbols "^1.0.2"
-is-typed-array@^1.1.10, is-typed-array@^1.1.9:
+is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9:
version "1.1.12"
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a"
integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
@@ -1885,6 +2641,13 @@ is-weakset@^2.0.1:
call-bind "^1.0.2"
get-intrinsic "^1.1.1"
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
isarray@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
@@ -1900,17 +2663,18 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
-iterator.prototype@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.1.tgz#ab5b790e23ec00658f5974e032a2b05188bd3a5c"
- integrity sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==
+iterator.prototype@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0"
+ integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
dependencies:
- define-properties "^1.2.0"
+ define-properties "^1.2.1"
get-intrinsic "^1.2.1"
has-symbols "^1.0.3"
- reflect.getprototypeof "^1.0.3"
+ reflect.getprototypeof "^1.0.4"
+ set-function-name "^2.0.1"
-"js-tokens@^3.0.0 || ^4.0.0":
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
@@ -1922,6 +2686,11 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
jshashes@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/jshashes/-/jshashes-1.0.8.tgz#f60d837428383abf73ab022e1542e6614bd75514"
@@ -1949,6 +2718,11 @@ json5@^1.0.2:
dependencies:
minimist "^1.2.0"
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
@@ -1967,9 +2741,9 @@ jsonfile@^4.0.0:
object.values "^1.1.6"
keyv@^4.5.3:
- version "4.5.3"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25"
- integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
dependencies:
json-buffer "3.0.1"
@@ -1978,6 +2752,11 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+kolorist@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c"
+ integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==
+
language-subtag-registry@~0.3.2:
version "0.3.22"
resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d"
@@ -2032,6 +2811,11 @@ lodash.isplainobject@^4.0.6:
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
+lodash.memoize@4.1.2, lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
+
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
@@ -2042,18 +2826,25 @@ lodash.union@^4.6.0:
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
-lodash@^4.17.14:
+lodash@^4.17.14, lodash@^4.17.15:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-loose-envify@^1.1.0, loose-envify@^1.4.0:
+loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -2068,6 +2859,11 @@ make-dir@^3.0.0:
dependencies:
semver "^6.0.0"
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
@@ -2093,6 +2889,16 @@ mime-types@^2.1.12:
dependencies:
mime-db "1.52.0"
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-fn@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
+ integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
+
minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@@ -2137,20 +2943,39 @@ node-fetch@^2.6.0:
dependencies:
whatwg-url "^5.0.0"
+node-releases@^2.0.13:
+ version "2.0.13"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
+ integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
+
normalize-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+npm-run-path@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
+ integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
+ dependencies:
+ path-key "^4.0.0"
+
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
-object-inspect@^1.12.3, object-inspect@^1.9.0:
- version "1.12.3"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
- integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+object-inspect@^1.13.1, object-inspect@^1.9.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
+ integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
object-keys@^1.1.1:
version "1.1.1"
@@ -2176,7 +3001,7 @@ object.entries@^1.1.5, object.entries@^1.1.6:
define-properties "^1.2.0"
es-abstract "^1.22.1"
-object.fromentries@^2.0.6:
+object.fromentries@^2.0.6, object.fromentries@^2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616"
integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==
@@ -2185,7 +3010,7 @@ object.fromentries@^2.0.6:
define-properties "^1.2.0"
es-abstract "^1.22.1"
-object.groupby@^1.0.0:
+object.groupby@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee"
integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==
@@ -2203,7 +3028,7 @@ object.hasown@^1.1.2:
define-properties "^1.2.0"
es-abstract "^1.22.1"
-object.values@^1.1.6:
+object.values@^1.1.6, object.values@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a"
integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==
@@ -2219,6 +3044,30 @@ once@^1.3.0, once@^1.4.0:
dependencies:
wrappy "1"
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+onetime@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
+ integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
+ dependencies:
+ mimic-fn "^4.0.0"
+
+open@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6"
+ integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==
+ dependencies:
+ default-browser "^4.0.0"
+ define-lazy-prop "^3.0.0"
+ is-inside-container "^1.0.0"
+ is-wsl "^2.2.0"
+
optionator@^0.9.3:
version "0.9.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
@@ -2262,11 +3111,16 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
-path-key@^3.1.0:
+path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+path-key@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
+ integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
+
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
@@ -2282,7 +3136,7 @@ picocolors@^1.0.0:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
-picomatch@^2.3.1:
+picomatch@^2.2.2, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@@ -2296,11 +3150,28 @@ postcss@^8.4.27:
picocolors "^1.0.0"
source-map-js "^1.0.2"
+preact@^10.16.0:
+ version "10.18.1"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.18.1.tgz#3b84bb305f0b05f4ad5784b981d15fcec4e105da"
+ integrity sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+prettier-linter-helpers@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
+ integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+ dependencies:
+ fast-diff "^1.1.2"
+
+prettier@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643"
+ integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==
+
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
@@ -2333,6 +3204,11 @@ queue-microtask@^1.2.2:
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+ramda@^0.27.0:
+ version "0.27.2"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1"
+ integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==
+
randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -2340,25 +3216,27 @@ randombytes@^2.1.0:
dependencies:
safe-buffer "^5.1.0"
-react-dom@^18.2.0:
- version "18.2.0"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
- integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
- dependencies:
- loose-envify "^1.1.0"
- scheduler "^0.23.0"
-
-react-is@^16.13.1:
+react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
-react@^18.2.0:
+react-is@^18.0.0:
version "18.2.0"
- resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
- integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
+ integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
+
+react-redux@^8.1.3:
+ version "8.1.3"
+ resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.3.tgz#4fdc0462d0acb59af29a13c27ffef6f49ab4df46"
+ integrity sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==
dependencies:
- loose-envify "^1.1.0"
+ "@babel/runtime" "^7.12.1"
+ "@types/hoist-non-react-statics" "^3.3.1"
+ "@types/use-sync-external-store" "^0.0.3"
+ hoist-non-react-statics "^3.3.2"
+ react-is "^18.0.0"
+ use-sync-external-store "^1.0.0"
readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.3.6:
version "2.3.8"
@@ -2382,7 +3260,19 @@ readable-stream@^3.1.1, readable-stream@^3.4.0:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
-reflect.getprototypeof@^1.0.3:
+redux-thunk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b"
+ integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==
+
+redux@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197"
+ integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==
+ dependencies:
+ "@babel/runtime" "^7.9.2"
+
+reflect.getprototypeof@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3"
integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==
@@ -2399,14 +3289,14 @@ regenerator-runtime@^0.14.0:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
-regexp.prototype.flags@^1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb"
- integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==
+regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e"
+ integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
dependencies:
call-bind "^1.0.2"
define-properties "^1.2.0"
- functions-have-names "^1.2.3"
+ set-function-name "^2.0.0"
require-module@^0.1.0:
version "0.1.0"
@@ -2415,26 +3305,36 @@ require-module@^0.1.0:
dependencies:
resolve "~0.6.1"
+reselect@^4.1.8:
+ version "4.1.8"
+ resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524"
+ integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==
+
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-resolve@^1.22.2, resolve@^1.22.4:
- version "1.22.4"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34"
- integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==
+resolve-pkg-maps@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f"
+ integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
+
+resolve@^1.12.0, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
dependencies:
is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
resolve@^2.0.0-next.4:
- version "2.0.0-next.4"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660"
- integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==
+ version "2.0.0-next.5"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
+ integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
dependencies:
- is-core-module "^2.9.0"
+ is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -2456,12 +3356,19 @@ rimraf@^3.0.2:
glob "^7.1.3"
rollup@^3.27.1:
- version "3.28.1"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.28.1.tgz#fb44aa6d5e65c7e13fd5bcfff266d0c4ea9ba433"
- integrity sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==
+ version "3.29.4"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981"
+ integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==
optionalDependencies:
fsevents "~2.3.2"
+run-applescript@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c"
+ integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==
+ dependencies:
+ execa "^5.0.0"
+
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
@@ -2469,13 +3376,13 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
-safe-array-concat@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060"
- integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==
+safe-array-concat@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c"
+ integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==
dependencies:
call-bind "^1.0.2"
- get-intrinsic "^1.2.0"
+ get-intrinsic "^1.2.1"
has-symbols "^1.0.3"
isarray "^2.0.5"
@@ -2498,19 +3405,19 @@ safe-regex-test@^1.0.0:
get-intrinsic "^1.1.3"
is-regex "^1.1.4"
-scheduler@^0.23.0:
- version "0.23.0"
- resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
- integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
+semver@7.3.5:
+ version "7.3.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+ integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
dependencies:
- loose-envify "^1.1.0"
+ lru-cache "^6.0.0"
semver@^6.0.0, semver@^6.3.0, semver@^6.3.1:
version "6.3.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.0.0, semver@^7.5.3, semver@^7.5.4:
+semver@^7.0.0, semver@^7.3.2, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4:
version "7.5.4"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
@@ -2524,6 +3431,25 @@ serialize-javascript@^6.0.1:
dependencies:
randombytes "^2.1.0"
+set-function-length@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
+ integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==
+ dependencies:
+ define-data-property "^1.1.1"
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+set-function-name@^2.0.0, set-function-name@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
+ integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
+ dependencies:
+ define-data-property "^1.0.1"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.0"
+
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -2545,7 +3471,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.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
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==
@@ -2561,9 +3487,9 @@ slash@^3.0.0:
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
smob@^1.0.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/smob/-/smob-1.4.0.tgz#ac9751fe54b1fc1fc8286a628d4e7f824273b95a"
- integrity sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/smob/-/smob-1.4.1.tgz#66270e7df6a7527664816c5b577a23f17ba6f5b5"
+ integrity sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ==
source-map-js@^1.0.2:
version "1.0.2"
@@ -2584,9 +3510,9 @@ source-map@^0.6.0:
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
string.prototype.matchall@^4.0.8:
- version "4.0.9"
- resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d"
- integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==
+ version "4.0.10"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100"
+ integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==
dependencies:
call-bind "^1.0.2"
define-properties "^1.2.0"
@@ -2595,34 +3521,35 @@ string.prototype.matchall@^4.0.8:
has-symbols "^1.0.3"
internal-slot "^1.0.5"
regexp.prototype.flags "^1.5.0"
+ set-function-name "^2.0.0"
side-channel "^1.0.4"
-string.prototype.trim@^1.2.7:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533"
- integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==
+string.prototype.trim@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd"
+ integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
-string.prototype.trimend@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
- integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==
+string.prototype.trimend@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e"
+ integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
-string.prototype.trimstart@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4"
- integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==
+string.prototype.trimstart@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298"
+ integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
string_decoder@^1.1.1:
version "1.3.0"
@@ -2650,11 +3577,28 @@ strip-bom@^3.0.0:
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-final-newline@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
+ integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
+
strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
@@ -2667,6 +3611,14 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+synckit@^0.8.5:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3"
+ integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==
+ dependencies:
+ "@pkgr/utils" "^2.3.1"
+ tslib "^2.5.0"
+
tar-stream@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
@@ -2679,9 +3631,9 @@ tar-stream@^2.1.0:
readable-stream "^3.1.1"
terser@^5.17.4:
- version "5.19.3"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e"
- integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==
+ version "5.22.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.22.0.tgz#4f18103f84c5c9437aafb7a14918273310a8a49d"
+ integrity sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"
@@ -2693,6 +3645,16 @@ text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+titleize@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53"
+ integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -2706,9 +3668,9 @@ tr46@~0.0.3:
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
ts-api-utils@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.2.tgz#7c094f753b6705ee4faee25c3c684ade52d66d99"
- integrity sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331"
+ integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==
tsconfig-paths@^3.14.2:
version "3.14.2"
@@ -2720,11 +3682,23 @@ tsconfig-paths@^3.14.2:
minimist "^1.2.6"
strip-bom "^3.0.0"
-tslib@^2.4.0:
+tslib@^1.8.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.0:
version "2.6.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+tsutils@^3.17.1, tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -2783,7 +3757,7 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
-typescript@^5.0.2:
+typescript@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
@@ -2798,6 +3772,11 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
+undici-types@~5.25.1:
+ version "5.25.3"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3"
+ integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==
+
unique-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
@@ -2810,6 +3789,19 @@ universalify@^0.1.0:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+untildify@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
+ integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
+
+update-browserslist-db@^1.0.13:
+ version "1.0.13"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
+ integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
@@ -2817,15 +3809,20 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
+use-sync-external-store@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
+ integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
+
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
vite@^4.4.5:
- version "4.4.9"
- resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.9.tgz#1402423f1a2f8d66fd8d15e351127c7236d29d3d"
- integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26"
+ integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==
dependencies:
esbuild "^0.18.10"
postcss "^8.4.27"
@@ -2885,13 +3882,13 @@ which-collection@^1.0.1:
is-weakmap "^2.0.1"
is-weakset "^2.0.1"
-which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.9:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a"
- integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==
+which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36"
+ integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==
dependencies:
available-typed-arrays "^1.0.5"
- call-bind "^1.0.2"
+ call-bind "^1.0.4"
for-each "^0.3.3"
gopd "^1.0.1"
has-tostringtag "^1.0.0"
@@ -2923,6 +3920,11 @@ xdg-basedir@^4.0.0:
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"