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]) => (
-
{day}
+
{day}
{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={ +
{semesterKey}
- )} + } > {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*/} + <Title style={{ marginBottom: 8, marginTop: 20 }} level="2" weight="2"> {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' }} > - + Дневник СПО -
+
+ {/*//@ts-ignore типы React не совсем совместимы с Preact*/} made with
- ); -}; + ) +} -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*/}
+ } + 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)} > - debouncedHandleButtonClick('next', 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={ +
{weekString}
- )} + } > - {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"