From 6a25374551cf156aef4002b63909dd9f158bf00d Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Fri, 15 Mar 2024 10:44:39 +0100 Subject: [PATCH 01/74] PMM-11231 Setup PMM UI --- .github/workflows/admin.yml | 1 + .github/workflows/agent.yml | 1 + .github/workflows/managed.yml | 1 + .github/workflows/qan-api2.yml | 1 + .github/workflows/ui.yml | 53 + .github/workflows/update.yml | 1 + .github/workflows/vmproxy.yml | 1 + .../ansible/roles/nginx/files/conf.d/pmm.conf | 6 + ui/.eslintrc.cjs | 4 + ui/.gitignore | 26 + ui/.nvmrc | 1 + ui/Makefile | 29 + ui/README.md | 44 + ui/docker-compose.yml | 39 + ui/index.html | 14 + ui/package.json | 54 + ui/pmm-dev.conf | 20 + ui/public/favicon.ico | Bin 0 -> 121312 bytes ui/src/App.tsx | 45 + ui/src/api/api.ts | 8 + ui/src/api/version.ts | 35 + ui/src/assets/welcome.svg | 18 + ui/src/components/app-bar/AppBar.messages.ts | 4 + ui/src/components/app-bar/AppBar.test.tsx | 19 + ui/src/components/app-bar/AppBar.tsx | 49 + ui/src/components/app-bar/index.ts | 1 + .../breadcrumbs/Breadcrumbs.messages.ts | 4 + ui/src/components/breadcrumbs/Breadcrumbs.tsx | 35 + ui/src/components/breadcrumbs/index.ts | 1 + ui/src/components/main/Main.tsx | 10 + ui/src/constants.ts | 1 + ui/src/icons/help/help.tsx | 30 + ui/src/icons/help/index.ts | 1 + ui/src/icons/index.ts | 2 + ui/src/icons/pmm/index.ts | 1 + ui/src/icons/pmm/pmm.tsx | 41 + ui/src/main.tsx | 9 + ui/src/pages/updates/Updates.messages.ts | 8 + ui/src/pages/updates/Updates.tsx | 33 + ui/src/pages/updates/index.ts | 1 + .../update-card/UpdateCard.messages.ts | 9 + .../pages/updates/update-card/UpdateCard.tsx | 108 + ui/src/pages/updates/update-card/index.ts | 1 + ui/src/router.tsx | 31 + ui/src/setupTests.ts | 1 + ui/src/themes/PmmTheme.tsx | 113 + ui/src/types/version.types.ts | 36 + ui/src/utils/formatTimestamp.tsx | 6 + ui/src/utils/testWrapper.tsx | 12 + ui/src/vite-env.d.ts | 1 + ui/tsconfig.json | 26 + ui/tsconfig.node.json | 10 + ui/vite.config.ts | 22 + ui/yarn.lock | 3389 +++++++++++++++++ 54 files changed, 4417 insertions(+) create mode 100644 .github/workflows/ui.yml create mode 100644 ui/.eslintrc.cjs create mode 100644 ui/.gitignore create mode 100644 ui/.nvmrc create mode 100644 ui/Makefile create mode 100644 ui/README.md create mode 100644 ui/docker-compose.yml create mode 100644 ui/index.html create mode 100644 ui/package.json create mode 100644 ui/pmm-dev.conf create mode 100644 ui/public/favicon.ico create mode 100644 ui/src/App.tsx create mode 100644 ui/src/api/api.ts create mode 100644 ui/src/api/version.ts create mode 100644 ui/src/assets/welcome.svg create mode 100644 ui/src/components/app-bar/AppBar.messages.ts create mode 100644 ui/src/components/app-bar/AppBar.test.tsx create mode 100644 ui/src/components/app-bar/AppBar.tsx create mode 100644 ui/src/components/app-bar/index.ts create mode 100644 ui/src/components/breadcrumbs/Breadcrumbs.messages.ts create mode 100644 ui/src/components/breadcrumbs/Breadcrumbs.tsx create mode 100644 ui/src/components/breadcrumbs/index.ts create mode 100644 ui/src/components/main/Main.tsx create mode 100644 ui/src/constants.ts create mode 100644 ui/src/icons/help/help.tsx create mode 100644 ui/src/icons/help/index.ts create mode 100644 ui/src/icons/index.ts create mode 100644 ui/src/icons/pmm/index.ts create mode 100644 ui/src/icons/pmm/pmm.tsx create mode 100644 ui/src/main.tsx create mode 100644 ui/src/pages/updates/Updates.messages.ts create mode 100644 ui/src/pages/updates/Updates.tsx create mode 100644 ui/src/pages/updates/index.ts create mode 100644 ui/src/pages/updates/update-card/UpdateCard.messages.ts create mode 100644 ui/src/pages/updates/update-card/UpdateCard.tsx create mode 100644 ui/src/pages/updates/update-card/index.ts create mode 100644 ui/src/router.tsx create mode 100644 ui/src/setupTests.ts create mode 100644 ui/src/themes/PmmTheme.tsx create mode 100644 ui/src/types/version.types.ts create mode 100644 ui/src/utils/formatTimestamp.tsx create mode 100644 ui/src/utils/testWrapper.tsx create mode 100644 ui/src/vite-env.d.ts create mode 100644 ui/tsconfig.json create mode 100644 ui/tsconfig.node.json create mode 100644 ui/vite.config.ts create mode 100644 ui/yarn.lock diff --git a/.github/workflows/admin.yml b/.github/workflows/admin.yml index c9c182d74d..8dc42da5a3 100644 --- a/.github/workflows/admin.yml +++ b/.github/workflows/admin.yml @@ -18,6 +18,7 @@ on: - "qan-api2/**" - "update/**" - "vmproxy/**" + - "ui/**" jobs: test: diff --git a/.github/workflows/agent.yml b/.github/workflows/agent.yml index 05f8471442..64be1af477 100644 --- a/.github/workflows/agent.yml +++ b/.github/workflows/agent.yml @@ -19,6 +19,7 @@ on: - "qan-api2/**" - "update/**" - "vmproxy/**" + - "ui/**" jobs: test: diff --git a/.github/workflows/managed.yml b/.github/workflows/managed.yml index eeb545c10d..5376c024a2 100644 --- a/.github/workflows/managed.yml +++ b/.github/workflows/managed.yml @@ -18,6 +18,7 @@ on: - 'qan-api2/**' - 'update/**' - 'vmproxy/**' + - "ui/**" jobs: test: diff --git a/.github/workflows/qan-api2.yml b/.github/workflows/qan-api2.yml index 9bd7d491be..1c08f3db07 100644 --- a/.github/workflows/qan-api2.yml +++ b/.github/workflows/qan-api2.yml @@ -19,6 +19,7 @@ on: - "managed/**" - "update/**" - "vmproxy/**" + - "ui/**" jobs: test: diff --git a/.github/workflows/ui.yml b/.github/workflows/ui.yml new file mode 100644 index 0000000000..433e824613 --- /dev/null +++ b/.github/workflows/ui.yml @@ -0,0 +1,53 @@ +name: UI + +on: + push: + branches: + - main + - v3 + - pmm-* + tags: + - v[0-9]+.[0-9]+.[0-9]+* + pull_request: + paths-ignore: + - "admin/**" + - "agent/**" + - "api-tests/**" + - "cli-tests/**" + - "docs/**" + - "managed/**" + - "managed-dev/**" + - "qan-api2/**" + - "vmproxy/**" + - "update/**" + +jobs: + ci: + name: CI + runs-on: ubuntu-22.04 + + defaults: + run: + working-directory: ${{ github.workspace }}/ui + + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Setup nodejs + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: yarn + + - name: Run lint + run: | + make lint + + - name: Run unit tests + run: | + make test + + - name: Build application + run: | + make build diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index 3e1798e250..8a2b604985 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -18,6 +18,7 @@ on: - "managed/**" - "qan-api2/**" - "vmproxy/**" + - "ui/**" jobs: build: diff --git a/.github/workflows/vmproxy.yml b/.github/workflows/vmproxy.yml index 125ea0dd8e..8416f9bdeb 100644 --- a/.github/workflows/vmproxy.yml +++ b/.github/workflows/vmproxy.yml @@ -19,6 +19,7 @@ on: - "managed/**" - "qan-api2/**" - "update/**" + - "ui/**" jobs: test: diff --git a/build/ansible/roles/nginx/files/conf.d/pmm.conf b/build/ansible/roles/nginx/files/conf.d/pmm.conf index fca411bbe4..cd922120de 100644 --- a/build/ansible/roles/nginx/files/conf.d/pmm.conf +++ b/build/ansible/roles/nginx/files/conf.d/pmm.conf @@ -126,6 +126,12 @@ try_files $uri /index.html break; } + # PMM UI + location /pmm { + alias /usr/share/pmm-ui; + try_files $uri /index.html break; + } + # Grafana rewrite ^/$ $scheme://$http_host/graph/; rewrite ^/graph$ /graph/; diff --git a/ui/.eslintrc.cjs b/ui/.eslintrc.cjs new file mode 100644 index 0000000000..3ede1f7695 --- /dev/null +++ b/ui/.eslintrc.cjs @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['@percona/eslint-config-react'], +}; diff --git a/ui/.gitignore b/ui/.gitignore new file mode 100644 index 0000000000..2af71fd455 --- /dev/null +++ b/ui/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +testdata/* \ No newline at end of file diff --git a/ui/.nvmrc b/ui/.nvmrc new file mode 100644 index 0000000000..e048c8ca19 --- /dev/null +++ b/ui/.nvmrc @@ -0,0 +1 @@ +v18.15.0 diff --git a/ui/Makefile b/ui/Makefile new file mode 100644 index 0000000000..e361594a5a --- /dev/null +++ b/ui/Makefile @@ -0,0 +1,29 @@ +.PHONY: dev +dev: + yarn dev + +.PHONY: ci +ci: setup lint test build + +.PHONY: format +format: setup + yarn format + +.PHONY: lints +lint: setup + yarn lint + +.PHONY: test +test: setup + yarn test + +.PHONY: setup +setup: + yarn install --frozen-lockfile + +.PHONY: build +build: setup + yarn build + +.PHONY: release +release: build diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 0000000000..8c2222b13c --- /dev/null +++ b/ui/README.md @@ -0,0 +1,44 @@ +# Percona Monitoring and Management UI + +[Percona Monitoring and Management (PMM)](https://www.percona.com/software/database-tools/percona-monitoring-and-management) is a best-of-breed open source database monitoring solution. It helps you reduce complexity, optimize performance, and improve the security of your business-critical database environments, no matter where they are located or deployed. +PMM helps users to: +* Reduce Complexity +* Optimize Database Performance +* Improve Data Security + +See the [PMM Documentation](https://www.percona.com/doc/percona-monitoring-and-management/2.x/index.html) for more information. + +## Pre-Requisites + +Make sure you have the following installed: +- [node 18](https://nodejs.org/en) (you can also use [nvm](https://github.com/nvm-sh/nvm) to manage node versions) +- [yarn](https://yarnpkg.com/) + +## Stack + +This repo uses the following stack across its packages: + +- Yarn to manage packages (https://yarnpkg.com/) +- Typescript (https://www.typescriptlang.org/); +- React (https://react.dev/); +- Rollup to bundle the different common packages (https://rollupjs.org/); +- Vite for development (https://vitejs.dev/); +- Vitest for unit tests (https://vitest.dev/); + +## Install dependencies + +```bash +make setup +``` + +## Run in development mode + +```bash +make dev +``` + +## Build application for production + +```bash +make build +``` diff --git a/ui/docker-compose.yml b/ui/docker-compose.yml new file mode 100644 index 0000000000..40df72b949 --- /dev/null +++ b/ui/docker-compose.yml @@ -0,0 +1,39 @@ +--- +services: + pmm-server: + container_name: pmm-server + # Temporary till we have arm builds + platform: linux/amd64 + image: perconalab/pmm-server:3-dev-container + ports: + - 80:9080 + - 443:8443 + volumes: + - ./pmm-dev.conf:/etc/nginx/conf.d/pmm-dev.conf:ro + + # Uncomment to use custom (FE) grafana code + #- '../../grafana/public:/usr/share/grafana/public' + #- '../../grafana/conf/grafana.local-dev.ini:/usr/share/grafana/conf/defaults.ini' + environment: + - PMM_DEBUG=1 + - PERCONA_PORTAL_URL=https://portal-dev.percona.com + - PERCONA_TEST_PLATFORM_ADDRESS=https://check-dev.percona.com:443 + - PERCONA_TEST_PLATFORM_PUBLIC_KEY=RWTkF7Snv08FCboTne4djQfN5qbrLfAjb8SY3/wwEP+X5nUrkxCEvUDJ + + mysql: + image: percona:5.7.30 + platform: linux/amd64 + container_name: pmm-agent_mysql + command: > + --sql-mode="ANSI_QUOTES" + --performance-schema --innodb_monitor_enable=all + --slow_query_log --log_slow_rate_limit=1 --log_slow_admin_statements --log_slow_slave_statements --slow_query_log_file=/mysql/slowlogs/slow.log --long_query_time=0 + ports: + - '3306:3306' + environment: + - MYSQL_ROOT_PASSWORD=ps + - MYSQL_USER=pmm-agent + - MYSQL_PASSWORD=pmm%*&agent-password + - UMASK=0777 # for slowlog file + volumes: + - ./testdata/mysql:/mysql diff --git a/ui/index.html b/ui/index.html new file mode 100644 index 0000000000..3c289879ac --- /dev/null +++ b/ui/index.html @@ -0,0 +1,14 @@ + + + + + + + PMM + + + +
+ + + diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000000..9e81c92fee --- /dev/null +++ b/ui/package.json @@ -0,0 +1,54 @@ +{ + "name": "ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "format": "prettier . --write", + "preview": "vite preview", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.15.12", + "@mui/material": "^5.15.12", + "@mui/x-date-pickers": "^6.19.6", + "@percona/design": "^1.0.0", + "@percona/ui-lib": "^1.0.0", + "axios": "^1.6.7", + "axios-case-converter": "^1.1.1", + "date-fns": "^2.30.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-query": "^3.39.3", + "react-router-dom": "^6.22.0" + }, + "devDependencies": { + "@percona/eslint-config-react": "^1.0.0", + "@percona/prettier-config": "^1.0.0", + "@percona/tsconfig": "^1.0.0", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/react": "^14.2.1", + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react-swc": "^3.6.0", + "eslint": "^8.55.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "jsdom": "^24.0.0", + "prettier": "^3.0.3", + "typescript": "~5.3.0", + "vite": "^5.0.8", + "vite-tsconfig-paths": "^4.2.1", + "vitest": "^1.3.1" + }, + "prettier": "@percona/prettier-config" +} diff --git a/ui/pmm-dev.conf b/ui/pmm-dev.conf new file mode 100644 index 0000000000..021073039d --- /dev/null +++ b/ui/pmm-dev.conf @@ -0,0 +1,20 @@ +# PMM UI +server { + listen 9080; + server_name _; + + # proxy requests during development to vite dev server + location /pmm { + proxy_pass http://host.docker.internal:5173/pmm; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + location / { + proxy_pass http://localhost:8080; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } +} diff --git a/ui/public/favicon.ico b/ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..faa39167ea8b65d3d41dbbc14f60061ce71d7354 GIT binary patch literal 121312 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 s`M_O6DzvE^B(s$iWlV3?${G3p0r9q2 ( + + + + + + + + + +); + +export default App; diff --git a/ui/src/api/api.ts b/ui/src/api/api.ts new file mode 100644 index 0000000000..dcf96a7a3d --- /dev/null +++ b/ui/src/api/api.ts @@ -0,0 +1,8 @@ +import axios from 'axios'; +import applyCaseMiddleware from 'axios-case-converter'; + +export const api = applyCaseMiddleware( + axios.create({ + baseURL: '/v1/', + }) +); diff --git a/ui/src/api/version.ts b/ui/src/api/version.ts new file mode 100644 index 0000000000..05d52a9d53 --- /dev/null +++ b/ui/src/api/version.ts @@ -0,0 +1,35 @@ +import { AxiosResponse } from 'axios'; +import { + GetUpdateStatusBody, + GetUpdateStatusResponse, + GetUpdatesBody, + GetUpdatesResponse, + StartUpdateResponse, +} from 'types/version.types'; +import { api } from './api'; + +export const getCurrentVersion = async ( + body: GetUpdatesBody = { force: false } +) => { + const res = await api.post>( + '/Updates/Check', + body + ); + return res.data; +}; + +export const startUpdate = async () => { + const res = await api.post>( + '/Updates/Start', + {} + ); + return res.data; +}; + +export const getUpdateStatus = async (body: GetUpdateStatusBody) => { + const res = await api.post< + GetUpdateStatusBody, + AxiosResponse + >('/Updates/Status', body); + return res.data; +}; diff --git a/ui/src/assets/welcome.svg b/ui/src/assets/welcome.svg new file mode 100644 index 0000000000..081e1b685b --- /dev/null +++ b/ui/src/assets/welcome.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/src/components/app-bar/AppBar.messages.ts b/ui/src/components/app-bar/AppBar.messages.ts new file mode 100644 index 0000000000..c93b82a37f --- /dev/null +++ b/ui/src/components/app-bar/AppBar.messages.ts @@ -0,0 +1,4 @@ +export const Messages = { + title: 'PMM', + support: 'Support', +}; diff --git a/ui/src/components/app-bar/AppBar.test.tsx b/ui/src/components/app-bar/AppBar.test.tsx new file mode 100644 index 0000000000..c735dafcb2 --- /dev/null +++ b/ui/src/components/app-bar/AppBar.test.tsx @@ -0,0 +1,19 @@ +import { screen, render } from '@testing-library/react'; +import { AppBar } from '.'; +import { PMM_HOME_URL } from 'constants'; +import { TestWrapper } from 'utils/testWrapper'; + +describe('AppBar', () => { + it('links back to older PMM', () => { + render( + + + + ); + + expect(screen.getByTestId('appbar-pmm-link')).toHaveAttribute( + 'href', + PMM_HOME_URL + ); + }); +}); diff --git a/ui/src/components/app-bar/AppBar.tsx b/ui/src/components/app-bar/AppBar.tsx new file mode 100644 index 0000000000..bf7d58bf27 --- /dev/null +++ b/ui/src/components/app-bar/AppBar.tsx @@ -0,0 +1,49 @@ +import { + Box, + AppBar as MuiAppBar, + Toolbar, + Typography, + Link, + Stack, +} from '@mui/material'; +import { Link as RouterLink } from 'react-router-dom'; +import { HelpFilledIcon, PmmRoundedIcon } from 'icons'; +import { Breadcrumbs } from 'components/breadcrumbs'; +import { PMM_HOME_URL } from 'constants'; +import { Messages } from './AppBar.messages'; + +export const AppBar = () => ( + + + ({ + marginRight: theme.spacing(2), + })} + data-testid="appbar-pmm-link" + > + + + {Messages.title} + + + + + + + + {Messages.support} + + + + + +); diff --git a/ui/src/components/app-bar/index.ts b/ui/src/components/app-bar/index.ts new file mode 100644 index 0000000000..60f2f0e90b --- /dev/null +++ b/ui/src/components/app-bar/index.ts @@ -0,0 +1 @@ +export * from './AppBar'; diff --git a/ui/src/components/breadcrumbs/Breadcrumbs.messages.ts b/ui/src/components/breadcrumbs/Breadcrumbs.messages.ts new file mode 100644 index 0000000000..5d99ad5f96 --- /dev/null +++ b/ui/src/components/breadcrumbs/Breadcrumbs.messages.ts @@ -0,0 +1,4 @@ +export const Messages = { + home: 'Home', + updates: 'Updates', +}; diff --git a/ui/src/components/breadcrumbs/Breadcrumbs.tsx b/ui/src/components/breadcrumbs/Breadcrumbs.tsx new file mode 100644 index 0000000000..305217fbfd --- /dev/null +++ b/ui/src/components/breadcrumbs/Breadcrumbs.tsx @@ -0,0 +1,35 @@ +import { FC } from 'react'; +import { + alpha, + Link, + Breadcrumbs as MuiBreadcrumbs, + useTheme, +} from '@mui/material'; +import { Link as RouterLink } from 'react-router-dom'; +import { KeyboardArrowRight } from '@mui/icons-material'; +import { PMM_HOME_URL } from 'constants'; +import { Messages } from './Breadcrumbs.messages'; + +export const Breadcrumbs: FC = () => { + const theme = useTheme(); + + return ( + } + > + + {Messages.home} + + + {Messages.updates} + + + ); +}; diff --git a/ui/src/components/breadcrumbs/index.ts b/ui/src/components/breadcrumbs/index.ts new file mode 100644 index 0000000000..ce977548b1 --- /dev/null +++ b/ui/src/components/breadcrumbs/index.ts @@ -0,0 +1 @@ +export * from './Breadcrumbs'; diff --git a/ui/src/components/main/Main.tsx b/ui/src/components/main/Main.tsx new file mode 100644 index 0000000000..9df7c434de --- /dev/null +++ b/ui/src/components/main/Main.tsx @@ -0,0 +1,10 @@ +import { Stack } from '@mui/material'; +import { Outlet } from 'react-router-dom'; +import { AppBar } from '../app-bar/AppBar'; + +export const Main = () => ( + + + + +); diff --git a/ui/src/constants.ts b/ui/src/constants.ts new file mode 100644 index 0000000000..c571961e53 --- /dev/null +++ b/ui/src/constants.ts @@ -0,0 +1 @@ +export const PMM_HOME_URL = '/graph/d/pmm-home'; diff --git a/ui/src/icons/help/help.tsx b/ui/src/icons/help/help.tsx new file mode 100644 index 0000000000..81020e4bc6 --- /dev/null +++ b/ui/src/icons/help/help.tsx @@ -0,0 +1,30 @@ +import { SvgIcon, SvgIconProps } from '@mui/material'; + +export const HelpFilledIcon = (props: SvgIconProps) => ( + + + + + + + + +); diff --git a/ui/src/icons/help/index.ts b/ui/src/icons/help/index.ts new file mode 100644 index 0000000000..b658848387 --- /dev/null +++ b/ui/src/icons/help/index.ts @@ -0,0 +1 @@ +export * from './help'; diff --git a/ui/src/icons/index.ts b/ui/src/icons/index.ts new file mode 100644 index 0000000000..53081bcdc1 --- /dev/null +++ b/ui/src/icons/index.ts @@ -0,0 +1,2 @@ +export * from './help'; +export * from './pmm'; diff --git a/ui/src/icons/pmm/index.ts b/ui/src/icons/pmm/index.ts new file mode 100644 index 0000000000..1c51e587fd --- /dev/null +++ b/ui/src/icons/pmm/index.ts @@ -0,0 +1 @@ +export * from './pmm'; diff --git a/ui/src/icons/pmm/pmm.tsx b/ui/src/icons/pmm/pmm.tsx new file mode 100644 index 0000000000..1fb4959a75 --- /dev/null +++ b/ui/src/icons/pmm/pmm.tsx @@ -0,0 +1,41 @@ +import SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon'; + +export const PmmRoundedIcon = (props: SvgIconProps) => ( + + + + + + + + + + + +); diff --git a/ui/src/main.tsx b/ui/src/main.tsx new file mode 100644 index 0000000000..5a0654ace9 --- /dev/null +++ b/ui/src/main.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App.tsx'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + +); diff --git a/ui/src/pages/updates/Updates.messages.ts b/ui/src/pages/updates/Updates.messages.ts new file mode 100644 index 0000000000..825554a998 --- /dev/null +++ b/ui/src/pages/updates/Updates.messages.ts @@ -0,0 +1,8 @@ +export const Messages = { + title: 'Welcome', + welcome: { + title: 'Welcome to the future PMM', + description: + 'The future is promising! We are brewing some changes to make your experience smoother, performant, but still powerful. Stay tuned to the future PMM updates!', + }, +}; diff --git a/ui/src/pages/updates/Updates.tsx b/ui/src/pages/updates/Updates.tsx new file mode 100644 index 0000000000..87d6a453c2 --- /dev/null +++ b/ui/src/pages/updates/Updates.tsx @@ -0,0 +1,33 @@ +import { CardContent, CardMedia, Stack, Typography } from '@mui/material'; +import { Card } from '@mui/material'; +import { FC } from 'react'; +import Welcome from 'assets/welcome.svg'; +import { UpdateCard } from './update-card'; +import { Messages } from './Updates.messages'; + +export const Updates: FC = () => { + return ( + + {Messages.title} + + + + + {Messages.welcome.title} + + {Messages.welcome.description} + + + + + + + ); +}; diff --git a/ui/src/pages/updates/index.ts b/ui/src/pages/updates/index.ts new file mode 100644 index 0000000000..ec22c9f2d9 --- /dev/null +++ b/ui/src/pages/updates/index.ts @@ -0,0 +1 @@ +export * from './Updates'; diff --git a/ui/src/pages/updates/update-card/UpdateCard.messages.ts b/ui/src/pages/updates/update-card/UpdateCard.messages.ts new file mode 100644 index 0000000000..7262652b1a --- /dev/null +++ b/ui/src/pages/updates/update-card/UpdateCard.messages.ts @@ -0,0 +1,9 @@ +export const Messages = { + fetchError: "Couldn't load current version information.", + upToDate: 'This PMM instance is up to date.', + runningVersion: 'Running version:', + lastChecked: 'Last checked:', + home: 'PMM Home', + checkNow: 'Check Updates Now', + checking: 'Checking', +}; diff --git a/ui/src/pages/updates/update-card/UpdateCard.tsx b/ui/src/pages/updates/update-card/UpdateCard.tsx new file mode 100644 index 0000000000..12b7b67362 --- /dev/null +++ b/ui/src/pages/updates/update-card/UpdateCard.tsx @@ -0,0 +1,108 @@ +import { + Button, + Card, + CardActions, + CardContent, + Stack, + Link, + Typography, + Skeleton, + Alert, +} from '@mui/material'; +import { getCurrentVersion } from 'api/version'; +import { FC } from 'react'; +import { useQuery } from 'react-query'; +import { formatTimestamp } from 'utils/formatTimestamp'; +import CachedIcon from '@mui/icons-material/Cached'; +import { PMM_HOME_URL } from 'constants'; +import { Messages } from './UpdateCard.messages'; +export const UpdateCard: FC = () => { + const { isLoading, data, error, isRefetching, refetch } = useQuery( + ['currentVersion'], + () => getCurrentVersion() + ); + + if (isLoading) + return ( + + + + + + + + + ); + + if (!data || error) { + return ( + + + {Messages.fetchError} + + + ); + } + + return ( + + + {data.installed.fullVersion === data.latest.fullVersion && ( + + {Messages.upToDate} + + )} + + + + {Messages.runningVersion} + {' '} + {data?.installed.version},{' '} + {formatTimestamp(data?.installed.timestamp)} + + + + {Messages.lastChecked} + {' '} + {formatTimestamp(data?.lastCheck)} + + + + + + + + + + + ); +}; diff --git a/ui/src/pages/updates/update-card/index.ts b/ui/src/pages/updates/update-card/index.ts new file mode 100644 index 0000000000..abfff0bdd2 --- /dev/null +++ b/ui/src/pages/updates/update-card/index.ts @@ -0,0 +1 @@ +export * from './UpdateCard'; diff --git a/ui/src/router.tsx b/ui/src/router.tsx new file mode 100644 index 0000000000..c241ba676c --- /dev/null +++ b/ui/src/router.tsx @@ -0,0 +1,31 @@ +import { Navigate, createBrowserRouter } from 'react-router-dom'; +import { Main } from 'components/main/Main'; +import { Updates } from 'pages/updates'; + +const router = createBrowserRouter( + [ + { + path: '/', + element:
, + children: [ + { + path: '', + element: , + }, + { + path: 'updates', + element: , + }, + ], + }, + { + path: '*', + element:
Not found!
, + }, + ], + { + basename: '/pmm', + } +); + +export default router; diff --git a/ui/src/setupTests.ts b/ui/src/setupTests.ts new file mode 100644 index 0000000000..7b0828bfa8 --- /dev/null +++ b/ui/src/setupTests.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; diff --git a/ui/src/themes/PmmTheme.tsx b/ui/src/themes/PmmTheme.tsx new file mode 100644 index 0000000000..7b25eb1892 --- /dev/null +++ b/ui/src/themes/PmmTheme.tsx @@ -0,0 +1,113 @@ +import { PaletteMode } from '@mui/material'; +import { ThemeOptions } from '@mui/material/styles'; +import { deepmerge } from '@mui/utils'; +import { baseThemeOptions } from '@percona/design'; + +const perconaThemeOptions = (mode: PaletteMode): ThemeOptions => { + const newOptions: ThemeOptions = { + palette: { + mode, + ...(mode === 'light' + ? { + primary: { + main: '#AC3100', + dark: '#852600', + light: '#DC3F00', + contrastText: '#FFFFFF', + }, + action: { + hover: 'rgba(220, 63, 0, 0.04)', + hoverOpacity: 0.04, + selected: 'rgba(220, 63, 0, 0.08)', + selectedOpacity: 0.08, + focus: 'rgba(220, 63, 0, 0.12)', + focusOpacity: 0.12, + focusVisible: 'rgba(220, 48, 0, 0.3)', + focusVisibleOpacity: 0.3, + outlinedBorder: 'rgba(220, 33, 0, 0.5)', + outlinedBorderOpacity: 0.5, + }, + background: { + default: '#F0F1F4', + }, + surfaces: { + default: '#FFFFFF', + }, + } + : { + primary: { + main: '#F68254', + dark: '#F56A33', + light: '#F9A98A', + contrastText: '#000000', + }, + action: { + hover: 'rgba(245, 106, 51, 0.08)', + hoverOpacity: 0.08, + selected: 'rgba(245, 106, 51, 0.12)', + selectedOpacity: 0.12, + focus: 'rgba(245, 106, 51, 0.15)', + focusOpacity: 0.15, + focusVisible: 'rgba(245, 106, 51, 0.3)', + focusVisibleOpacity: 0.3, + outlinedBorder: 'rgba(245, 106, 51, 0.5)', + outlinedBorderOpacity: 0.5, + }, + }), + }, + components: { + MuiIconButton: { + defaultProps: { + disableTouchRipple: true, + }, + styleOverrides: { + root: ({ theme, ownerState }) => ({ + color: theme.palette.text.primary, + ...(ownerState.color === 'primary' && { + color: theme.palette.primary.main, + }), + '&:hover': { + backgroundColor: theme.palette.action.selected, + }, + '&:focus': { + backgroundColor: theme.palette.action.focusVisible, + }, + ...(ownerState.size === 'large' && { + svg: { + width: 40, + height: 40, + }, + }), + ...(ownerState.size === 'small' && { + svg: { + width: 20, + height: 20, + }, + }), + }), + }, + }, + MuiAppBar: { + styleOverrides: { + root: () => ({ + color: '#FBFBFB', + backgroundColor: '#3A4151', + }), + }, + }, + MuiToggleButtonGroup: { + styleOverrides: { + root: ({ theme }) => ({ + [theme.breakpoints.down('sm')]: { + flexDirection: 'column', + }, + }), + }, + }, + }, + }; + + return deepmerge(baseThemeOptions(mode), newOptions); +}; + +export default perconaThemeOptions; diff --git a/ui/src/types/version.types.ts b/ui/src/types/version.types.ts new file mode 100644 index 0000000000..e42a841345 --- /dev/null +++ b/ui/src/types/version.types.ts @@ -0,0 +1,36 @@ +export interface GetUpdatesBody { + force: boolean; + onlyInstalledVersion?: boolean; +} + +export interface GetUpdatesResponse { + lastCheck: string; + latest: { + fullVersion: string; + timestamp: string; + version: string; + }; + installed: { + fullVersion: string; + timestamp: string; + version: string; + }; + latestNewsUrl?: string; + updateAvailable?: boolean; +} + +export interface StartUpdateResponse { + authToken: string; + logOffset: number; +} + +export interface GetUpdateStatusBody { + authToken: string; + logOffset: number; +} + +export interface GetUpdateStatusResponse { + done: boolean; + logOffset: number; + logLines: string[]; +} diff --git a/ui/src/utils/formatTimestamp.tsx b/ui/src/utils/formatTimestamp.tsx new file mode 100644 index 0000000000..02f94b5ced --- /dev/null +++ b/ui/src/utils/formatTimestamp.tsx @@ -0,0 +1,6 @@ +export const formatTimestamp = (timestamp: string) => + new Date(timestamp).toLocaleDateString('en-US', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); diff --git a/ui/src/utils/testWrapper.tsx b/ui/src/utils/testWrapper.tsx new file mode 100644 index 0000000000..5ab8b77412 --- /dev/null +++ b/ui/src/utils/testWrapper.tsx @@ -0,0 +1,12 @@ +import { ThemeContextProvider } from '@percona/design'; +import { FC, PropsWithChildren } from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import pmmThemeOptions from 'themes/PmmTheme'; + +export const TestWrapper: FC = ({ children }) => ( + + + {children} + + +); diff --git a/ui/src/vite-env.d.ts b/ui/src/vite-env.d.ts new file mode 100644 index 0000000000..11f02fe2a0 --- /dev/null +++ b/ui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/ui/tsconfig.json b/ui/tsconfig.json new file mode 100644 index 0000000000..6e4dd26e66 --- /dev/null +++ b/ui/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "baseUrl": "./src", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "types": ["@testing-library/jest-dom", "vitest/globals"], + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["./src"] +} diff --git a/ui/tsconfig.node.json b/ui/tsconfig.node.json new file mode 100644 index 0000000000..42872c59f5 --- /dev/null +++ b/ui/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/ui/vite.config.ts b/ui/vite.config.ts new file mode 100644 index 0000000000..f1b9725d6f --- /dev/null +++ b/ui/vite.config.ts @@ -0,0 +1,22 @@ +import tsconfigPaths from 'vite-tsconfig-paths'; +import react from '@vitejs/plugin-react-swc'; +import { defineConfig } from 'vitest/config'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [tsconfigPaths({ root: '.' }), react()], + base: '/pmm', + server: { + proxy: { + '/v1': { + target: '/', + }, + }, + host: '0.0.0.0', + }, + test: { + globals: true, + environment: 'jsdom', + setupFiles: 'src/setupTests.ts', + }, +}); diff --git a/ui/yarn.lock b/ui/yarn.lock new file mode 100644 index 0000000000..b6b0a9caa9 --- /dev/null +++ b/ui/yarn.lock @@ -0,0 +1,3389 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adobe/css-tools@^4.3.2": + version "4.3.3" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz" + integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/helper-module-imports@^7.16.7": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.8", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz" + integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/types@^7.22.15": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/is-prop-valid@^1.2.1": + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz" + integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@^11.11.4": + version "11.11.4" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz" + integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": + version "1.1.3" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz" + integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/styled@^11.11.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@floating-ui/core@^1.0.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz" + integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + dependencies: + "@floating-ui/utils" "^0.2.1" + +"@floating-ui/dom@^1.6.1": + version "1.6.3" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz" + integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== + dependencies: + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/react-dom@^2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz" + integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw== + dependencies: + "@floating-ui/dom" "^1.6.1" + +"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": + version "0.2.1" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== + +"@fontsource/poppins@^5.0.8": + version "5.0.12" + resolved "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.0.12.tgz" + integrity sha512-0qzBxtIJLh82iMJ9pCXKYwGs1zyS+jyUmwVJ59+JdYnEaFVkDsxVOk9yDWfVOs14ALUneodU2m5YSGma6dCYCw== + +"@fontsource/roboto@^5.0.8": + version "5.0.12" + resolved "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.12.tgz" + integrity sha512-x0o17jvgoSSbS9OZnUX2+xJmVRvVCfeaYJjkS7w62iN7CuJWtMf5vJj8LqgC7ibqIkitOHVW+XssRjgrcHn62g== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@mui/base@5.0.0-beta.38", "@mui/base@^5.0.0-beta.22": + version "5.0.0-beta.38" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.38.tgz" + integrity sha512-AsjD6Y1X5A1qndxz8xCcR8LDqv31aiwlgWMPxFAX/kCKiIGKlK65yMeVZ62iQr/6LBz+9hSKLiD1i4TZdAHKcQ== + dependencies: + "@babel/runtime" "^7.23.9" + "@floating-ui/react-dom" "^2.0.8" + "@mui/types" "^7.2.13" + "@mui/utils" "^5.15.12" + "@popperjs/core" "^2.11.8" + clsx "^2.1.0" + prop-types "^15.8.1" + +"@mui/core-downloads-tracker@^5.15.12": + version "5.15.12" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.12.tgz" + integrity sha512-brRO+tMFLpGyjEYHrX97bzqeF6jZmKpqqe1rY0LyIHAwP6xRVzh++zSecOQorDOCaZJg4XkGT9xfD+RWOWxZBA== + +"@mui/icons-material@^5.15.12": + version "5.15.12" + resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.12.tgz" + integrity sha512-3BXiDlOd3AexZoEXa/VqpIpVIvosCzjLHsdMWzKMXbZdnBiJjmb9ECdqfjn5SpTClO49qvkKLhkTqdBH3fSFGw== + dependencies: + "@babel/runtime" "^7.23.9" + +"@mui/material@^5.15.12": + version "5.15.12" + resolved "https://registry.npmjs.org/@mui/material/-/material-5.15.12.tgz" + integrity sha512-vXJGg6KNKucsvbW6l7w9zafnpOp0CWc0Wx4mDykuABTpQ5QQBnZxP7+oB4yAS1hDZQ1WobbeIl0CjxK4EEahkA== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/base" "5.0.0-beta.38" + "@mui/core-downloads-tracker" "^5.15.12" + "@mui/system" "^5.15.12" + "@mui/types" "^7.2.13" + "@mui/utils" "^5.15.12" + "@types/react-transition-group" "^4.4.10" + clsx "^2.1.0" + csstype "^3.1.3" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.5" + +"@mui/private-theming@^5.15.12": + version "5.15.12" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.12.tgz" + integrity sha512-cqoSo9sgA5HE+8vZClbLrq9EkyOnYysooepi5eKaKvJ41lReT2c5wOZAeDDM1+xknrMDos+0mT2zr3sZmUiRRA== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/utils" "^5.15.12" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.15.11": + version "5.15.11" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.11.tgz" + integrity sha512-So21AhAngqo07ces4S/JpX5UaMU2RHXpEA6hNzI6IQjd/1usMPxpgK8wkGgTe3JKmC2KDmH8cvoycq5H3Ii7/w== + dependencies: + "@babel/runtime" "^7.23.9" + "@emotion/cache" "^11.11.0" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/system@^5.15.12": + version "5.15.12" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.15.12.tgz" + integrity sha512-/pq+GO6yN3X7r3hAwFTrzkAh7K1bTF5r8IzS79B9eyKJg7v6B/t4/zZYMR6OT9qEPtwf6rYN2Utg1e6Z7F1OgQ== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/private-theming" "^5.15.12" + "@mui/styled-engine" "^5.15.11" + "@mui/types" "^7.2.13" + "@mui/utils" "^5.15.12" + clsx "^2.1.0" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/types@^7.2.13": + version "7.2.13" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz" + integrity sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g== + +"@mui/utils@^5.14.15", "@mui/utils@^5.14.16", "@mui/utils@^5.15.12": + version "5.15.12" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.15.12.tgz" + integrity sha512-8SDGCnO2DY9Yy+5bGzu00NZowSDtuyHP4H8gunhHGQoIlhlY2Z3w64wBzAOLpYw/ZhJNzksDTnS/i8qdJvxuow== + dependencies: + "@babel/runtime" "^7.23.9" + "@types/prop-types" "^15.7.11" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/x-date-pickers@^6.19.6": + version "6.19.6" + resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.19.6.tgz" + integrity sha512-QW9AFcPi0vLpkUhmquhhyhLaBvB0AZJuu3NTrE173qNKx3Z3n51aCLY9bc7c6i4ltZMMsVRHlvzQjsve04TC8A== + dependencies: + "@babel/runtime" "^7.23.2" + "@mui/base" "^5.0.0-beta.22" + "@mui/utils" "^5.14.16" + "@types/react-transition-group" "^4.4.8" + clsx "^2.0.0" + prop-types "^15.8.1" + react-transition-group "^4.4.5" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@percona/design@1.0.0", "@percona/design@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@percona/design/-/design-1.0.0.tgz" + integrity sha512-LNVdwOLoQGSgRA3bmppjsCzIxvNoatrPqYGi21g5qla8WHXkmMBWYKZKt+36BEgl+jEQZv42r2iQ6RBPgNCJ3A== + dependencies: + "@fontsource/poppins" "^5.0.8" + "@fontsource/roboto" "^5.0.8" + "@mui/utils" "^5.14.15" + +"@percona/eslint-config-react@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@percona/eslint-config-react/-/eslint-config-react-1.0.0.tgz" + integrity sha512-SPOgMcTZ48WysDk0F95oy9ywaQoeu+JnoTgOLhT+X4ta96ZBU55TbjbyCWz1bieuAFjFGzL/GUxHshhLadXl4g== + +"@percona/prettier-config@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@percona/prettier-config/-/prettier-config-1.0.0.tgz" + integrity sha512-SzN+mWmMKOK46dQsBye1E2CqqpVYVErSprmNIAmSlSB0vJ+AbOWdqc9stccAYYuz0AzMvvyQyh13D9n0wROxNQ== + +"@percona/tsconfig@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@percona/tsconfig/-/tsconfig-1.0.0.tgz" + integrity sha512-/KZtra6YrRCODzdyLa6PHE0cTZrMMCd19yAhC4HNk2OWdbSzCEnxWtOtnzTUJ0JQSfN67OdG/ytCzuwivYooiw== + +"@percona/types@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@percona/types/-/types-1.0.0.tgz" + integrity sha512-2Kmv9bLbG/M2UvCL0DxEocsWq8XX7FAznmK0ZTQZZVH2r3tHJx7Rg+guTEiE4tmgP9OMGK+INrRIsmciOB0Rrw== + +"@percona/ui-lib@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@percona/ui-lib/-/ui-lib-1.0.0.tgz" + integrity sha512-3Lom91/x5hL0b+dZEQq6sj/vMzO7Ig7+fTQiKu6Y4biVBWhjMcv+gsyllIGGUcasiN1izxG8odhlQkgga26qFg== + dependencies: + "@percona/design" "1.0.0" + "@percona/types" "1.0.0" + "@percona/utils" "1.0.0" + "@types/react" "^18.2.15" + material-react-table "^1.15.1" + notistack "^3.0.1" + react-hook-form "^7.47.0" + +"@percona/utils@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@percona/utils/-/utils-1.0.0.tgz" + integrity sha512-dJicwFS8QhnafKSTFIW+FAPw6/5F0IXiksGQxvMS81jxNUgPxc1qLDgkVQ12qCuKNlgJYWIOM7hHLQ/1rUCOOA== + +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@remix-run/router@1.15.3": + version "1.15.3" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz" + integrity sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w== + +"@rollup/rollup-android-arm-eabi@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" + integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== + +"@rollup/rollup-android-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" + integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== + +"@rollup/rollup-darwin-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz" + integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== + +"@rollup/rollup-darwin-x64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" + integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== + +"@rollup/rollup-linux-arm-gnueabihf@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" + integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== + +"@rollup/rollup-linux-arm64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" + integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== + +"@rollup/rollup-linux-arm64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" + integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== + +"@rollup/rollup-linux-riscv64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" + integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== + +"@rollup/rollup-linux-x64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" + integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== + +"@rollup/rollup-linux-x64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" + integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== + +"@rollup/rollup-win32-arm64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" + integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== + +"@rollup/rollup-win32-ia32-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" + integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== + +"@rollup/rollup-win32-x64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" + integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@swc/core-darwin-arm64@1.4.8": + version "1.4.8" + resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.8.tgz" + integrity sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ== + +"@swc/core-darwin-x64@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.8.tgz#a5bcbec6830800ca8acafbda1944464ca8421804" + integrity sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ== + +"@swc/core-linux-arm-gnueabihf@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.8.tgz#0bf6ae3793bbb7dd0e47c3d153350d31b7e63cf9" + integrity sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA== + +"@swc/core-linux-arm64-gnu@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.8.tgz#8d3d3e698fc243d4a55c01a968b7297547aa6275" + integrity sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ== + +"@swc/core-linux-arm64-musl@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.8.tgz#ace70bbb650ceb70609987c5b07ff34462960b9e" + integrity sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w== + +"@swc/core-linux-x64-gnu@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.8.tgz#76e7fb06e5b6a14ed6dbc0fd00743706d022eb02" + integrity sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w== + +"@swc/core-linux-x64-musl@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.8.tgz#a6e03fe6207fcb9715250c7af260e5ee1bf43c5a" + integrity sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q== + +"@swc/core-win32-arm64-msvc@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.8.tgz#5daa44087324c49c64fdbb48fdb3aa00218de03b" + integrity sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA== + +"@swc/core-win32-ia32-msvc@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.8.tgz#0f1186d2d8bf60c12cfe8ac013b8a520fd850f2e" + integrity sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw== + +"@swc/core-win32-x64-msvc@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.8.tgz#0bf080132a52e332c7c221d1087a311824746d76" + integrity sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg== + +"@swc/core@^1.3.107": + version "1.4.8" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.4.8.tgz" + integrity sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg== + dependencies: + "@swc/counter" "^0.1.2" + "@swc/types" "^0.1.5" + optionalDependencies: + "@swc/core-darwin-arm64" "1.4.8" + "@swc/core-darwin-x64" "1.4.8" + "@swc/core-linux-arm-gnueabihf" "1.4.8" + "@swc/core-linux-arm64-gnu" "1.4.8" + "@swc/core-linux-arm64-musl" "1.4.8" + "@swc/core-linux-x64-gnu" "1.4.8" + "@swc/core-linux-x64-musl" "1.4.8" + "@swc/core-win32-arm64-msvc" "1.4.8" + "@swc/core-win32-ia32-msvc" "1.4.8" + "@swc/core-win32-x64-msvc" "1.4.8" + +"@swc/counter@^0.1.2": + version "0.1.3" + resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz" + integrity sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw== + +"@tanstack/match-sorter-utils@8.8.4": + version "8.8.4" + resolved "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.8.4.tgz" + integrity sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw== + dependencies: + remove-accents "0.4.2" + +"@tanstack/react-table@8.10.7": + version "8.10.7" + resolved "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.7.tgz" + integrity sha512-bXhjA7xsTcsW8JPTTYlUg/FuBpn8MNjiEPhkNhIGCUR6iRQM2+WEco4OBpvDeVcR9SE+bmWLzdfiY7bCbCSVuA== + dependencies: + "@tanstack/table-core" "8.10.7" + +"@tanstack/react-virtual@3.0.0-beta.65": + version "3.0.0-beta.65" + resolved "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.65.tgz" + integrity sha512-Q21cUoE0C8Oyzy3RAMV+u4BuB+RwIf2/oQRCWksmIBp1PqLEtvXhAldh7v/wUt7WKEkislKDICZAvbYYs7EAyQ== + dependencies: + "@tanstack/virtual-core" "3.0.0-beta.65" + +"@tanstack/table-core@8.10.7": + version "8.10.7" + resolved "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.10.7.tgz" + integrity sha512-KQk5OMg5OH6rmbHZxuNROvdI+hKDIUxANaHlV+dPlNN7ED3qYQ/WkpY2qlXww1SIdeMlkIhpN/2L00rof0fXFw== + +"@tanstack/virtual-core@3.0.0-beta.65": + version "3.0.0-beta.65" + resolved "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0-beta.65.tgz" + integrity sha512-ObP2pvXBdbivinr7BWDbGqYt4TK8wNzYsOWio+qBkDx5AJFuvqcdJxcCCYnv4dzVTe5ELA1MT4tkt8NB/tnEdA== + +"@testing-library/dom@^9.0.0": + version "9.3.4" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz" + integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^6.4.2": + version "6.4.2" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz" + integrity sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw== + dependencies: + "@adobe/css-tools" "^4.3.2" + "@babel/runtime" "^7.9.2" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^14.2.1": + version "14.2.1" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-14.2.1.tgz" + integrity sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^9.0.0" + "@types/react-dom" "^18.0.0" + +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + +"@types/estree@1.0.5", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/prop-types@*", "@types/prop-types@^15.7.11": + version "15.7.11" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/react-dom@^18.0.0": + version "18.2.22" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz" + integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== + dependencies: + "@types/react" "*" + +"@types/react-dom@^18.2.17": + version "18.2.21" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.21.tgz" + integrity sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.10", "@types/react-transition-group@^4.4.8": + version "4.4.10" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.15", "@types/react@^18.2.43": + version "18.2.65" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz" + integrity sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@typescript-eslint/eslint-plugin@^6.14.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.14.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vitejs/plugin-react-swc@^3.6.0": + version "3.6.0" + resolved "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz" + integrity sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g== + dependencies: + "@swc/core" "^1.3.107" + +"@vitest/expect@1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz" + integrity sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw== + dependencies: + "@vitest/spy" "1.3.1" + "@vitest/utils" "1.3.1" + chai "^4.3.10" + +"@vitest/runner@1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.1.tgz" + integrity sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg== + dependencies: + "@vitest/utils" "1.3.1" + p-limit "^5.0.0" + pathe "^1.1.1" + +"@vitest/snapshot@1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.1.tgz" + integrity sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ== + dependencies: + magic-string "^0.30.5" + pathe "^1.1.1" + pretty-format "^29.7.0" + +"@vitest/spy@1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz" + integrity sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig== + dependencies: + tinyspy "^2.2.0" + +"@vitest/utils@1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz" + integrity sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ== + dependencies: + diff-sequences "^29.6.3" + estree-walker "^3.0.3" + loupe "^2.3.7" + pretty-format "^29.7.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.11.3, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + 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.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +aria-query@^5.0.0: + version "5.3.0" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axios-case-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/axios-case-converter/-/axios-case-converter-1.1.1.tgz" + integrity sha512-v13pB7cYryh/7f4TKxN/gniD2hwqPQcjip29Hk3J9iwsnA37Rht2Hkn5VyrxynxlKdMNSIfGk6I9D6G28oTRyQ== + dependencies: + camel-case "^4.1.1" + header-case "^2.0.3" + snake-case "^3.0.3" + tslib "^2.3.0" + +axios@^1.6.7: + version "1.6.7" + resolved "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +big-integer@^1.6.16: + version "1.6.52" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +broadcast-channel@^3.4.1: + version "3.7.0" + resolved "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz" + integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== + dependencies: + "@babel/runtime" "^7.7.2" + detect-node "^2.1.0" + js-sha3 "0.8.0" + microseconds "0.2.0" + nano-time "1.0.0" + oblivious-set "1.0.0" + rimraf "3.0.2" + unload "2.2.0" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +chai@^4.3.10: + version "4.4.1" + resolved "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + 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.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +clsx@^1.1.0: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +clsx@^2.0.0, clsx@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + 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.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssstyle@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz" + integrity sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ== + dependencies: + rrweb-cssom "^0.6.0" + +csstype@^3.0.2, csstype@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +data-urls@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz" + integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== + dependencies: + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + +date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +deep-eql@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +detect-node@^2.0.4, detect-node@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +esbuild@^0.19.3: + version "0.19.12" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react-refresh@^0.4.5: + version "0.4.5" + resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz" + integrity sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +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.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.55.0: + version "8.57.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@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" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + 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.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +goober@^2.0.33: + version "2.1.14" + resolved "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz" + integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +header-case@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + +highlight-words@1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz" + integrity sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ== + +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +html-encoding-sniffer@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz" + integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== + dependencies: + whatwg-encoding "^3.1.1" + +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== + dependencies: + agent-base "^7.0.2" + debug "4" + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^8.0.2: + version "8.0.3" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz" + integrity sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^24.0.0: + version "24.0.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz" + integrity sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A== + dependencies: + cssstyle "^4.0.1" + data-urls "^5.0.0" + decimal.js "^10.4.3" + form-data "^4.0.0" + html-encoding-sniffer "^4.0.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.2" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.7" + parse5 "^7.1.2" + rrweb-cssom "^0.6.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.3" + w3c-xmlserializer "^5.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^3.1.1" + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + ws "^8.16.0" + xml-name-validator "^5.0.0" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +jsonc-parser@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz" + integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +local-pkg@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz" + integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== + dependencies: + mlly "^1.4.2" + pkg-types "^1.0.3" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loupe@^2.3.6, loupe@^2.3.7: + version "2.3.7" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +magic-string@^0.30.5: + version "0.30.8" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +match-sorter@^6.0.2: + version "6.3.4" + resolved "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz" + integrity sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg== + dependencies: + "@babel/runtime" "^7.23.8" + remove-accents "0.5.0" + +material-react-table@^1.15.1: + version "1.15.1" + resolved "https://registry.npmjs.org/material-react-table/-/material-react-table-1.15.1.tgz" + integrity sha512-TXidRV7lGtCV5G/ON9Y38TztRcmpKFodFmyTCjvlKXCl5/9X+KY4waP8U0l16FFslg1f7HGWhfkqV5OfUfEIoA== + dependencies: + "@tanstack/match-sorter-utils" "8.8.4" + "@tanstack/react-table" "8.10.7" + "@tanstack/react-virtual" "3.0.0-beta.65" + highlight-words "1.2.2" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +microseconds@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz" + integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +mlly@^1.2.0, mlly@^1.4.2: + version "1.6.1" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz" + integrity sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA== + dependencies: + acorn "^8.11.3" + pathe "^1.1.2" + pkg-types "^1.0.3" + ufo "^1.3.2" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nano-time@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz" + integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== + dependencies: + big-integer "^1.6.16" + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +notistack@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/notistack/-/notistack-3.0.1.tgz" + integrity sha512-ntVZXXgSQH5WYfyU+3HfcXuKaapzAJ8fBLQ/G618rn3yvSzEbnOB8ZSOwhX+dAORy/lw+GC2N061JA0+gYWTVA== + dependencies: + clsx "^1.1.0" + goober "^2.0.33" + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +nwsapi@^2.2.7: + version "2.2.7" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +oblivious-set@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz" + integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz" + integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathe@^1.1.0, pathe@^1.1.1, pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-types@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz" + integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.2.0" + pathe "^1.1.0" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss@^8.4.35: + version "8.4.35" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.0.3: + version "3.2.5" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== + +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-hook-form@^7.47.0: + version "7.51.0" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.0.tgz" + integrity sha512-BggOy5j58RdhdMzzRUHGOYhSz1oeylFAv6jUSG86OvCIvlAvS7KvnRY7yoAf2pfEiPN7BesnR0xx73nEk3qIiw== + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0, react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-query@^3.39.3: + version "3.39.3" + resolved "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz" + integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== + dependencies: + "@babel/runtime" "^7.5.5" + broadcast-channel "^3.4.1" + match-sorter "^6.0.2" + +react-router-dom@^6.22.0: + version "6.22.3" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz" + integrity sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw== + dependencies: + "@remix-run/router" "1.15.3" + react-router "6.22.3" + +react-router@6.22.3: + version "6.22.3" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz" + integrity sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ== + dependencies: + "@remix-run/router" "1.15.3" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.1: + version "1.5.2" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +remove-accents@0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz" + integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== + +remove-accents@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz" + integrity sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.19.0: + version "1.22.8" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@3.0.2, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup@^4.2.0: + version "4.13.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz" + integrity sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.13.0" + "@rollup/rollup-android-arm64" "4.13.0" + "@rollup/rollup-darwin-arm64" "4.13.0" + "@rollup/rollup-darwin-x64" "4.13.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.13.0" + "@rollup/rollup-linux-arm64-gnu" "4.13.0" + "@rollup/rollup-linux-arm64-musl" "4.13.0" + "@rollup/rollup-linux-riscv64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-musl" "4.13.0" + "@rollup/rollup-win32-arm64-msvc" "4.13.0" + "@rollup/rollup-win32-ia32-msvc" "4.13.0" + "@rollup/rollup-win32-x64-msvc" "4.13.0" + fsevents "~2.3.2" + +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^7.5.4: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +snake-case@^3.0.3: + version "3.0.4" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.5.0: + version "3.7.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz" + integrity sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA== + dependencies: + js-tokens "^8.0.2" + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tinybench@^2.5.1: + version "2.6.0" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz" + integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA== + +tinypool@^0.8.2: + version "0.8.2" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz" + integrity sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ== + +tinyspy@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz" + integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz" + integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g== + dependencies: + punycode "^2.3.1" + +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +tsconfck@^3.0.1: + version "3.0.3" + resolved "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.3.tgz" + integrity sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA== + +tslib@^2.0.3, tslib@^2.3.0: + version "2.6.2" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@^4.0.0, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@~5.3.0: + version "5.3.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + +ufo@^1.3.2: + version "1.4.0" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz" + integrity sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +unload@2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz" + integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== + dependencies: + "@babel/runtime" "^7.6.2" + detect-node "^2.0.4" + +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +vite-node@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/vite-node/-/vite-node-1.3.1.tgz" + integrity sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng== + dependencies: + cac "^6.7.14" + debug "^4.3.4" + pathe "^1.1.1" + picocolors "^1.0.0" + vite "^5.0.0" + +vite-tsconfig-paths@^4.2.1: + version "4.3.1" + resolved "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz" + integrity sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw== + dependencies: + debug "^4.1.1" + globrex "^0.1.2" + tsconfck "^3.0.1" + +vite@^5.0.0, vite@^5.0.8: + version "5.1.6" + resolved "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz" + integrity sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA== + dependencies: + esbuild "^0.19.3" + postcss "^8.4.35" + rollup "^4.2.0" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/vitest/-/vitest-1.3.1.tgz" + integrity sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ== + dependencies: + "@vitest/expect" "1.3.1" + "@vitest/runner" "1.3.1" + "@vitest/snapshot" "1.3.1" + "@vitest/spy" "1.3.1" + "@vitest/utils" "1.3.1" + acorn-walk "^8.3.2" + chai "^4.3.10" + debug "^4.3.4" + execa "^8.0.1" + local-pkg "^0.5.0" + magic-string "^0.30.5" + pathe "^1.1.1" + picocolors "^1.0.0" + std-env "^3.5.0" + strip-literal "^2.0.0" + tinybench "^2.5.1" + tinypool "^0.8.2" + vite "^5.0.0" + vite-node "1.3.1" + why-is-node-running "^2.2.2" + +w3c-xmlserializer@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz" + integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== + dependencies: + xml-name-validator "^5.0.0" + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + +whatwg-url@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz" + integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw== + dependencies: + tr46 "^5.0.0" + webidl-conversions "^7.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.13: + version "1.1.15" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +why-is-node-running@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz" + integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.16.0: + version "8.16.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +xml-name-validator@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz" + integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== From 0612fcb05775877b1627961cdb5424f73066160d Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 18 Mar 2024 10:41:39 +0100 Subject: [PATCH 02/74] PMM-11231 Update working directory for node setup --- .github/workflows/ui.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ui.yml b/.github/workflows/ui.yml index 433e824613..6d3868b6e2 100644 --- a/.github/workflows/ui.yml +++ b/.github/workflows/ui.yml @@ -37,7 +37,7 @@ jobs: - name: Setup nodejs uses: actions/setup-node@v4 with: - node-version-file: .nvmrc + node-version-file: /ui/.nvmrc cache: yarn - name: Run lint From bcc34f24e5295ac761ff96578f69a47f12b9bca9 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 18 Mar 2024 10:54:02 +0100 Subject: [PATCH 03/74] PMM-11231 Adjust setup node step --- .github/workflows/ui.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ui.yml b/.github/workflows/ui.yml index 6d3868b6e2..b243ef265e 100644 --- a/.github/workflows/ui.yml +++ b/.github/workflows/ui.yml @@ -37,8 +37,9 @@ jobs: - name: Setup nodejs uses: actions/setup-node@v4 with: - node-version-file: /ui/.nvmrc + node-version-file: ui/.nvmrc cache: yarn + cache-dependency-path: ui - name: Run lint run: | From 6c5c039bea39b607e12dc2c2683bb53242564467 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Fri, 22 Mar 2024 14:22:23 +0100 Subject: [PATCH 04/74] PMM-11231 Add build & cleanup makefile --- build/packages/rpm/server/SPECS/pmm-managed.spec | 6 ++++++ ui/Makefile | 11 +++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/build/packages/rpm/server/SPECS/pmm-managed.spec b/build/packages/rpm/server/SPECS/pmm-managed.spec index b313be8ba8..0a787275a0 100644 --- a/build/packages/rpm/server/SPECS/pmm-managed.spec +++ b/build/packages/rpm/server/SPECS/pmm-managed.spec @@ -42,6 +42,8 @@ export PMM_RELEASE_BRANCH="" cd src/github.com/percona/pmm/managed make release +cd src/github.com/percona/pmm/ui +make release %install install -d -p %{buildroot}%{_bindir} @@ -54,6 +56,7 @@ install -p -m 0755 bin/pmm-managed-starlark %{buildroot}%{_sbindir}/pmm-managed- cd src/github.com/percona/pmm cp -pa ./api/swagger %{buildroot}%{_datadir}/%{name} +cp -pa ./ui/dist %{_datadir}/pmm-ui %files %license src/%{provider}/LICENSE @@ -65,6 +68,9 @@ cp -pa ./api/swagger %{buildroot}%{_datadir}/%{name} %changelog +* Fri Mar 22 2024 Matej Kubinec - 3.0.0-1 +- PMM-10036 migrate to monorepo + * Thu Jul 28 2022 Alex Tymchuk - 2.30.0-1 - PMM-10036 migrate to monorepo diff --git a/ui/Makefile b/ui/Makefile index e361594a5a..568626ebc1 100644 --- a/ui/Makefile +++ b/ui/Makefile @@ -1,29 +1,24 @@ -.PHONY: dev dev: yarn dev -.PHONY: ci ci: setup lint test build -.PHONY: format format: setup yarn format -.PHONY: lints lint: setup yarn lint -.PHONY: test test: setup yarn test -.PHONY: setup setup: yarn install --frozen-lockfile -.PHONY: build build: setup yarn build -.PHONY: release release: build + +clean: + rm -r dist From 4a302de3272c29a500818531e3cf89aa324f6ef8 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Fri, 22 Mar 2024 18:33:40 +0100 Subject: [PATCH 05/74] PMM-11231 Use correct UI directory --- build/packages/rpm/server/SPECS/pmm-managed.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/packages/rpm/server/SPECS/pmm-managed.spec b/build/packages/rpm/server/SPECS/pmm-managed.spec index 0a787275a0..7cd79ba5eb 100644 --- a/build/packages/rpm/server/SPECS/pmm-managed.spec +++ b/build/packages/rpm/server/SPECS/pmm-managed.spec @@ -42,7 +42,7 @@ export PMM_RELEASE_BRANCH="" cd src/github.com/percona/pmm/managed make release -cd src/github.com/percona/pmm/ui +cd ../ui make release %install From 430cf5ecac96376cfeb212062f5bd6d4d6c3c209 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 25 Mar 2024 09:45:51 +0100 Subject: [PATCH 06/74] PMM-11231 Adjust pmm-ui build directory --- build/packages/rpm/server/SPECS/pmm-managed.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/packages/rpm/server/SPECS/pmm-managed.spec b/build/packages/rpm/server/SPECS/pmm-managed.spec index 7cd79ba5eb..ef7bf9bf6a 100644 --- a/build/packages/rpm/server/SPECS/pmm-managed.spec +++ b/build/packages/rpm/server/SPECS/pmm-managed.spec @@ -56,7 +56,7 @@ install -p -m 0755 bin/pmm-managed-starlark %{buildroot}%{_sbindir}/pmm-managed- cd src/github.com/percona/pmm cp -pa ./api/swagger %{buildroot}%{_datadir}/%{name} -cp -pa ./ui/dist %{_datadir}/pmm-ui +cp -pa ./ui/dist %{buildroot}%{_datadir}/pmm-ui %files %license src/%{provider}/LICENSE From 1e0ec32cd7be867e4e2c2f628d279d728c1c9a54 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 25 Mar 2024 13:39:00 +0100 Subject: [PATCH 07/74] PMM-11231 Add install commands --- build/packages/rpm/server/SPECS/pmm-managed.spec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/packages/rpm/server/SPECS/pmm-managed.spec b/build/packages/rpm/server/SPECS/pmm-managed.spec index ef7bf9bf6a..e33d76fb4e 100644 --- a/build/packages/rpm/server/SPECS/pmm-managed.spec +++ b/build/packages/rpm/server/SPECS/pmm-managed.spec @@ -13,7 +13,7 @@ %define full_pmm_version 2.0.0 Name: pmm-managed -Version: %{version} +Version: 0.0.1 Release: %{rpm_release} Summary: Percona Monitoring and Management management daemon @@ -49,13 +49,14 @@ make release install -d -p %{buildroot}%{_bindir} install -d -p %{buildroot}%{_sbindir} install -d -p %{buildroot}%{_datadir}/%{name} +install -d -p %{buildroot}%{_datadir}/pmm-ui +install -d -p %{buildroot}%{_datadir}/pmm-ui/assets install -p -m 0755 bin/pmm-managed %{buildroot}%{_sbindir}/pmm-managed install -p -m 0755 bin/pmm-managed-init %{buildroot}%{_sbindir}/pmm-managed-init install -p -m 0755 bin/pmm-managed-starlark %{buildroot}%{_sbindir}/pmm-managed-starlark cd src/github.com/percona/pmm cp -pa ./api/swagger %{buildroot}%{_datadir}/%{name} - cp -pa ./ui/dist %{buildroot}%{_datadir}/pmm-ui %files From b0039cced1515d92e2f75dd1fd011bc9482a65f2 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 25 Mar 2024 13:59:07 +0100 Subject: [PATCH 08/74] PMM-11231 Add pmm ui directory to files section --- build/packages/rpm/server/SPECS/pmm-managed.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/packages/rpm/server/SPECS/pmm-managed.spec b/build/packages/rpm/server/SPECS/pmm-managed.spec index e33d76fb4e..5b68cd8e6a 100644 --- a/build/packages/rpm/server/SPECS/pmm-managed.spec +++ b/build/packages/rpm/server/SPECS/pmm-managed.spec @@ -66,7 +66,7 @@ cp -pa ./ui/dist %{buildroot}%{_datadir}/pmm-ui %{_sbindir}/pmm-managed-init %{_sbindir}/pmm-managed-starlark %{_datadir}/%{name} - +%{_datadir}/pmm-ui %changelog * Fri Mar 22 2024 Matej Kubinec - 3.0.0-1 From d43c7ac7119256181022ebf019e8c9802dea0554 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 25 Mar 2024 14:20:02 +0100 Subject: [PATCH 09/74] PMM-11231 Copy correct build files --- build/packages/rpm/server/SPECS/pmm-managed.spec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/packages/rpm/server/SPECS/pmm-managed.spec b/build/packages/rpm/server/SPECS/pmm-managed.spec index 5b68cd8e6a..1704f1678f 100644 --- a/build/packages/rpm/server/SPECS/pmm-managed.spec +++ b/build/packages/rpm/server/SPECS/pmm-managed.spec @@ -57,7 +57,7 @@ install -p -m 0755 bin/pmm-managed-starlark %{buildroot}%{_sbindir}/pmm-managed- cd src/github.com/percona/pmm cp -pa ./api/swagger %{buildroot}%{_datadir}/%{name} -cp -pa ./ui/dist %{buildroot}%{_datadir}/pmm-ui +cp -pa ./ui/dist/. %{buildroot}%{_datadir}/pmm-ui %files %license src/%{provider}/LICENSE @@ -67,10 +67,11 @@ cp -pa ./ui/dist %{buildroot}%{_datadir}/pmm-ui %{_sbindir}/pmm-managed-starlark %{_datadir}/%{name} %{_datadir}/pmm-ui +%{_datadir}/pmm-ui/assets %changelog * Fri Mar 22 2024 Matej Kubinec - 3.0.0-1 -- PMM-10036 migrate to monorepo +- PMM-11231 add pmm ui * Thu Jul 28 2022 Alex Tymchuk - 2.30.0-1 - PMM-10036 migrate to monorepo From 056475d76271bf07068d178171dfa24a4266963b Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 13 May 2024 16:17:22 +0200 Subject: [PATCH 10/74] PMM-11231 Handle token rotation --- ui/src/App.tsx | 5 ++- ui/src/api/api.ts | 4 +++ ui/src/api/auth.ts | 7 ++++ ui/src/components/main/Main.test.tsx | 30 ++++++++++++++++++ ui/src/components/main/Main.tsx | 31 ++++++++++++++---- ui/src/contexts/auth/auth.context.tsx | 6 ++++ ui/src/contexts/auth/auth.context.types.ts | 3 ++ ui/src/contexts/auth/auth.hooks.ts | 4 +++ ui/src/contexts/auth/auth.provider.tsx | 30 ++++++++++++++++++ ui/src/contexts/auth/auth.utils.ts | 37 ++++++++++++++++++++++ ui/src/contexts/auth/index.ts | 4 +++ ui/src/utils/testWrapper.tsx | 13 +++++--- 12 files changed, 161 insertions(+), 13 deletions(-) create mode 100644 ui/src/api/auth.ts create mode 100644 ui/src/components/main/Main.test.tsx create mode 100644 ui/src/contexts/auth/auth.context.tsx create mode 100644 ui/src/contexts/auth/auth.context.types.ts create mode 100644 ui/src/contexts/auth/auth.hooks.ts create mode 100644 ui/src/contexts/auth/auth.provider.tsx create mode 100644 ui/src/contexts/auth/auth.utils.ts create mode 100644 ui/src/contexts/auth/index.ts diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 5ab21ae973..80a0b74b00 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -7,6 +7,7 @@ import { ThemeContextProvider } from '@percona/design'; import { NotistackMuiSnackbar } from '@percona/ui-lib'; import { SnackbarProvider } from 'notistack'; import pmmThemeOptions from 'themes/PmmTheme'; +import { AuthProvider } from 'contexts/auth'; const queryClient = new QueryClient({ defaultOptions: { @@ -35,7 +36,9 @@ const App = () => ( }} > - + + + diff --git a/ui/src/api/api.ts b/ui/src/api/api.ts index dcf96a7a3d..5a73176ac0 100644 --- a/ui/src/api/api.ts +++ b/ui/src/api/api.ts @@ -6,3 +6,7 @@ export const api = applyCaseMiddleware( baseURL: '/v1/', }) ); + +export const grafanaApi = axios.create({ + baseURL: '/graph/api/', +}); diff --git a/ui/src/api/auth.ts b/ui/src/api/auth.ts new file mode 100644 index 0000000000..09d7013090 --- /dev/null +++ b/ui/src/api/auth.ts @@ -0,0 +1,7 @@ +import { AxiosResponse } from 'axios'; +import { grafanaApi } from './api'; + +export const rotateToken = async (): Promise => { + const res = await grafanaApi.post('/user/auth-tokens/rotate'); + return res.data; +}; diff --git a/ui/src/components/main/Main.test.tsx b/ui/src/components/main/Main.test.tsx new file mode 100644 index 0000000000..005ce6da2e --- /dev/null +++ b/ui/src/components/main/Main.test.tsx @@ -0,0 +1,30 @@ +import { screen, render } from '@testing-library/react'; +import { AuthContext } from 'contexts/auth/auth.context'; +import { Main } from './Main'; +import { TestWrapper } from 'utils/testWrapper'; + +describe('Main', () => { + it('shows loading', () => { + render( + + +
+ + + ); + + expect(screen.queryByTestId('pmm-loading-indicator')).toBeDefined(); + }); + + it('doesnt show loading', () => { + render( + + +
+ + + ); + + expect(screen.queryByTestId('pmm-loading-indicator')).toBeNull(); + }); +}); diff --git a/ui/src/components/main/Main.tsx b/ui/src/components/main/Main.tsx index 9df7c434de..96e03049dd 100644 --- a/ui/src/components/main/Main.tsx +++ b/ui/src/components/main/Main.tsx @@ -1,10 +1,27 @@ -import { Stack } from '@mui/material'; +import { CircularProgress, Stack } from '@mui/material'; import { Outlet } from 'react-router-dom'; import { AppBar } from '../app-bar/AppBar'; +import { useAuth } from 'contexts/auth'; -export const Main = () => ( - - - - -); +export const Main = () => { + const { isLoading } = useAuth(); + + return ( + + + {isLoading ? ( + + + + ) : ( + + )} + + ); +}; diff --git a/ui/src/contexts/auth/auth.context.tsx b/ui/src/contexts/auth/auth.context.tsx new file mode 100644 index 0000000000..1011970a88 --- /dev/null +++ b/ui/src/contexts/auth/auth.context.tsx @@ -0,0 +1,6 @@ +import { createContext } from 'react'; +import { AuthContextProps } from './auth.context.types'; + +export const AuthContext = createContext({ + isLoading: false, +}); diff --git a/ui/src/contexts/auth/auth.context.types.ts b/ui/src/contexts/auth/auth.context.types.ts new file mode 100644 index 0000000000..3ecf26d6cc --- /dev/null +++ b/ui/src/contexts/auth/auth.context.types.ts @@ -0,0 +1,3 @@ +export interface AuthContextProps { + isLoading: boolean; +} diff --git a/ui/src/contexts/auth/auth.hooks.ts b/ui/src/contexts/auth/auth.hooks.ts new file mode 100644 index 0000000000..52c9d0fd08 --- /dev/null +++ b/ui/src/contexts/auth/auth.hooks.ts @@ -0,0 +1,4 @@ +import { useContext } from 'react'; +import { AuthContext } from './auth.context'; + +export const useAuth = () => useContext(AuthContext); diff --git a/ui/src/contexts/auth/auth.provider.tsx b/ui/src/contexts/auth/auth.provider.tsx new file mode 100644 index 0000000000..c3d56ce7b2 --- /dev/null +++ b/ui/src/contexts/auth/auth.provider.tsx @@ -0,0 +1,30 @@ +import { FC, PropsWithChildren, useEffect } from 'react'; +import { AuthContext } from './auth.context'; +import { useQuery } from 'react-query'; +import { rotateToken } from 'api/auth'; +import { getRefetchInterval, redirectToLogin } from './auth.utils'; +import { AxiosError, HttpStatusCode } from 'axios'; + +export const AuthProvider: FC = ({ children }) => { + const { error, isLoading } = useQuery({ + queryKey: ['rotateToken'], + queryFn: () => rotateToken(), + refetchInterval: () => getRefetchInterval(), + refetchIntervalInBackground: true, + retry: false, + }); + + useEffect(() => { + const response = (error as AxiosError)?.response; + + if (response?.status === HttpStatusCode.Unauthorized) { + redirectToLogin(); + } + }, [error]); + + return ( + + {children} + + ); +}; diff --git a/ui/src/contexts/auth/auth.utils.ts b/ui/src/contexts/auth/auth.utils.ts new file mode 100644 index 0000000000..360cb0f807 --- /dev/null +++ b/ui/src/contexts/auth/auth.utils.ts @@ -0,0 +1,37 @@ +export const getSessionExpiry = () => { + const expiryCookie = getSessionExpiryCookie(); + + if (!expiryCookie) { + return 0; + } + + const expiresStr = expiryCookie.split('=')[1]; + + if (!expiresStr) { + return 0; + } + + return parseInt(expiresStr, 10); +}; + +// based on grafana +export const getRefetchInterval = () => { + // get the time token is going to expire + const expires = getSessionExpiry(); + + // because this job is scheduled for every tab we have open that shares a session we try + // to distribute the scheduling of the job. For now this can be between 1 and 20 seconds + const expiresWithDistribution = + expires - Math.floor(Math.random() * (20 - 1) + 1); + + return expiresWithDistribution * 1000 - Date.now(); +}; + +export const getSessionExpiryCookie = () => + document.cookie + .split('; ') + .find((row) => row.startsWith('grafana_session_expiry=')); + +export const redirectToLogin = () => { + window.location.replace('/graph/login'); +}; diff --git a/ui/src/contexts/auth/index.ts b/ui/src/contexts/auth/index.ts new file mode 100644 index 0000000000..5799945703 --- /dev/null +++ b/ui/src/contexts/auth/index.ts @@ -0,0 +1,4 @@ +export * from './auth.context'; +export * from './auth.provider'; +export * from './auth.context'; +export * from './auth.hooks'; diff --git a/ui/src/utils/testWrapper.tsx b/ui/src/utils/testWrapper.tsx index 5ab8b77412..9a0c0fe885 100644 --- a/ui/src/utils/testWrapper.tsx +++ b/ui/src/utils/testWrapper.tsx @@ -1,12 +1,15 @@ import { ThemeContextProvider } from '@percona/design'; +import { AuthContext } from 'contexts/auth'; import { FC, PropsWithChildren } from 'react'; import { MemoryRouter } from 'react-router-dom'; import pmmThemeOptions from 'themes/PmmTheme'; export const TestWrapper: FC = ({ children }) => ( - - - {children} - - + + + + {children} + + + ); From 9b2e892d2bc8ec2516ff82650966309f506400c0 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 20 May 2024 07:06:13 +0200 Subject: [PATCH 11/74] PMM-11231 Simplify spec file --- build/packages/rpm/server/SPECS/pmm-managed.spec | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build/packages/rpm/server/SPECS/pmm-managed.spec b/build/packages/rpm/server/SPECS/pmm-managed.spec index 1704f1678f..b1da81ea78 100644 --- a/build/packages/rpm/server/SPECS/pmm-managed.spec +++ b/build/packages/rpm/server/SPECS/pmm-managed.spec @@ -13,7 +13,7 @@ %define full_pmm_version 2.0.0 Name: pmm-managed -Version: 0.0.1 +Version: %{version} Release: %{rpm_release} Summary: Percona Monitoring and Management management daemon @@ -50,7 +50,6 @@ install -d -p %{buildroot}%{_bindir} install -d -p %{buildroot}%{_sbindir} install -d -p %{buildroot}%{_datadir}/%{name} install -d -p %{buildroot}%{_datadir}/pmm-ui -install -d -p %{buildroot}%{_datadir}/pmm-ui/assets install -p -m 0755 bin/pmm-managed %{buildroot}%{_sbindir}/pmm-managed install -p -m 0755 bin/pmm-managed-init %{buildroot}%{_sbindir}/pmm-managed-init install -p -m 0755 bin/pmm-managed-starlark %{buildroot}%{_sbindir}/pmm-managed-starlark @@ -67,7 +66,6 @@ cp -pa ./ui/dist/. %{buildroot}%{_datadir}/pmm-ui %{_sbindir}/pmm-managed-starlark %{_datadir}/%{name} %{_datadir}/pmm-ui -%{_datadir}/pmm-ui/assets %changelog * Fri Mar 22 2024 Matej Kubinec - 3.0.0-1 From 5e65f0b94ed61094bee675dd32f74645bebafa90 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 20 May 2024 12:53:45 +0200 Subject: [PATCH 12/74] PMM-11231 Update dependencies --- ui/.nvmrc | 2 +- ui/package.json | 44 +- ui/vite.config.ts | 5 + ui/yarn.lock | 1428 +++++++++++++++++++++------------------------ 4 files changed, 683 insertions(+), 796 deletions(-) diff --git a/ui/.nvmrc b/ui/.nvmrc index e048c8ca19..fb3e6603b5 100644 --- a/ui/.nvmrc +++ b/ui/.nvmrc @@ -1 +1 @@ -v18.15.0 +v18.20.2 diff --git a/ui/package.json b/ui/package.json index 9e81c92fee..83036109e6 100644 --- a/ui/package.json +++ b/ui/package.json @@ -14,41 +14,41 @@ }, "dependencies": { "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.0", - "@mui/icons-material": "^5.15.12", - "@mui/material": "^5.15.12", - "@mui/x-date-pickers": "^6.19.6", + "@emotion/styled": "^11.11.5", + "@mui/icons-material": "^5.15.18", + "@mui/material": "^5.15.18", + "@mui/x-date-pickers": "^7.5.0", "@percona/design": "^1.0.0", "@percona/ui-lib": "^1.0.0", - "axios": "^1.6.7", + "axios": "^1.7.0", "axios-case-converter": "^1.1.1", "date-fns": "^2.30.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-query": "^3.39.3", - "react-router-dom": "^6.22.0" + "react-router-dom": "^6.23.1" }, "devDependencies": { "@percona/eslint-config-react": "^1.0.0", "@percona/prettier-config": "^1.0.0", "@percona/tsconfig": "^1.0.0", - "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react": "^14.2.1", - "@types/react": "^18.2.43", - "@types/react-dom": "^18.2.17", - "@typescript-eslint/eslint-plugin": "^6.14.0", - "@typescript-eslint/parser": "^6.14.0", + "@testing-library/jest-dom": "^6.4.5", + "@testing-library/react": "^15.0.7", + "@types/react": "^18.3.2", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^7.9.0", + "@typescript-eslint/parser": "^7.9.0", "@vitejs/plugin-react-swc": "^3.6.0", - "eslint": "^8.55.0", + "eslint": "^9.3.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.5", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", "jsdom": "^24.0.0", - "prettier": "^3.0.3", - "typescript": "~5.3.0", - "vite": "^5.0.8", - "vite-tsconfig-paths": "^4.2.1", - "vitest": "^1.3.1" + "prettier": "^3.2.5", + "typescript": "^5.4.5", + "vite": "^5.2.11", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^1.6.0" }, "prettier": "@percona/prettier-config" } diff --git a/ui/vite.config.ts b/ui/vite.config.ts index f1b9725d6f..1f039062ea 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -18,5 +18,10 @@ export default defineConfig({ globals: true, environment: 'jsdom', setupFiles: 'src/setupTests.ts', + server: { + deps: { + fallbackCJS: true, + }, + }, }, }); diff --git a/ui/yarn.lock b/ui/yarn.lock index b6b0a9caa9..997a620f1b 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -46,13 +46,20 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.8", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.8", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.24.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz" integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/types@^7.22.15": version "7.24.0" resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz" @@ -95,9 +102,9 @@ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== -"@emotion/is-prop-valid@^1.2.1": +"@emotion/is-prop-valid@^1.2.2": version "1.2.2" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337" integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== dependencies: "@emotion/memoize" "^0.8.1" @@ -132,20 +139,31 @@ "@emotion/utils" "^1.2.1" csstype "^3.0.2" +"@emotion/serialize@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.4.tgz#fc8f6d80c492cfa08801d544a05331d1cc7cd451" + integrity sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + "@emotion/sheet@^1.2.2": version "1.2.2" resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== -"@emotion/styled@^11.11.0": - version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz" - integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== +"@emotion/styled@^11.11.5": + version "11.11.5" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.5.tgz#0c5c8febef9d86e8a926e663b2e5488705545dfb" + integrity sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ== dependencies: "@babel/runtime" "^7.18.3" "@emotion/babel-plugin" "^11.11.0" - "@emotion/is-prop-valid" "^1.2.1" - "@emotion/serialize" "^1.1.2" + "@emotion/is-prop-valid" "^1.2.2" + "@emotion/serialize" "^1.1.4" "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" "@emotion/utils" "^1.2.1" @@ -174,116 +192,231 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz" integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -291,30 +424,30 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": version "4.10.0" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" + espree "^10.0.1" + globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.3.0.tgz#2e8f65c9c55227abc4845b1513c69c32c679d8fe" + integrity sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw== "@floating-ui/core@^1.0.0": version "1.6.0" @@ -353,12 +486,12 @@ resolved "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.12.tgz" integrity sha512-x0o17jvgoSSbS9OZnUX2+xJmVRvVCfeaYJjkS7w62iN7CuJWtMf5vJj8LqgC7ibqIkitOHVW+XssRjgrcHn62g== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -367,10 +500,15 @@ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== "@jest/schemas@^29.6.3": version "29.6.3" @@ -384,42 +522,42 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@mui/base@5.0.0-beta.38", "@mui/base@^5.0.0-beta.22": - version "5.0.0-beta.38" - resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.38.tgz" - integrity sha512-AsjD6Y1X5A1qndxz8xCcR8LDqv31aiwlgWMPxFAX/kCKiIGKlK65yMeVZ62iQr/6LBz+9hSKLiD1i4TZdAHKcQ== +"@mui/base@5.0.0-beta.40", "@mui/base@^5.0.0-beta.40": + version "5.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.40.tgz#1f8a782f1fbf3f84a961e954c8176b187de3dae2" + integrity sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ== dependencies: "@babel/runtime" "^7.23.9" "@floating-ui/react-dom" "^2.0.8" - "@mui/types" "^7.2.13" - "@mui/utils" "^5.15.12" + "@mui/types" "^7.2.14" + "@mui/utils" "^5.15.14" "@popperjs/core" "^2.11.8" clsx "^2.1.0" prop-types "^15.8.1" -"@mui/core-downloads-tracker@^5.15.12": - version "5.15.12" - resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.12.tgz" - integrity sha512-brRO+tMFLpGyjEYHrX97bzqeF6jZmKpqqe1rY0LyIHAwP6xRVzh++zSecOQorDOCaZJg4XkGT9xfD+RWOWxZBA== +"@mui/core-downloads-tracker@^5.15.18": + version "5.15.18" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.18.tgz#0f9426409a82f78423bdf504b2a5a3788656d612" + integrity sha512-/9pVk+Al8qxAjwFUADv4BRZgMpZM4m5E+2Q/20qhVPuIJWqKp4Ie4tGExac6zu93rgPTYVQGgu+1vjiT0E+cEw== -"@mui/icons-material@^5.15.12": - version "5.15.12" - resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.12.tgz" - integrity sha512-3BXiDlOd3AexZoEXa/VqpIpVIvosCzjLHsdMWzKMXbZdnBiJjmb9ECdqfjn5SpTClO49qvkKLhkTqdBH3fSFGw== +"@mui/icons-material@^5.15.18": + version "5.15.18" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.15.18.tgz#51e42958ed671589f7a1af19b59372df884bcd61" + integrity sha512-jGhyw02TSLM0NgW+MDQRLLRUD/K4eN9rlK2pTBTL1OtzyZmQ8nB060zK1wA0b7cVrIiG+zyrRmNAvGWXwm2N9Q== dependencies: "@babel/runtime" "^7.23.9" -"@mui/material@^5.15.12": - version "5.15.12" - resolved "https://registry.npmjs.org/@mui/material/-/material-5.15.12.tgz" - integrity sha512-vXJGg6KNKucsvbW6l7w9zafnpOp0CWc0Wx4mDykuABTpQ5QQBnZxP7+oB4yAS1hDZQ1WobbeIl0CjxK4EEahkA== +"@mui/material@^5.15.18": + version "5.15.18" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.15.18.tgz#1184e88cebb5c58625ca799531c0611c1fd9a2a8" + integrity sha512-n+/dsiqux74fFfcRUJjok+ieNQ7+BEk6/OwX9cLcLvriZrZb+/7Y8+Fd2HlUUbn5N0CDurgAHm0VH1DqyJ9HAw== dependencies: "@babel/runtime" "^7.23.9" - "@mui/base" "5.0.0-beta.38" - "@mui/core-downloads-tracker" "^5.15.12" - "@mui/system" "^5.15.12" - "@mui/types" "^7.2.13" - "@mui/utils" "^5.15.12" + "@mui/base" "5.0.0-beta.40" + "@mui/core-downloads-tracker" "^5.15.18" + "@mui/system" "^5.15.15" + "@mui/types" "^7.2.14" + "@mui/utils" "^5.15.14" "@types/react-transition-group" "^4.4.10" clsx "^2.1.0" csstype "^3.1.3" @@ -427,45 +565,45 @@ react-is "^18.2.0" react-transition-group "^4.4.5" -"@mui/private-theming@^5.15.12": - version "5.15.12" - resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.12.tgz" - integrity sha512-cqoSo9sgA5HE+8vZClbLrq9EkyOnYysooepi5eKaKvJ41lReT2c5wOZAeDDM1+xknrMDos+0mT2zr3sZmUiRRA== +"@mui/private-theming@^5.15.14": + version "5.15.14" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.15.14.tgz#edd9a82948ed01586a01c842eb89f0e3f68970ee" + integrity sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw== dependencies: "@babel/runtime" "^7.23.9" - "@mui/utils" "^5.15.12" + "@mui/utils" "^5.15.14" prop-types "^15.8.1" -"@mui/styled-engine@^5.15.11": - version "5.15.11" - resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.11.tgz" - integrity sha512-So21AhAngqo07ces4S/JpX5UaMU2RHXpEA6hNzI6IQjd/1usMPxpgK8wkGgTe3JKmC2KDmH8cvoycq5H3Ii7/w== +"@mui/styled-engine@^5.15.14": + version "5.15.14" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.15.14.tgz#168b154c4327fa4ccc1933a498331d53f61c0de2" + integrity sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw== dependencies: "@babel/runtime" "^7.23.9" "@emotion/cache" "^11.11.0" csstype "^3.1.3" prop-types "^15.8.1" -"@mui/system@^5.15.12": - version "5.15.12" - resolved "https://registry.npmjs.org/@mui/system/-/system-5.15.12.tgz" - integrity sha512-/pq+GO6yN3X7r3hAwFTrzkAh7K1bTF5r8IzS79B9eyKJg7v6B/t4/zZYMR6OT9qEPtwf6rYN2Utg1e6Z7F1OgQ== +"@mui/system@^5.15.14", "@mui/system@^5.15.15": + version "5.15.15" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.15.15.tgz#658771b200ce3c4a0f28e58169f02e5e718d1c53" + integrity sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ== dependencies: "@babel/runtime" "^7.23.9" - "@mui/private-theming" "^5.15.12" - "@mui/styled-engine" "^5.15.11" - "@mui/types" "^7.2.13" - "@mui/utils" "^5.15.12" + "@mui/private-theming" "^5.15.14" + "@mui/styled-engine" "^5.15.14" + "@mui/types" "^7.2.14" + "@mui/utils" "^5.15.14" clsx "^2.1.0" csstype "^3.1.3" prop-types "^15.8.1" -"@mui/types@^7.2.13": - version "7.2.13" - resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz" - integrity sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g== +"@mui/types@^7.2.14": + version "7.2.14" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.14.tgz#8a02ac129b70f3d82f2f9b76ded2c8d48e3fc8c9" + integrity sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ== -"@mui/utils@^5.14.15", "@mui/utils@^5.14.16", "@mui/utils@^5.15.12": +"@mui/utils@^5.14.15": version "5.15.12" resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.15.12.tgz" integrity sha512-8SDGCnO2DY9Yy+5bGzu00NZowSDtuyHP4H8gunhHGQoIlhlY2Z3w64wBzAOLpYw/ZhJNzksDTnS/i8qdJvxuow== @@ -475,16 +613,27 @@ prop-types "^15.8.1" react-is "^18.2.0" -"@mui/x-date-pickers@^6.19.6": - version "6.19.6" - resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.19.6.tgz" - integrity sha512-QW9AFcPi0vLpkUhmquhhyhLaBvB0AZJuu3NTrE173qNKx3Z3n51aCLY9bc7c6i4ltZMMsVRHlvzQjsve04TC8A== +"@mui/utils@^5.15.14": + version "5.15.14" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.15.14.tgz#e414d7efd5db00bfdc875273a40c0a89112ade3a" + integrity sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA== dependencies: - "@babel/runtime" "^7.23.2" - "@mui/base" "^5.0.0-beta.22" - "@mui/utils" "^5.14.16" - "@types/react-transition-group" "^4.4.8" - clsx "^2.0.0" + "@babel/runtime" "^7.23.9" + "@types/prop-types" "^15.7.11" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/x-date-pickers@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-7.5.0.tgz#3d1ce784079e874196007f853108183a5660a1b8" + integrity sha512-azm9AX36/XzllKtfyHn8u8iYDsxf425/LacP4oVaCeQQgIasajSRFxU/g8vxpNWwgTuzIeWwKjj8cvTc/2UBAw== + dependencies: + "@babel/runtime" "^7.24.5" + "@mui/base" "^5.0.0-beta.40" + "@mui/system" "^5.15.14" + "@mui/utils" "^5.15.14" + "@types/react-transition-group" "^4.4.10" + clsx "^2.1.1" prop-types "^15.8.1" react-transition-group "^4.4.5" @@ -561,76 +710,156 @@ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@remix-run/router@1.15.3": - version "1.15.3" - resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz" - integrity sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w== +"@remix-run/router@1.16.1": + version "1.16.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd" + integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig== "@rollup/rollup-android-arm-eabi@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== +"@rollup/rollup-android-arm-eabi@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d" + integrity sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ== + "@rollup/rollup-android-arm64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== +"@rollup/rollup-android-arm64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz#5aeef206d65ff4db423f3a93f71af91b28662c5b" + integrity sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw== + "@rollup/rollup-darwin-arm64@4.13.0": version "4.13.0" resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz" integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== +"@rollup/rollup-darwin-arm64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz#6b66aaf003c70454c292cd5f0236ebdc6ffbdf1a" + integrity sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw== + "@rollup/rollup-darwin-x64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== +"@rollup/rollup-darwin-x64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz#f64fc51ed12b19f883131ccbcea59fc68cbd6c0b" + integrity sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ== + "@rollup/rollup-linux-arm-gnueabihf@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== +"@rollup/rollup-linux-arm-gnueabihf@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz#1a7641111be67c10111f7122d1e375d1226cbf14" + integrity sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A== + +"@rollup/rollup-linux-arm-musleabihf@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz#c93fd632923e0fee25aacd2ae414288d0b7455bb" + integrity sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg== + "@rollup/rollup-linux-arm64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== +"@rollup/rollup-linux-arm64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz#fa531425dd21d058a630947527b4612d9d0b4a4a" + integrity sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A== + "@rollup/rollup-linux-arm64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== +"@rollup/rollup-linux-arm64-musl@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz#8acc16f095ceea5854caf7b07e73f7d1802ac5af" + integrity sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz#94e69a8499b5cf368911b83a44bb230782aeb571" + integrity sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ== + "@rollup/rollup-linux-riscv64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== +"@rollup/rollup-linux-riscv64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz#7ef1c781c7e59e85a6ce261cc95d7f1e0b56db0f" + integrity sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg== + +"@rollup/rollup-linux-s390x-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz#f15775841c3232fca9b78cd25a7a0512c694b354" + integrity sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g== + "@rollup/rollup-linux-x64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== +"@rollup/rollup-linux-x64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz#b521d271798d037ad70c9f85dd97d25f8a52e811" + integrity sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ== + "@rollup/rollup-linux-x64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== +"@rollup/rollup-linux-x64-musl@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz#9254019cc4baac35800991315d133cc9fd1bf385" + integrity sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q== + "@rollup/rollup-win32-arm64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== +"@rollup/rollup-win32-arm64-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz#27f65a89f6f52ee9426ec11e3571038e4671790f" + integrity sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA== + "@rollup/rollup-win32-ia32-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== +"@rollup/rollup-win32-ia32-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz#a2fbf8246ed0bb014f078ca34ae6b377a90cb411" + integrity sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ== + "@rollup/rollup-win32-x64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== +"@rollup/rollup-win32-x64-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz#5a2d08b81e8064b34242d5cc9973ef8dd1e60503" + integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w== + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" @@ -746,24 +975,24 @@ resolved "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.0.0-beta.65.tgz" integrity sha512-ObP2pvXBdbivinr7BWDbGqYt4TK8wNzYsOWio+qBkDx5AJFuvqcdJxcCCYnv4dzVTe5ELA1MT4tkt8NB/tnEdA== -"@testing-library/dom@^9.0.0": - version "9.3.4" - resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz" - integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ== +"@testing-library/dom@^10.0.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.1.0.tgz#2d073e49771ad614da999ca48f199919e5176fb6" + integrity sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" "@types/aria-query" "^5.0.1" - aria-query "5.1.3" + aria-query "5.3.0" chalk "^4.1.0" dom-accessibility-api "^0.5.9" lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/jest-dom@^6.4.2": - version "6.4.2" - resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz" - integrity sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw== +"@testing-library/jest-dom@^6.4.5": + version "6.4.5" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.5.tgz#badb40296477149136dabef32b572ddd3b56adf1" + integrity sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A== dependencies: "@adobe/css-tools" "^4.3.2" "@babel/runtime" "^7.9.2" @@ -771,16 +1000,16 @@ chalk "^3.0.0" css.escape "^1.5.1" dom-accessibility-api "^0.6.3" - lodash "^4.17.15" + lodash "^4.17.21" redent "^3.0.0" -"@testing-library/react@^14.2.1": - version "14.2.1" - resolved "https://registry.npmjs.org/@testing-library/react/-/react-14.2.1.tgz" - integrity sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A== +"@testing-library/react@^15.0.7": + version "15.0.7" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-15.0.7.tgz#ff733ce0893c875cb5a47672e8e772897128f4ae" + integrity sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q== dependencies: "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^9.0.0" + "@testing-library/dom" "^10.0.0" "@types/react-dom" "^18.0.0" "@types/aria-query@^5.0.1": @@ -793,11 +1022,6 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/json-schema@^7.0.12": - version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - "@types/parse-json@^4.0.0": version "4.0.2" resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" @@ -815,21 +1039,21 @@ dependencies: "@types/react" "*" -"@types/react-dom@^18.2.17": - version "18.2.21" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.21.tgz" - integrity sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw== +"@types/react-dom@^18.3.0": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" -"@types/react-transition-group@^4.4.10", "@types/react-transition-group@^4.4.8": +"@types/react-transition-group@^4.4.10": version "4.4.10" resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz" integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.2.15", "@types/react@^18.2.43": +"@types/react@*", "@types/react@^18.2.15": version "18.2.65" resolved "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz" integrity sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ== @@ -838,106 +1062,99 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^18.3.2": + version "18.3.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" + integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/scheduler@*": version "0.16.8" resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== -"@types/semver@^7.5.0": - version "7.5.8" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@typescript-eslint/eslint-plugin@^6.14.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz" - integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/type-utils" "6.21.0" - "@typescript-eslint/utils" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" +"@typescript-eslint/eslint-plugin@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz#093b96fc4e342226e65d5f18f9c87081e0b04a31" + integrity sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.9.0" + "@typescript-eslint/type-utils" "7.9.0" + "@typescript-eslint/utils" "7.9.0" + "@typescript-eslint/visitor-keys" "7.9.0" graphemer "^1.4.0" - ignore "^5.2.4" + ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/parser@^6.14.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== - dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.9.0.tgz#fb3ba01b75e0e65cb78037a360961b00301f6c70" + integrity sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ== + dependencies: + "@typescript-eslint/scope-manager" "7.9.0" + "@typescript-eslint/types" "7.9.0" + "@typescript-eslint/typescript-estree" "7.9.0" + "@typescript-eslint/visitor-keys" "7.9.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== +"@typescript-eslint/scope-manager@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz#1dd3e63a4411db356a9d040e75864851b5f2619b" + integrity sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ== dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/types" "7.9.0" + "@typescript-eslint/visitor-keys" "7.9.0" -"@typescript-eslint/type-utils@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz" - integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== +"@typescript-eslint/type-utils@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz#f523262e1b66ca65540b7a65a1222db52e0a90c9" + integrity sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA== dependencies: - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/typescript-estree" "7.9.0" + "@typescript-eslint/utils" "7.9.0" debug "^4.3.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== +"@typescript-eslint/types@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.9.0.tgz#b58e485e4bfba055659c7e683ad4f5f0821ae2ec" + integrity sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w== -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== +"@typescript-eslint/typescript-estree@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz#3395e27656060dc313a6b406c3a298b729685e07" + integrity sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg== dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/types" "7.9.0" + "@typescript-eslint/visitor-keys" "7.9.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" -"@typescript-eslint/utils@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz" - integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== +"@typescript-eslint/utils@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.9.0.tgz#1b96a34eefdca1c820cb1bbc2751d848b4540899" + integrity sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== - dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@typescript-eslint/scope-manager" "7.9.0" + "@typescript-eslint/types" "7.9.0" + "@typescript-eslint/typescript-estree" "7.9.0" + +"@typescript-eslint/visitor-keys@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz#82162656e339c3def02895f5c8546f6888d9b9ea" + integrity sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ== + dependencies: + "@typescript-eslint/types" "7.9.0" + eslint-visitor-keys "^3.4.3" "@vitejs/plugin-react-swc@^3.6.0": version "3.6.0" @@ -946,44 +1163,44 @@ dependencies: "@swc/core" "^1.3.107" -"@vitest/expect@1.3.1": - version "1.3.1" - resolved "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz" - integrity sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw== +"@vitest/expect@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.0.tgz#0b3ba0914f738508464983f4d811bc122b51fb30" + integrity sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ== dependencies: - "@vitest/spy" "1.3.1" - "@vitest/utils" "1.3.1" + "@vitest/spy" "1.6.0" + "@vitest/utils" "1.6.0" chai "^4.3.10" -"@vitest/runner@1.3.1": - version "1.3.1" - resolved "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.1.tgz" - integrity sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg== +"@vitest/runner@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.0.tgz#a6de49a96cb33b0e3ba0d9064a3e8d6ce2f08825" + integrity sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg== dependencies: - "@vitest/utils" "1.3.1" + "@vitest/utils" "1.6.0" p-limit "^5.0.0" pathe "^1.1.1" -"@vitest/snapshot@1.3.1": - version "1.3.1" - resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.1.tgz" - integrity sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ== +"@vitest/snapshot@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.0.tgz#deb7e4498a5299c1198136f56e6e0f692e6af470" + integrity sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ== dependencies: magic-string "^0.30.5" pathe "^1.1.1" pretty-format "^29.7.0" -"@vitest/spy@1.3.1": - version "1.3.1" - resolved "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz" - integrity sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig== +"@vitest/spy@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.0.tgz#362cbd42ccdb03f1613798fde99799649516906d" + integrity sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw== dependencies: tinyspy "^2.2.0" -"@vitest/utils@1.3.1": - version "1.3.1" - resolved "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz" - integrity sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ== +"@vitest/utils@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.0.tgz#5c5675ca7d6f546a7b4337de9ae882e6c57896a1" + integrity sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw== dependencies: diff-sequences "^29.6.3" estree-walker "^3.0.3" @@ -1000,7 +1217,7 @@ acorn-walk@^8.3.2: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -acorn@^8.11.3, acorn@^8.9.0: +acorn@^8.11.3: version "8.11.3" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -1051,28 +1268,13 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" - -aria-query@^5.0.0: +aria-query@5.3.0, aria-query@^5.0.0: version "5.3.0" resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" -array-buffer-byte-length@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" @@ -1088,13 +1290,6 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - axios-case-converter@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/axios-case-converter/-/axios-case-converter-1.1.1.tgz" @@ -1105,12 +1300,12 @@ axios-case-converter@^1.1.1: snake-case "^3.0.3" tslib "^2.3.0" -axios@^1.6.7: - version "1.6.7" - resolved "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz" - integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== +axios@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.0.tgz#b48f715325457ededfcb3f0a44a3fb9d5742acb6" + integrity sha512-IiB0wQeKyPRdsFVhBgIo31FbzOyf2M6wYl7/NVutFwFBRMiAbjNiydJIHKeLmPugF4kJLfA1uWZ82Is2QzqqFA== dependencies: - follow-redirects "^1.15.4" + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -1174,17 +1369,6 @@ cac@^6.7.14: resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - callsites@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" @@ -1257,11 +1441,16 @@ clsx@^1.1.0: resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -clsx@^2.0.0, clsx@^2.1.0: +clsx@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz" integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -1374,53 +1563,11 @@ deep-eql@^4.1.3: dependencies: type-detect "^4.0.0" -deep-equal@^2.0.5: - version "2.2.3" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz" - integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.5" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.2" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.13" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" @@ -1448,13 +1595,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - dom-accessibility-api@^0.5.9: version "0.5.16" resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" @@ -1493,33 +1633,6 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - esbuild@^0.19.3: version "0.19.12" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz" @@ -1549,6 +1662,35 @@ esbuild@^0.19.3: "@esbuild/win32-ia32" "0.19.12" "@esbuild/win32-x64" "0.19.12" +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" @@ -1564,64 +1706,65 @@ eslint-config-prettier@^9.1.0: resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== -eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== +eslint-plugin-react-hooks@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== -eslint-plugin-react-refresh@^0.4.5: - version "0.4.5" - resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz" - integrity sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w== +eslint-plugin-react-refresh@^0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz#1f597f9093b254f10ee0961c139a749acb19af7d" + integrity sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw== -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-scope@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc" + integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.55.0: - version "8.57.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + +eslint@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.3.0.tgz#36a96db84592618d6ed9074d677e92f4e58c08b9" + integrity sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.3.0" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" "@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" debug "^4.3.2" - doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" + eslint-scope "^8.0.1" + eslint-visitor-keys "^4.0.0" + espree "^10.0.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" + file-entry-cache "^8.0.0" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" @@ -1631,14 +1774,14 @@ eslint@^8.55.0: strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.0.1.tgz#600e60404157412751ba4a6f3a2ee1a42433139f" + integrity sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww== dependencies: - acorn "^8.9.0" + acorn "^8.11.3" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^4.0.0" esquery@^1.4.2: version "1.5.0" @@ -1719,12 +1862,12 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^3.0.4" + flat-cache "^4.0.0" fill-range@^7.0.1: version "7.0.1" @@ -1746,31 +1889,23 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" + keyv "^4.5.4" flatted@^3.2.9: version "3.3.1" resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -follow-redirects@^1.15.4: - version "1.15.5" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== form-data@^4.0.0: version "4.0.0" @@ -1796,27 +1931,11 @@ function-bind@^1.1.2: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - get-stream@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" @@ -1848,12 +1967,10 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globby@^11.1.0: version "11.1.0" @@ -1877,23 +1994,11 @@ goober@^2.0.33: resolved "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz" integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -has-bigints@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" @@ -1904,30 +2009,6 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - hasown@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" @@ -1990,9 +2071,9 @@ iconv-lite@0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ignore@^5.2.0, ignore@^5.2.4: +ignore@^5.2.0, ignore@^5.3.1: version "5.3.1" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== import-fresh@^3.2.1: @@ -2026,56 +2107,11 @@ inherits@2: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -internal-slot@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - is-core-module@^2.13.0: version "2.13.1" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" @@ -2083,13 +2119,6 @@ is-core-module@^2.13.0: dependencies: hasown "^2.0.0" -is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -2102,18 +2131,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" -is-map@^2.0.2, is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" @@ -2129,63 +2146,11 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.2, is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - is-stream@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -2265,9 +2230,9 @@ jsonc-parser@^3.2.0: resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz" integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== -keyv@^4.5.3: +keyv@^4.5.4: version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + 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" @@ -2305,9 +2270,9 @@ lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.15: +lodash@^4.17.21: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + 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: @@ -2331,13 +2296,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - lz-string@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" @@ -2413,13 +2371,6 @@ min-indent@^1.0.0: resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -2427,6 +2378,13 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + mlly@^1.2.0, mlly@^1.4.2: version "1.6.1" resolved "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz" @@ -2492,34 +2450,6 @@ object-assign@^4.1.1: resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.5" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - oblivious-set@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz" @@ -2663,11 +2593,6 @@ pkg-types@^1.0.3: mlly "^1.2.0" pathe "^1.1.0" -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - postcss@^8.4.35: version "8.4.35" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz" @@ -2677,14 +2602,23 @@ postcss@^8.4.35: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.38: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^3.0.3: +prettier@^3.2.5: version "3.2.5" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== pretty-format@^27.0.2: @@ -2739,13 +2673,13 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== +react-dom@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-hook-form@^7.47.0: version "7.51.0" @@ -2776,20 +2710,20 @@ react-query@^3.39.3: broadcast-channel "^3.4.1" match-sorter "^6.0.2" -react-router-dom@^6.22.0: - version "6.22.3" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz" - integrity sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw== +react-router-dom@^6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f" + integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ== dependencies: - "@remix-run/router" "1.15.3" - react-router "6.22.3" + "@remix-run/router" "1.16.1" + react-router "6.23.1" -react-router@6.22.3: - version "6.22.3" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz" - integrity sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ== +react-router@6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.23.1.tgz#d08cbdbd9d6aedc13eea6e94bc6d9b29cb1c4be9" + integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ== dependencies: - "@remix-run/router" "1.15.3" + "@remix-run/router" "1.16.1" react-transition-group@^4.4.5: version "4.4.5" @@ -2801,10 +2735,10 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== +react@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" @@ -2821,16 +2755,6 @@ regenerator-runtime@^0.14.0: resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regexp.prototype.flags@^1.5.1: - version "1.5.2" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - remove-accents@0.4.2: version "0.4.2" resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz" @@ -2865,13 +2789,38 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@3.0.2, rimraf@^3.0.2: +rimraf@3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" +rollup@^4.13.0: + version "4.17.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f" + integrity sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.17.2" + "@rollup/rollup-android-arm64" "4.17.2" + "@rollup/rollup-darwin-arm64" "4.17.2" + "@rollup/rollup-darwin-x64" "4.17.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.17.2" + "@rollup/rollup-linux-arm-musleabihf" "4.17.2" + "@rollup/rollup-linux-arm64-gnu" "4.17.2" + "@rollup/rollup-linux-arm64-musl" "4.17.2" + "@rollup/rollup-linux-powerpc64le-gnu" "4.17.2" + "@rollup/rollup-linux-riscv64-gnu" "4.17.2" + "@rollup/rollup-linux-s390x-gnu" "4.17.2" + "@rollup/rollup-linux-x64-gnu" "4.17.2" + "@rollup/rollup-linux-x64-musl" "4.17.2" + "@rollup/rollup-win32-arm64-msvc" "4.17.2" + "@rollup/rollup-win32-ia32-msvc" "4.17.2" + "@rollup/rollup-win32-x64-msvc" "4.17.2" + fsevents "~2.3.2" + rollup@^4.2.0: version "4.13.0" resolved "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz" @@ -2918,41 +2867,17 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" -semver@^7.5.4: - version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" +semver@^7.6.0: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== shebang-command@^2.0.0: version "2.0.0" @@ -2966,16 +2891,6 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - siginfo@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" @@ -3004,6 +2919,11 @@ source-map-js@^1.0.2: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + source-map@^0.5.7: version "0.5.7" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" @@ -3019,13 +2939,6 @@ std-env@^3.5.0: resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -3096,10 +3009,10 @@ tinybench@^2.5.1: resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz" integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA== -tinypool@^0.8.2: - version "0.8.2" - resolved "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz" - integrity sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ== +tinypool@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" + integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== tinyspy@^2.2.0: version "2.2.1" @@ -3135,14 +3048,14 @@ tr46@^5.0.0: dependencies: punycode "^2.3.1" -ts-api-utils@^1.0.1: +ts-api-utils@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== -tsconfck@^3.0.1: +tsconfck@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.0.3.tgz#d9bda0e87d05b1c360e996c9050473c7e6f8084f" integrity sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA== tslib@^2.0.3, tslib@^2.3.0: @@ -3162,15 +3075,10 @@ type-detect@^4.0.0, type-detect@^4.0.8: resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typescript@~5.3.0: - version "5.3.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +typescript@^5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== ufo@^1.3.2: version "1.4.0" @@ -3212,10 +3120,10 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -vite-node@1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/vite-node/-/vite-node-1.3.1.tgz" - integrity sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng== +vite-node@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" + integrity sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== dependencies: cac "^6.7.14" debug "^4.3.4" @@ -3223,16 +3131,16 @@ vite-node@1.3.1: picocolors "^1.0.0" vite "^5.0.0" -vite-tsconfig-paths@^4.2.1: - version "4.3.1" - resolved "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz" - integrity sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw== +vite-tsconfig-paths@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz#321f02e4b736a90ff62f9086467faf4e2da857a9" + integrity sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA== dependencies: debug "^4.1.1" globrex "^0.1.2" - tsconfck "^3.0.1" + tsconfck "^3.0.3" -vite@^5.0.0, vite@^5.0.8: +vite@^5.0.0: version "5.1.6" resolved "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz" integrity sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA== @@ -3243,16 +3151,27 @@ vite@^5.0.0, vite@^5.0.8: optionalDependencies: fsevents "~2.3.3" -vitest@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/vitest/-/vitest-1.3.1.tgz" - integrity sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ== +vite@^5.2.11: + version "5.2.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" + integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== dependencies: - "@vitest/expect" "1.3.1" - "@vitest/runner" "1.3.1" - "@vitest/snapshot" "1.3.1" - "@vitest/spy" "1.3.1" - "@vitest/utils" "1.3.1" + esbuild "^0.20.1" + postcss "^8.4.38" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.0.tgz#9d5ad4752a3c451be919e412c597126cffb9892f" + integrity sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA== + dependencies: + "@vitest/expect" "1.6.0" + "@vitest/runner" "1.6.0" + "@vitest/snapshot" "1.6.0" + "@vitest/spy" "1.6.0" + "@vitest/utils" "1.6.0" acorn-walk "^8.3.2" chai "^4.3.10" debug "^4.3.4" @@ -3264,9 +3183,9 @@ vitest@^1.3.1: std-env "^3.5.0" strip-literal "^2.0.0" tinybench "^2.5.1" - tinypool "^0.8.2" + tinypool "^0.8.3" vite "^5.0.0" - vite-node "1.3.1" + vite-node "1.6.0" why-is-node-running "^2.2.2" w3c-xmlserializer@^5.0.0: @@ -3301,38 +3220,6 @@ whatwg-url@^14.0.0: tr46 "^5.0.0" webidl-conversions "^7.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-collection@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.13: - version "1.1.15" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -3368,11 +3255,6 @@ xmlchars@^2.2.0: resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yaml@^1.10.0: version "1.10.2" resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" From 1ff025a874dde6c64aaaf93327b0d0b2cefbb061 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 20 May 2024 13:16:21 +0200 Subject: [PATCH 13/74] PMM-11231 Allow use of eslints non flat config --- ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/package.json b/ui/package.json index 83036109e6..341f67a118 100644 --- a/ui/package.json +++ b/ui/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "lint": "ESLINT_USE_FLAT_CONFIG=false eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "format": "prettier . --write", "preview": "vite preview", "test": "vitest run", From 57a0760a6bad2de3da268925d3f656f5262a4cbd Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 20 May 2024 14:22:07 +0200 Subject: [PATCH 14/74] PMM-11231 Align version fetch logic with previous --- .../pages/updates/update-card/UpdateCard.tsx | 29 ++++++++++++------- .../updates/update-card/UpdateCard.utils.ts | 14 +++++++++ ui/src/types/version.types.ts | 2 +- 3 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 ui/src/pages/updates/update-card/UpdateCard.utils.ts diff --git a/ui/src/pages/updates/update-card/UpdateCard.tsx b/ui/src/pages/updates/update-card/UpdateCard.tsx index 12b7b67362..fda9f05d13 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.tsx +++ b/ui/src/pages/updates/update-card/UpdateCard.tsx @@ -9,18 +9,22 @@ import { Skeleton, Alert, } from '@mui/material'; -import { getCurrentVersion } from 'api/version'; import { FC } from 'react'; import { useQuery } from 'react-query'; import { formatTimestamp } from 'utils/formatTimestamp'; import CachedIcon from '@mui/icons-material/Cached'; import { PMM_HOME_URL } from 'constants'; import { Messages } from './UpdateCard.messages'; +import { getVersion } from './UpdateCard.utils'; + export const UpdateCard: FC = () => { const { isLoading, data, error, isRefetching, refetch } = useQuery( ['currentVersion'], - () => getCurrentVersion() + () => getVersion() ); + const isUpToDate = + (data?.installed.fullVersion || data?.installed.version) === + (data?.latest?.fullVersion || data?.latest?.version); if (isLoading) return ( @@ -47,7 +51,7 @@ export const UpdateCard: FC = () => { return ( - {data.installed.fullVersion === data.latest.fullVersion && ( + {isUpToDate && ( { {Messages.runningVersion} {' '} - {data?.installed.version},{' '} - {formatTimestamp(data?.installed.timestamp)} - - - - {Messages.lastChecked} - {' '} - {formatTimestamp(data?.lastCheck)} + {data?.installed?.version} + {data?.installed.timestamp && + ', ' + formatTimestamp(data.installed.timestamp)} + {data.lastCheck && ( + + + {Messages.lastChecked} + {' '} + {formatTimestamp(data?.lastCheck)} + + )} diff --git a/ui/src/pages/updates/update-card/UpdateCard.utils.ts b/ui/src/pages/updates/update-card/UpdateCard.utils.ts new file mode 100644 index 0000000000..3a2f081110 --- /dev/null +++ b/ui/src/pages/updates/update-card/UpdateCard.utils.ts @@ -0,0 +1,14 @@ +import { getCurrentVersion } from 'api/version'; + +export const getVersion = async () => { + try { + const res = await getCurrentVersion(); + return res; + } catch (error) { + const res = await getCurrentVersion({ + force: false, + onlyInstalledVersion: true, + }); + return res; + } +}; diff --git a/ui/src/types/version.types.ts b/ui/src/types/version.types.ts index e42a841345..2214f6b691 100644 --- a/ui/src/types/version.types.ts +++ b/ui/src/types/version.types.ts @@ -5,7 +5,7 @@ export interface GetUpdatesBody { export interface GetUpdatesResponse { lastCheck: string; - latest: { + latest?: { fullVersion: string; timestamp: string; version: string; From b5fe26a69eb50ce58c7078217a37a9842ab272ac Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Mon, 20 May 2024 15:04:55 +0200 Subject: [PATCH 15/74] PMM-11231 Refactor fetching icon --- .../components/fetching-icon/FetchingIcon.tsx | 23 +++++++++++++++++++ .../fetching-icon/FetchingIcon.types.ts | 3 +++ ui/src/components/fetching-icon/index.ts | 1 + .../pages/updates/update-card/UpdateCard.tsx | 22 ++---------------- 4 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 ui/src/components/fetching-icon/FetchingIcon.tsx create mode 100644 ui/src/components/fetching-icon/FetchingIcon.types.ts create mode 100644 ui/src/components/fetching-icon/index.ts diff --git a/ui/src/components/fetching-icon/FetchingIcon.tsx b/ui/src/components/fetching-icon/FetchingIcon.tsx new file mode 100644 index 0000000000..0d12db3d98 --- /dev/null +++ b/ui/src/components/fetching-icon/FetchingIcon.tsx @@ -0,0 +1,23 @@ +import { FC } from 'react'; +import CachedIcon from '@mui/icons-material/Cached'; +import { FetchingIconProps } from './FetchingIcon.types'; + +export const FetchingIcon: FC = ({ isFetching }) => ( + +); diff --git a/ui/src/components/fetching-icon/FetchingIcon.types.ts b/ui/src/components/fetching-icon/FetchingIcon.types.ts new file mode 100644 index 0000000000..f437864382 --- /dev/null +++ b/ui/src/components/fetching-icon/FetchingIcon.types.ts @@ -0,0 +1,3 @@ +export interface FetchingIconProps { + isFetching?: boolean; +} diff --git a/ui/src/components/fetching-icon/index.ts b/ui/src/components/fetching-icon/index.ts new file mode 100644 index 0000000000..432b3dd4f9 --- /dev/null +++ b/ui/src/components/fetching-icon/index.ts @@ -0,0 +1 @@ +export { FetchingIcon } from './FetchingIcon'; diff --git a/ui/src/pages/updates/update-card/UpdateCard.tsx b/ui/src/pages/updates/update-card/UpdateCard.tsx index fda9f05d13..6e4ea4d81f 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.tsx +++ b/ui/src/pages/updates/update-card/UpdateCard.tsx @@ -12,10 +12,10 @@ import { import { FC } from 'react'; import { useQuery } from 'react-query'; import { formatTimestamp } from 'utils/formatTimestamp'; -import CachedIcon from '@mui/icons-material/Cached'; import { PMM_HOME_URL } from 'constants'; import { Messages } from './UpdateCard.messages'; import { getVersion } from './UpdateCard.utils'; +import { FetchingIcon } from 'components/fetching-icon'; export const UpdateCard: FC = () => { const { isLoading, data, error, isRefetching, refetch } = useQuery( @@ -82,25 +82,7 @@ export const UpdateCard: FC = () => { - - - - + {data.updateAvailable ? ( + + + + ) : ( + + + + + + + )} ); }; diff --git a/ui/src/pages/updates/update-card/UpdateCard.utils.ts b/ui/src/pages/updates/update-card/UpdateCard.utils.ts index 3a2f081110..be244db19f 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.utils.ts +++ b/ui/src/pages/updates/update-card/UpdateCard.utils.ts @@ -1,14 +1,5 @@ -import { getCurrentVersion } from 'api/version'; +import { VersionInfo } from 'types/version.types'; +import { formatTimestamp } from 'utils/formatTimestamp'; -export const getVersion = async () => { - try { - const res = await getCurrentVersion(); - return res; - } catch (error) { - const res = await getCurrentVersion({ - force: false, - onlyInstalledVersion: true, - }); - return res; - } -}; +export const formatVersion = ({ version, timestamp }: VersionInfo) => + ` ${version}` + (!!timestamp ? `, ${formatTimestamp(timestamp)}` : ''); diff --git a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.messages.ts b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.messages.ts new file mode 100644 index 0000000000..e064ace704 --- /dev/null +++ b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.messages.ts @@ -0,0 +1,4 @@ +export const Messages = { + title: (version: string) => `PMM ${version} update`, + updating: 'Updating...', +}; diff --git a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.tsx b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.tsx new file mode 100644 index 0000000000..6ade670722 --- /dev/null +++ b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.tsx @@ -0,0 +1,53 @@ +import { FC } from 'react'; +import { + Card, + CardContent, + Stack, + Typography, + LinearProgress, + Chip, +} from '@mui/material'; +import { UpdateInfo } from '../update-info'; +import { UpdateInProgressCardProps } from './UpdateInProgressCard.types'; +import { Messages } from './UpdateInProgressCard.messages'; + +export const UpdateInProgressCard: FC = ({ + versionInfo, +}) => ( + + + + + + + {versionInfo.version && Messages.title(versionInfo.version)} + + + + + + + + {Messages.updating} + + + + + + +); diff --git a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx new file mode 100644 index 0000000000..fbc52d7c23 --- /dev/null +++ b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx @@ -0,0 +1,5 @@ +import { VersionInfo } from 'types/version.types'; + +export interface UpdateInProgressCardProps { + versionInfo: VersionInfo; +} diff --git a/ui/src/pages/updates/update-in-progress-card/index.ts b/ui/src/pages/updates/update-in-progress-card/index.ts new file mode 100644 index 0000000000..a4bf520d78 --- /dev/null +++ b/ui/src/pages/updates/update-in-progress-card/index.ts @@ -0,0 +1 @@ +export * from './UpdateInProgressCard'; diff --git a/ui/src/pages/updates/update-info/UpdateInfo.messages.ts b/ui/src/pages/updates/update-info/UpdateInfo.messages.ts new file mode 100644 index 0000000000..6abbd29399 --- /dev/null +++ b/ui/src/pages/updates/update-info/UpdateInfo.messages.ts @@ -0,0 +1,9 @@ +export const Messages = { + title: 'Step 1 of 2: Update PMM Server', + upgrading: + 'Upgrading will pause, update, and subsequently restart PMM. While this occurs, data observation will be temporarily halted but will promtly resume, ensuring all peding data from PMM Clients is recovered.', + readMore: 'Read more', + whatsNext: "What's next", + afterCompleting: + 'After completing the full update of the PMM Server to the latest version, the next step is to manually update all PMM Client instances.', +}; diff --git a/ui/src/pages/updates/update-info/UpdateInfo.tsx b/ui/src/pages/updates/update-info/UpdateInfo.tsx new file mode 100644 index 0000000000..ca26ea4d61 --- /dev/null +++ b/ui/src/pages/updates/update-info/UpdateInfo.tsx @@ -0,0 +1,23 @@ +import { Link, Stack, Typography } from '@mui/material'; +import { FC } from 'react'; +import { Messages } from './UpdateInfo.messages'; + +export const UpdateInfo: FC = () => ( + + {Messages.title} + + {Messages.upgrading} +
+ {Messages.readMore} +
+ + {Messages.whatsNext} + + {Messages.afterCompleting} +
+); diff --git a/ui/src/pages/updates/update-info/index.ts b/ui/src/pages/updates/update-info/index.ts new file mode 100644 index 0000000000..222da40a91 --- /dev/null +++ b/ui/src/pages/updates/update-info/index.ts @@ -0,0 +1 @@ +export * from './UpdateInfo'; diff --git a/ui/src/types/version.types.ts b/ui/src/types/version.types.ts index 2214f6b691..3ba9e1c72c 100644 --- a/ui/src/types/version.types.ts +++ b/ui/src/types/version.types.ts @@ -3,22 +3,25 @@ export interface GetUpdatesBody { onlyInstalledVersion?: boolean; } +export interface VersionInfo { + fullVersion?: string; + timestamp?: string; + version?: string; + tag?: string; +} + export interface GetUpdatesResponse { lastCheck: string; - latest?: { - fullVersion: string; - timestamp: string; - version: string; - }; - installed: { - fullVersion: string; - timestamp: string; - version: string; - }; + latest?: VersionInfo; + installed: VersionInfo; latestNewsUrl?: string; updateAvailable?: boolean; } +export interface StartUpdateBody { + newImage?: string; +} + export interface StartUpdateResponse { authToken: string; logOffset: number; diff --git a/ui/yarn.lock b/ui/yarn.lock index 997a620f1b..ae0c1e8334 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -46,7 +46,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.8", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.24.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz" integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== @@ -951,6 +951,18 @@ dependencies: remove-accents "0.4.2" +"@tanstack/query-core@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.45.0.tgz#47a662d311c2588867341238960ec21dc7f0714e" + integrity sha512-RVfIZQmFUTdjhSAAblvueimfngYyfN6HlwaJUPK71PKd7yi43Vs1S/rdimmZedPWX/WGppcq/U1HOj7O7FwYxw== + +"@tanstack/react-query@^5.45.1": + version "5.45.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.45.1.tgz#a0ac6bb89b4a2c2b0251f6647a0a370d86f05347" + integrity sha512-mYYfJujKg2kxmkRRjA6nn4YKG3ITsKuH22f1kteJ5IuVQqgKUgbaSQfYwVP0gBS05mhwxO03HVpD0t7BMN7WOA== + dependencies: + "@tanstack/query-core" "5.45.0" + "@tanstack/react-table@8.10.7": version "8.10.7" resolved "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.7.tgz" @@ -1323,11 +1335,6 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -big-integer@^1.6.16: - version "1.6.52" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz" - integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -1350,20 +1357,6 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -broadcast-channel@^3.4.1: - version "3.7.0" - resolved "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz" - integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== - dependencies: - "@babel/runtime" "^7.7.2" - detect-node "^2.1.0" - js-sha3 "0.8.0" - microseconds "0.2.0" - nano-time "1.0.0" - oblivious-set "1.0.0" - rimraf "3.0.2" - unload "2.2.0" - cac@^6.7.14: version "6.7.14" resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" @@ -1578,11 +1571,6 @@ dequal@^2.0.3: resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-node@^2.0.4, detect-node@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" @@ -1916,11 +1904,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" @@ -1955,18 +1938,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - globals@^14.0.0: version "14.0.0" resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" @@ -2094,19 +2065,6 @@ indent-string@^4.0.0: resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" @@ -2156,11 +2114,6 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" @@ -2308,14 +2261,6 @@ magic-string@^0.30.5: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" -match-sorter@^6.0.2: - version "6.3.4" - resolved "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz" - integrity sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg== - dependencies: - "@babel/runtime" "^7.23.8" - remove-accents "0.5.0" - material-react-table@^1.15.1: version "1.15.1" resolved "https://registry.npmjs.org/material-react-table/-/material-react-table-1.15.1.tgz" @@ -2344,11 +2289,6 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -microseconds@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz" - integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== - mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" @@ -2371,7 +2311,7 @@ min-indent@^1.0.0: resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.5, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -2400,13 +2340,6 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nano-time@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz" - integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== - dependencies: - big-integer "^1.6.16" - nanoid@^3.3.7: version "3.3.7" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" @@ -2450,18 +2383,6 @@ object-assign@^4.1.1: resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -oblivious-set@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz" - integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - onetime@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" @@ -2539,11 +2460,6 @@ path-exists@^4.0.0: resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" @@ -2701,15 +2617,6 @@ react-is@^18.0.0, react-is@^18.2.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-query@^3.39.3: - version "3.39.3" - resolved "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz" - integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== - dependencies: - "@babel/runtime" "^7.5.5" - broadcast-channel "^3.4.1" - match-sorter "^6.0.2" - react-router-dom@^6.23.1: version "6.23.1" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f" @@ -2760,11 +2667,6 @@ remove-accents@0.4.2: resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz" integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== -remove-accents@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz" - integrity sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" @@ -2789,13 +2691,6 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rollup@^4.13.0: version "4.17.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f" @@ -3090,14 +2985,6 @@ universalify@^0.2.0: resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== -unload@2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz" - integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== - dependencies: - "@babel/runtime" "^7.6.2" - detect-node "^2.0.4" - upper-case-first@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" @@ -3235,11 +3122,6 @@ why-is-node-running@^2.2.2: siginfo "^2.0.0" stackback "0.0.2" -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - ws@^8.16.0: version "8.16.0" resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz" From a6256130a256805e896e711de5004121f6b75954 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 18 Jun 2024 09:45:09 +0200 Subject: [PATCH 20/74] PMM-11231 Switch to tanstack query --- ui/package.json | 2 +- ui/src/App.tsx | 2 +- ui/src/contexts/auth/auth.provider.tsx | 2 +- .../pages/updates/update-card/UpdateCard.tsx | 10 +- ui/yarn.lock | 146 ++---------------- 5 files changed, 22 insertions(+), 140 deletions(-) diff --git a/ui/package.json b/ui/package.json index 341f67a118..29e4248d44 100644 --- a/ui/package.json +++ b/ui/package.json @@ -20,12 +20,12 @@ "@mui/x-date-pickers": "^7.5.0", "@percona/design": "^1.0.0", "@percona/ui-lib": "^1.0.0", + "@tanstack/react-query": "^5.45.1", "axios": "^1.7.0", "axios-case-converter": "^1.1.1", "date-fns": "^2.30.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-query": "^3.39.3", "react-router-dom": "^6.23.1" }, "devDependencies": { diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 80a0b74b00..4b06d8641f 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -1,6 +1,6 @@ import { LocalizationProvider } from '@mui/x-date-pickers'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; -import { QueryClient, QueryClientProvider } from 'react-query'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { RouterProvider } from 'react-router-dom'; import router from './router'; import { ThemeContextProvider } from '@percona/design'; diff --git a/ui/src/contexts/auth/auth.provider.tsx b/ui/src/contexts/auth/auth.provider.tsx index c3d56ce7b2..be86801383 100644 --- a/ui/src/contexts/auth/auth.provider.tsx +++ b/ui/src/contexts/auth/auth.provider.tsx @@ -1,6 +1,6 @@ import { FC, PropsWithChildren, useEffect } from 'react'; import { AuthContext } from './auth.context'; -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { rotateToken } from 'api/auth'; import { getRefetchInterval, redirectToLogin } from './auth.utils'; import { AxiosError, HttpStatusCode } from 'axios'; diff --git a/ui/src/pages/updates/update-card/UpdateCard.tsx b/ui/src/pages/updates/update-card/UpdateCard.tsx index 6e4ea4d81f..4378035010 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.tsx +++ b/ui/src/pages/updates/update-card/UpdateCard.tsx @@ -10,7 +10,7 @@ import { Alert, } from '@mui/material'; import { FC } from 'react'; -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { formatTimestamp } from 'utils/formatTimestamp'; import { PMM_HOME_URL } from 'constants'; import { Messages } from './UpdateCard.messages'; @@ -18,10 +18,10 @@ import { getVersion } from './UpdateCard.utils'; import { FetchingIcon } from 'components/fetching-icon'; export const UpdateCard: FC = () => { - const { isLoading, data, error, isRefetching, refetch } = useQuery( - ['currentVersion'], - () => getVersion() - ); + const { isLoading, data, error, isRefetching, refetch } = useQuery({ + queryKey: ['currentVersion'], + queryFn: () => getVersion(), + }); const isUpToDate = (data?.installed.fullVersion || data?.installed.version) === (data?.latest?.fullVersion || data?.latest?.version); diff --git a/ui/yarn.lock b/ui/yarn.lock index 997a620f1b..ae0c1e8334 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -46,7 +46,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.8", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.24.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz" integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== @@ -951,6 +951,18 @@ dependencies: remove-accents "0.4.2" +"@tanstack/query-core@5.45.0": + version "5.45.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.45.0.tgz#47a662d311c2588867341238960ec21dc7f0714e" + integrity sha512-RVfIZQmFUTdjhSAAblvueimfngYyfN6HlwaJUPK71PKd7yi43Vs1S/rdimmZedPWX/WGppcq/U1HOj7O7FwYxw== + +"@tanstack/react-query@^5.45.1": + version "5.45.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.45.1.tgz#a0ac6bb89b4a2c2b0251f6647a0a370d86f05347" + integrity sha512-mYYfJujKg2kxmkRRjA6nn4YKG3ITsKuH22f1kteJ5IuVQqgKUgbaSQfYwVP0gBS05mhwxO03HVpD0t7BMN7WOA== + dependencies: + "@tanstack/query-core" "5.45.0" + "@tanstack/react-table@8.10.7": version "8.10.7" resolved "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.7.tgz" @@ -1323,11 +1335,6 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -big-integer@^1.6.16: - version "1.6.52" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz" - integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -1350,20 +1357,6 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -broadcast-channel@^3.4.1: - version "3.7.0" - resolved "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz" - integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== - dependencies: - "@babel/runtime" "^7.7.2" - detect-node "^2.1.0" - js-sha3 "0.8.0" - microseconds "0.2.0" - nano-time "1.0.0" - oblivious-set "1.0.0" - rimraf "3.0.2" - unload "2.2.0" - cac@^6.7.14: version "6.7.14" resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" @@ -1578,11 +1571,6 @@ dequal@^2.0.3: resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-node@^2.0.4, detect-node@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" @@ -1916,11 +1904,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" @@ -1955,18 +1938,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - globals@^14.0.0: version "14.0.0" resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" @@ -2094,19 +2065,6 @@ indent-string@^4.0.0: resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" @@ -2156,11 +2114,6 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" @@ -2308,14 +2261,6 @@ magic-string@^0.30.5: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" -match-sorter@^6.0.2: - version "6.3.4" - resolved "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz" - integrity sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg== - dependencies: - "@babel/runtime" "^7.23.8" - remove-accents "0.5.0" - material-react-table@^1.15.1: version "1.15.1" resolved "https://registry.npmjs.org/material-react-table/-/material-react-table-1.15.1.tgz" @@ -2344,11 +2289,6 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -microseconds@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz" - integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== - mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" @@ -2371,7 +2311,7 @@ min-indent@^1.0.0: resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.5, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -2400,13 +2340,6 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nano-time@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz" - integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== - dependencies: - big-integer "^1.6.16" - nanoid@^3.3.7: version "3.3.7" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" @@ -2450,18 +2383,6 @@ object-assign@^4.1.1: resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -oblivious-set@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz" - integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - onetime@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" @@ -2539,11 +2460,6 @@ path-exists@^4.0.0: resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" @@ -2701,15 +2617,6 @@ react-is@^18.0.0, react-is@^18.2.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-query@^3.39.3: - version "3.39.3" - resolved "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz" - integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== - dependencies: - "@babel/runtime" "^7.5.5" - broadcast-channel "^3.4.1" - match-sorter "^6.0.2" - react-router-dom@^6.23.1: version "6.23.1" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f" @@ -2760,11 +2667,6 @@ remove-accents@0.4.2: resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz" integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== -remove-accents@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz" - integrity sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" @@ -2789,13 +2691,6 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rollup@^4.13.0: version "4.17.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f" @@ -3090,14 +2985,6 @@ universalify@^0.2.0: resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== -unload@2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz" - integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== - dependencies: - "@babel/runtime" "^7.6.2" - detect-node "^2.0.4" - upper-case-first@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" @@ -3235,11 +3122,6 @@ why-is-node-running@^2.2.2: siginfo "^2.0.0" stackback "0.0.2" -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - ws@^8.16.0: version "8.16.0" resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz" From 57a647a515bba1a9ce29daf5e76d837396ba3af4 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 18 Jun 2024 09:55:27 +0200 Subject: [PATCH 21/74] PMM-12930 Fix lint --- ui/src/pages/updates/update-card/UpdateCard.utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/pages/updates/update-card/UpdateCard.utils.ts b/ui/src/pages/updates/update-card/UpdateCard.utils.ts index be244db19f..2b99b98e39 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.utils.ts +++ b/ui/src/pages/updates/update-card/UpdateCard.utils.ts @@ -2,4 +2,4 @@ import { VersionInfo } from 'types/version.types'; import { formatTimestamp } from 'utils/formatTimestamp'; export const formatVersion = ({ version, timestamp }: VersionInfo) => - ` ${version}` + (!!timestamp ? `, ${formatTimestamp(timestamp)}` : ''); + ` ${version}` + (timestamp ? `, ${formatTimestamp(timestamp)}` : ''); From ff0388a4d6b73b423c7953fc273652faa62c8f1f Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Fri, 28 Jun 2024 09:36:58 +0200 Subject: [PATCH 22/74] PMM-11231 Update dev configuration --- ui/docker-compose.yml | 20 ++++++++++++++++++++ ui/vite.config.ts | 4 ++++ 2 files changed, 24 insertions(+) diff --git a/ui/docker-compose.yml b/ui/docker-compose.yml index 8b34c6aa80..8126a0fda8 100644 --- a/ui/docker-compose.yml +++ b/ui/docker-compose.yml @@ -10,6 +10,8 @@ services: - 443:8443 volumes: - ./pmm-dev.conf:/etc/nginx/conf.d/pmm-dev.conf:ro + # Uncomment to persist pmm state + # - pmm-data:/srv # Uncomment to use custom (FE) grafana code #- '../../grafana/public:/usr/share/grafana/public' @@ -19,6 +21,10 @@ services: - PERCONA_PORTAL_URL=https://portal-dev.percona.com - PMM_DEV_PERCONA_PLATFORM_ADDRESS=https://check-dev.percona.com:443 - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY=RWTkF7Snv08FCboTne4djQfN5qbrLfAjb8SY3/wwEP+X5nUrkxCEvUDJ + - PMM_WATCHTOWER_HOST=http://watchtower:8080 + - PMM_WATCHTOWER_TOKEN=123 + # Uncomment to specify to which docker image to update + # - PMM_DEV_UPDATE_DOCKER_IMAGE=${PMM_SERVER_IMAGE:-perconalab/pmm-server:3-dev-container} mysql: image: percona:5.7.30 @@ -37,3 +43,17 @@ services: - UMASK=0777 # for slowlog file volumes: - ./testdata/mysql:/mysql + + watchtower: + container_name: watchtower + platform: linux/amd64 + image: perconalab/watchtower + hostname: watchtower + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - WATCHTOWER_HTTP_API_UPDATE=1 + - WATCHTOWER_HTTP_API_TOKEN=123 + +volumes: + pmm-data: diff --git a/ui/vite.config.ts b/ui/vite.config.ts index abc1f8aa1f..b4415f40cf 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -13,6 +13,10 @@ export default defineConfig({ }, }, host: '0.0.0.0', + strictPort: true, + hmr: { + clientPort: 5173, + }, }, test: { globals: true, From ae5d5d8c758d9cbc0be4eccd78cd0ef37f2249c1 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Fri, 28 Jun 2024 09:37:44 +0200 Subject: [PATCH 23/74] PMM-11231 Use correct naming & switch to hooks --- ui/src/api/{version.ts => updates.ts} | 4 ++-- ui/src/hooks/api/useUpdates.tsx | 17 +++++++++++++ .../pages/updates/update-card/UpdateCard.tsx | 24 ++++++++----------- .../updates/update-card/UpdateCard.utils.ts | 21 ++++++++-------- .../{version.types.ts => updates.types.ts} | 18 +++++++------- 5 files changed, 47 insertions(+), 37 deletions(-) rename ui/src/api/{version.ts => updates.ts} (91%) create mode 100644 ui/src/hooks/api/useUpdates.tsx rename ui/src/types/{version.types.ts => updates.types.ts} (73%) diff --git a/ui/src/api/version.ts b/ui/src/api/updates.ts similarity index 91% rename from ui/src/api/version.ts rename to ui/src/api/updates.ts index 05d52a9d53..d3fc3fb55f 100644 --- a/ui/src/api/version.ts +++ b/ui/src/api/updates.ts @@ -5,10 +5,10 @@ import { GetUpdatesBody, GetUpdatesResponse, StartUpdateResponse, -} from 'types/version.types'; +} from 'types/updates.types'; import { api } from './api'; -export const getCurrentVersion = async ( +export const checkForUpdates = async ( body: GetUpdatesBody = { force: false } ) => { const res = await api.post>( diff --git a/ui/src/hooks/api/useUpdates.tsx b/ui/src/hooks/api/useUpdates.tsx new file mode 100644 index 0000000000..62634002eb --- /dev/null +++ b/ui/src/hooks/api/useUpdates.tsx @@ -0,0 +1,17 @@ +import { checkForUpdates } from 'api/updates'; +import { useQuery } from '@tanstack/react-query'; + +export const useCheckUpdates = () => + useQuery({ + queryKey: ['checkUpdates'], + queryFn: async () => { + try { + return await checkForUpdates(); + } catch (error) { + return await checkForUpdates({ + force: false, + onlyInstalledVersion: true, + }); + } + }, + }); diff --git a/ui/src/pages/updates/update-card/UpdateCard.tsx b/ui/src/pages/updates/update-card/UpdateCard.tsx index 4378035010..8b33668d5b 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.tsx +++ b/ui/src/pages/updates/update-card/UpdateCard.tsx @@ -9,22 +9,20 @@ import { Skeleton, Alert, } from '@mui/material'; -import { FC } from 'react'; -import { useQuery } from '@tanstack/react-query'; +import { FC, useMemo } from 'react'; import { formatTimestamp } from 'utils/formatTimestamp'; import { PMM_HOME_URL } from 'constants'; import { Messages } from './UpdateCard.messages'; -import { getVersion } from './UpdateCard.utils'; import { FetchingIcon } from 'components/fetching-icon'; +import { useCheckUpdates } from 'hooks/api/useUpdates'; +import { formatVersion } from './UpdateCard.utils'; export const UpdateCard: FC = () => { - const { isLoading, data, error, isRefetching, refetch } = useQuery({ - queryKey: ['currentVersion'], - queryFn: () => getVersion(), - }); - const isUpToDate = - (data?.installed.fullVersion || data?.installed.version) === - (data?.latest?.fullVersion || data?.latest?.version); + const { isLoading, data, error, isRefetching, refetch } = useCheckUpdates(); + const isUpToDate = useMemo( + () => data?.installed.version === data?.latest?.version, + [data] + ); if (isLoading) return ( @@ -65,10 +63,8 @@ export const UpdateCard: FC = () => { {Messages.runningVersion} - {' '} - {data?.installed?.version} - {data?.installed.timestamp && - ', ' + formatTimestamp(data.installed.timestamp)} + + {data?.installed && formatVersion(data.installed)} {data.lastCheck && ( diff --git a/ui/src/pages/updates/update-card/UpdateCard.utils.ts b/ui/src/pages/updates/update-card/UpdateCard.utils.ts index 3a2f081110..1777b462d0 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.utils.ts +++ b/ui/src/pages/updates/update-card/UpdateCard.utils.ts @@ -1,14 +1,13 @@ -import { getCurrentVersion } from 'api/version'; +import { VersionInfo } from 'types/updates.types'; +import { formatTimestamp } from 'utils/formatTimestamp'; -export const getVersion = async () => { - try { - const res = await getCurrentVersion(); - return res; - } catch (error) { - const res = await getCurrentVersion({ - force: false, - onlyInstalledVersion: true, - }); - return res; +export const formatVersion = ({ version, timestamp, tag }: VersionInfo) => { + const text = + ` ${version}` + (timestamp ? `, ${formatTimestamp(timestamp)}` : ''); + + if (version === '0.0.0') { + return `${text}, ${tag}`; } + + return text; }; diff --git a/ui/src/types/version.types.ts b/ui/src/types/updates.types.ts similarity index 73% rename from ui/src/types/version.types.ts rename to ui/src/types/updates.types.ts index 2214f6b691..9eca20def7 100644 --- a/ui/src/types/version.types.ts +++ b/ui/src/types/updates.types.ts @@ -3,18 +3,16 @@ export interface GetUpdatesBody { onlyInstalledVersion?: boolean; } +export interface VersionInfo { + timestamp?: string; + version?: string; + tag?: string; +} + export interface GetUpdatesResponse { lastCheck: string; - latest?: { - fullVersion: string; - timestamp: string; - version: string; - }; - installed: { - fullVersion: string; - timestamp: string; - version: string; - }; + latest?: VersionInfo; + installed: VersionInfo; latestNewsUrl?: string; updateAvailable?: boolean; } From d40c2ed3c642359fbc70a0f48c38774929762eac Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Fri, 28 Jun 2024 09:48:28 +0200 Subject: [PATCH 24/74] PMM-11231 Use different name for update image --- ui/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/docker-compose.yml b/ui/docker-compose.yml index 8126a0fda8..fe794fd345 100644 --- a/ui/docker-compose.yml +++ b/ui/docker-compose.yml @@ -24,7 +24,7 @@ services: - PMM_WATCHTOWER_HOST=http://watchtower:8080 - PMM_WATCHTOWER_TOKEN=123 # Uncomment to specify to which docker image to update - # - PMM_DEV_UPDATE_DOCKER_IMAGE=${PMM_SERVER_IMAGE:-perconalab/pmm-server:3-dev-container} + # - PMM_DEV_UPDATE_DOCKER_IMAGE=${PMM_UPDATE_IMAGE:-perconalab/pmm-server:3-dev-container} mysql: image: percona:5.7.30 From 14008756073911defd8c3126cd65a635272344e4 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Fri, 28 Jun 2024 09:56:55 +0200 Subject: [PATCH 25/74] PMM-12930 Improve update process --- ui/src/api/ready.ts | 9 ++ ui/src/hooks/api/useReadiness.ts | 19 +++++ ui/src/hooks/api/useUpdates.tsx | 19 ++++- .../pages/updates/update-card/UpdateCard.tsx | 32 +++++-- .../UpdateInProgressCard.messages.ts | 2 +- .../UpdateInProgressCard.tsx | 31 ++++--- .../UpdateInProgressCard.types.tsx | 5 +- .../UpdateProgress.messages.ts | 5 ++ .../update-progress/UpdateProgress.tsx | 84 +++++++++++++++++++ .../update-progress/UpdateProgress.types.ts | 5 ++ ui/src/types/api.types.ts | 5 ++ ui/src/types/updates.types.ts | 8 ++ 12 files changed, 195 insertions(+), 29 deletions(-) create mode 100644 ui/src/api/ready.ts create mode 100644 ui/src/hooks/api/useReadiness.ts create mode 100644 ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.messages.ts create mode 100644 ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.tsx create mode 100644 ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.types.ts create mode 100644 ui/src/types/api.types.ts diff --git a/ui/src/api/ready.ts b/ui/src/api/ready.ts new file mode 100644 index 0000000000..c5ad8aead0 --- /dev/null +++ b/ui/src/api/ready.ts @@ -0,0 +1,9 @@ +import { AxiosResponse } from 'axios'; +import { api } from './api'; + +export const getReadiness = async () => { + const res = await api.get>>( + '/readyz' + ); + return res.data; +}; diff --git a/ui/src/hooks/api/useReadiness.ts b/ui/src/hooks/api/useReadiness.ts new file mode 100644 index 0000000000..8a9bc44dce --- /dev/null +++ b/ui/src/hooks/api/useReadiness.ts @@ -0,0 +1,19 @@ +import { UseQueryOptions, useQuery } from '@tanstack/react-query'; +import { getReadiness } from 'api/ready'; + +export const useReadiness = (options?: Partial) => + useQuery({ + queryKey: ['readiness'], + queryFn: async () => getReadiness(), + ...options, + }); + +export const useWaitForReadiness = () => { + const { refetch } = useReadiness({ + refetchOnMount: false, + retry: true, + retryDelay: 5000, + }); + + return { waitForReadiness: refetch }; +}; diff --git a/ui/src/hooks/api/useUpdates.tsx b/ui/src/hooks/api/useUpdates.tsx index 191d31095b..f85a8f531a 100644 --- a/ui/src/hooks/api/useUpdates.tsx +++ b/ui/src/hooks/api/useUpdates.tsx @@ -1,9 +1,12 @@ -import { checkForUpdates, startUpdate, StartUpdateBody } from 'api/updates'; +import { checkForUpdates, startUpdate } from 'api/updates'; import { useMutation, UseMutationOptions, useQuery, } from '@tanstack/react-query'; +import { AxiosError } from 'axios'; +import { StartUpdateBody } from 'types/updates.types'; +import { ApiErrorResponse } from 'types/api.types'; export const useCheckUpdates = () => useQuery({ @@ -24,6 +27,18 @@ export const useStartUpdate = ( options?: UseMutationOptions ) => useMutation({ - mutationFn: (args) => startUpdate(args), + mutationFn: async (args) => { + try { + return await startUpdate(args); + } catch (error) { + const { response } = error as AxiosError; + + if (response?.status === 499 || response?.data?.code === 14) { + return; + } + + throw error; + } + }, ...options, }); diff --git a/ui/src/pages/updates/update-card/UpdateCard.tsx b/ui/src/pages/updates/update-card/UpdateCard.tsx index 4723c0bce8..4aae41fc84 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.tsx +++ b/ui/src/pages/updates/update-card/UpdateCard.tsx @@ -9,7 +9,7 @@ import { Skeleton, Alert, } from '@mui/material'; -import { FC, useMemo } from 'react'; +import { FC, useMemo, useState } from 'react'; import { formatTimestamp } from 'utils/formatTimestamp'; import { PMM_HOME_URL } from 'constants'; import { Messages } from './UpdateCard.messages'; @@ -17,25 +17,43 @@ import { FetchingIcon } from 'components/fetching-icon'; import { useCheckUpdates, useStartUpdate } from 'hooks/api/useUpdates'; import { formatVersion } from './UpdateCard.utils'; import { enqueueSnackbar } from 'notistack'; -import { UpdateInProgressCard } from '../update-in-progress-card'; +import { useWaitForReadiness } from 'hooks/api/useReadiness'; +import { UpdateStatus } from 'types/updates.types'; import { KeyboardDoubleArrowUp } from '@mui/icons-material'; import { UpdateInfo } from '../update-info'; +import { UpdateInProgressCard } from '../update-in-progress-card'; export const UpdateCard: FC = () => { const { isLoading, data, error, isRefetching, refetch } = useCheckUpdates(); - const { mutate: startUpdate, isPending: updateInProgress } = useStartUpdate(); + const { mutate: startUpdate } = useStartUpdate(); + const { waitForReadiness } = useWaitForReadiness(); + const [status, setStatus] = useState(UpdateStatus.Pending); const isUpToDate = useMemo( () => data?.installed.version === data?.latest?.version, [data] ); + const updateInProgress = useMemo( + () => + status === UpdateStatus.Updating || + status === UpdateStatus.Restarting || + status === UpdateStatus.Completed, + [status] + ); const handleStartUpdate = async () => { + setStatus(UpdateStatus.Updating); startUpdate( + {}, { - newImage: data?.latest?.tag, - }, - { + onSuccess: async () => { + setStatus(UpdateStatus.Restarting); + + await waitForReadiness(); + + setStatus(UpdateStatus.Completed); + }, onError: () => { + setStatus(UpdateStatus.Error); enqueueSnackbar(Messages.error, { variant: 'error', }); @@ -67,7 +85,7 @@ export const UpdateCard: FC = () => { } if (updateInProgress && data.latest) { - return ; + return ; } return ( diff --git a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.messages.ts b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.messages.ts index e064ace704..1a9890b22b 100644 --- a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.messages.ts +++ b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.messages.ts @@ -1,4 +1,4 @@ export const Messages = { title: (version: string) => `PMM ${version} update`, - updating: 'Updating...', + home: 'PMM Home', }; diff --git a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.tsx b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.tsx index 6ade670722..5712e33d93 100644 --- a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.tsx +++ b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.tsx @@ -4,19 +4,23 @@ import { CardContent, Stack, Typography, - LinearProgress, Chip, + Link, } from '@mui/material'; import { UpdateInfo } from '../update-info'; import { UpdateInProgressCardProps } from './UpdateInProgressCard.types'; import { Messages } from './UpdateInProgressCard.messages'; +import { UpdateProgress } from './update-progress/UpdateProgress'; +import { UpdateStatus } from 'types/updates.types'; +import { PMM_HOME_URL } from 'constants'; export const UpdateInProgressCard: FC = ({ versionInfo, + status, }) => ( - + = ({ - - - {Messages.updating} - - - + + {status === UpdateStatus.Completed && ( + + + {Messages.home} + + + )} diff --git a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx index fbc52d7c23..ce80cfa2af 100644 --- a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx +++ b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx @@ -1,5 +1,6 @@ -import { VersionInfo } from 'types/version.types'; +import { UpdateStatus, VersionInfo } from 'types/updates.types'; export interface UpdateInProgressCardProps { - versionInfo: VersionInfo; + versionInfo: VersionInfo; + status: UpdateStatus; } diff --git a/ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.messages.ts b/ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.messages.ts new file mode 100644 index 0000000000..6455e074cd --- /dev/null +++ b/ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.messages.ts @@ -0,0 +1,5 @@ +export const Messages = { + updating: 'Update in progress, please stand by...', + restarting: 'Restarting PMM...', + completed: 'PMM Server installation complete!', +}; diff --git a/ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.tsx b/ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.tsx new file mode 100644 index 0000000000..3695e32948 --- /dev/null +++ b/ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.tsx @@ -0,0 +1,84 @@ +import { FC } from 'react'; +import { UpdateProgressProps } from './UpdateProgress.types'; +import { + LinearProgress, + Stack, + Typography, + linearProgressClasses, +} from '@mui/material'; +import { UpdateStatus } from 'types/updates.types'; +import { Messages } from './UpdateProgress.messages'; +import CheckCircleIcon from '@mui/icons-material/CheckCircle'; + +export const UpdateProgress: FC = ({ status }) => { + const getStatusPercentage = (status: UpdateStatus) => { + switch (status) { + case UpdateStatus.Updating: + return 33; + case UpdateStatus.Restarting: + return 66; + case UpdateStatus.Completed: + return 100; + default: + return 0; + } + }; + + const getStatusMessage = (status: UpdateStatus) => { + switch (status) { + case UpdateStatus.Updating: + return Messages.updating; + case UpdateStatus.Restarting: + return Messages.restarting; + case UpdateStatus.Completed: + return Messages.completed; + default: + return ''; + } + }; + + return ( + + + {status === UpdateStatus.Completed && ( + + )} + + {getStatusMessage(status)} + + + ({ + height: 10, + borderStyle: 'solid', + borderRadius: 5, + borderColor: theme.palette.divider, + backgroundColor: theme.palette.surfaces?.low, + [`& .${linearProgressClasses.bar}`]: { + borderRadius: 5, + backgroundColor: + status === UpdateStatus.Completed ? '#008C71' : '#0E5FB5', + }, + })} + /> + + ); +}; diff --git a/ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.types.ts b/ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.types.ts new file mode 100644 index 0000000000..ef43624e74 --- /dev/null +++ b/ui/src/pages/updates/update-in-progress-card/update-progress/UpdateProgress.types.ts @@ -0,0 +1,5 @@ +import { UpdateStatus } from 'types/updates.types'; + +export interface UpdateProgressProps { + status: UpdateStatus; +} diff --git a/ui/src/types/api.types.ts b/ui/src/types/api.types.ts new file mode 100644 index 0000000000..db291b8925 --- /dev/null +++ b/ui/src/types/api.types.ts @@ -0,0 +1,5 @@ +export interface ApiErrorResponse { + error: string; + code: number; + message: string; +} diff --git a/ui/src/types/updates.types.ts b/ui/src/types/updates.types.ts index 4266503678..d9c9fdd8b5 100644 --- a/ui/src/types/updates.types.ts +++ b/ui/src/types/updates.types.ts @@ -36,3 +36,11 @@ export interface GetUpdateStatusResponse { logOffset: number; logLines: string[]; } + +export enum UpdateStatus { + Pending = 'pending', + Updating = 'updating', + Restarting = 'restarting', + Completed = 'completed', + Error = 'error', +} From e9a654fea7cec3543ed7065df761c186b4e5b28b Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Thu, 4 Jul 2024 15:47:45 +0200 Subject: [PATCH 26/74] PMM-11231 Disable auth_request for pmm-ui --- build/ansible/roles/nginx/files/conf.d/pmm.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/ansible/roles/nginx/files/conf.d/pmm.conf b/build/ansible/roles/nginx/files/conf.d/pmm.conf index 0e20de3981..0a41a10609 100644 --- a/build/ansible/roles/nginx/files/conf.d/pmm.conf +++ b/build/ansible/roles/nginx/files/conf.d/pmm.conf @@ -128,6 +128,9 @@ # PMM UI location /pmm-ui { + # Will redirect on FE to login page if user is not authenticated + auth_request off; + alias /usr/share/pmm-ui; try_files $uri /index.html break; } From a46f06fe64eb6e7491dabd8f57eeefa5a39ecbae Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Thu, 4 Jul 2024 16:18:49 +0200 Subject: [PATCH 27/74] PMM-11231 Rework redirect to login --- ui/src/components/main/Main.tsx | 28 ++++++++++++++------------ ui/src/constants.ts | 1 + ui/src/contexts/auth/auth.provider.tsx | 15 +++++++------- ui/src/contexts/auth/auth.utils.ts | 4 +++- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/ui/src/components/main/Main.tsx b/ui/src/components/main/Main.tsx index 96e03049dd..1fcbe5f50e 100644 --- a/ui/src/components/main/Main.tsx +++ b/ui/src/components/main/Main.tsx @@ -6,22 +6,24 @@ import { useAuth } from 'contexts/auth'; export const Main = () => { const { isLoading } = useAuth(); + if (isLoading) { + return ( + + + + ); + } + return ( - {isLoading ? ( - - - - ) : ( - - )} + ); }; diff --git a/ui/src/constants.ts b/ui/src/constants.ts index c571961e53..a104b3f9f0 100644 --- a/ui/src/constants.ts +++ b/ui/src/constants.ts @@ -1 +1,2 @@ export const PMM_HOME_URL = '/graph/d/pmm-home'; +export const PMM_LOGIN_URL = '/graph/login'; diff --git a/ui/src/contexts/auth/auth.provider.tsx b/ui/src/contexts/auth/auth.provider.tsx index be86801383..d2bc9c165b 100644 --- a/ui/src/contexts/auth/auth.provider.tsx +++ b/ui/src/contexts/auth/auth.provider.tsx @@ -1,4 +1,4 @@ -import { FC, PropsWithChildren, useEffect } from 'react'; +import { FC, PropsWithChildren, useMemo } from 'react'; import { AuthContext } from './auth.context'; import { useQuery } from '@tanstack/react-query'; import { rotateToken } from 'api/auth'; @@ -13,15 +13,16 @@ export const AuthProvider: FC = ({ children }) => { refetchIntervalInBackground: true, retry: false, }); - - useEffect(() => { + const shouldRedirectToLogin = useMemo(() => { const response = (error as AxiosError)?.response; - - if (response?.status === HttpStatusCode.Unauthorized) { - redirectToLogin(); - } + return response?.status === HttpStatusCode.Unauthorized; }, [error]); + if (shouldRedirectToLogin) { + redirectToLogin(); + return null; + } + return ( {children} diff --git a/ui/src/contexts/auth/auth.utils.ts b/ui/src/contexts/auth/auth.utils.ts index 360cb0f807..e586b64ffa 100644 --- a/ui/src/contexts/auth/auth.utils.ts +++ b/ui/src/contexts/auth/auth.utils.ts @@ -1,3 +1,5 @@ +import { PMM_LOGIN_URL } from 'constants'; + export const getSessionExpiry = () => { const expiryCookie = getSessionExpiryCookie(); @@ -33,5 +35,5 @@ export const getSessionExpiryCookie = () => .find((row) => row.startsWith('grafana_session_expiry=')); export const redirectToLogin = () => { - window.location.replace('/graph/login'); + window.location.replace(PMM_LOGIN_URL); }; From 5eb4685b74250299192e4e69c4ce13fd2ffe503c Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 9 Jul 2024 09:56:45 +0200 Subject: [PATCH 28/74] PMM-11231 Update api response --- ui/src/types/updates.types.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ui/src/types/updates.types.ts b/ui/src/types/updates.types.ts index 9eca20def7..5dc2b392b2 100644 --- a/ui/src/types/updates.types.ts +++ b/ui/src/types/updates.types.ts @@ -3,16 +3,22 @@ export interface GetUpdatesBody { onlyInstalledVersion?: boolean; } -export interface VersionInfo { +export interface CurrentInfo { + version?: string; + full_version?: string; timestamp?: string; +} + +export interface LatestInfo { version?: string; tag?: string; + timestamp?: string; } export interface GetUpdatesResponse { lastCheck: string; - latest?: VersionInfo; - installed: VersionInfo; + latest?: LatestInfo; + installed: CurrentInfo; latestNewsUrl?: string; updateAvailable?: boolean; } From d1192fb58251b68f8cdafa3fc119d3d8b031ffc5 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 9 Jul 2024 10:16:43 +0200 Subject: [PATCH 29/74] PMM-11231 Add link to support --- ui/src/components/app-bar/AppBar.test.tsx | 15 ++++++++++++++- ui/src/components/app-bar/AppBar.tsx | 11 +++++++++-- ui/src/components/main/Main.test.tsx | 2 +- ui/src/constants.ts | 2 ++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/ui/src/components/app-bar/AppBar.test.tsx b/ui/src/components/app-bar/AppBar.test.tsx index c735dafcb2..b0d5d741c1 100644 --- a/ui/src/components/app-bar/AppBar.test.tsx +++ b/ui/src/components/app-bar/AppBar.test.tsx @@ -1,6 +1,6 @@ import { screen, render } from '@testing-library/react'; import { AppBar } from '.'; -import { PMM_HOME_URL } from 'constants'; +import { PMM_HOME_URL, PMM_SUPPORT_URL } from 'constants'; import { TestWrapper } from 'utils/testWrapper'; describe('AppBar', () => { @@ -16,4 +16,17 @@ describe('AppBar', () => { PMM_HOME_URL ); }); + + it('links to support', () => { + render( + + + + ); + + expect(screen.getByTestId('appbar-support-link')).toHaveAttribute( + 'href', + PMM_SUPPORT_URL + ); + }); }); diff --git a/ui/src/components/app-bar/AppBar.tsx b/ui/src/components/app-bar/AppBar.tsx index bf7d58bf27..ad6fbf8173 100644 --- a/ui/src/components/app-bar/AppBar.tsx +++ b/ui/src/components/app-bar/AppBar.tsx @@ -9,7 +9,7 @@ import { import { Link as RouterLink } from 'react-router-dom'; import { HelpFilledIcon, PmmRoundedIcon } from 'icons'; import { Breadcrumbs } from 'components/breadcrumbs'; -import { PMM_HOME_URL } from 'constants'; +import { PMM_HOME_URL, PMM_SUPPORT_URL } from 'constants'; import { Messages } from './AppBar.messages'; export const AppBar = () => ( @@ -40,7 +40,14 @@ export const AppBar = () => ( > - {Messages.support} + + {Messages.support} + diff --git a/ui/src/components/main/Main.test.tsx b/ui/src/components/main/Main.test.tsx index 005ce6da2e..4b85d27ff1 100644 --- a/ui/src/components/main/Main.test.tsx +++ b/ui/src/components/main/Main.test.tsx @@ -16,7 +16,7 @@ describe('Main', () => { expect(screen.queryByTestId('pmm-loading-indicator')).toBeDefined(); }); - it('doesnt show loading', () => { + it("doesn't show loading", () => { render( diff --git a/ui/src/constants.ts b/ui/src/constants.ts index a104b3f9f0..6de8ce1c5c 100644 --- a/ui/src/constants.ts +++ b/ui/src/constants.ts @@ -1,2 +1,4 @@ export const PMM_HOME_URL = '/graph/d/pmm-home'; export const PMM_LOGIN_URL = '/graph/login'; +export const PMM_SUPPORT_URL = + 'https://docs.percona.com/percona-monitoring-and-management/index.html'; From 9d8d66cfac3a9964ea3f5d514250ebed3a4daad5 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 9 Jul 2024 10:21:29 +0200 Subject: [PATCH 30/74] PMM-11231 Fix support url redirect --- ui/src/components/app-bar/AppBar.tsx | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/ui/src/components/app-bar/AppBar.tsx b/ui/src/components/app-bar/AppBar.tsx index ad6fbf8173..b162ed4ea0 100644 --- a/ui/src/components/app-bar/AppBar.tsx +++ b/ui/src/components/app-bar/AppBar.tsx @@ -32,22 +32,16 @@ export const AppBar = () => ( - - {Messages.support} - + {Messages.support} From 13783c18c39fe96e28bd3df35442c3c58061f5e9 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 9 Jul 2024 11:03:31 +0200 Subject: [PATCH 31/74] PMM-11231 Fix lint --- ui/src/components/app-bar/AppBar.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/src/components/app-bar/AppBar.tsx b/ui/src/components/app-bar/AppBar.tsx index b162ed4ea0..333329fc25 100644 --- a/ui/src/components/app-bar/AppBar.tsx +++ b/ui/src/components/app-bar/AppBar.tsx @@ -6,7 +6,6 @@ import { Link, Stack, } from '@mui/material'; -import { Link as RouterLink } from 'react-router-dom'; import { HelpFilledIcon, PmmRoundedIcon } from 'icons'; import { Breadcrumbs } from 'components/breadcrumbs'; import { PMM_HOME_URL, PMM_SUPPORT_URL } from 'constants'; From b4d06f27f04f649c4afb9606546cf4727133a011 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 9 Jul 2024 13:37:12 +0200 Subject: [PATCH 32/74] PMM-11231 Fix typings --- ui/src/pages/updates/update-card/UpdateCard.utils.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ui/src/pages/updates/update-card/UpdateCard.utils.ts b/ui/src/pages/updates/update-card/UpdateCard.utils.ts index 1777b462d0..33dae1d148 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.utils.ts +++ b/ui/src/pages/updates/update-card/UpdateCard.utils.ts @@ -1,11 +1,15 @@ -import { VersionInfo } from 'types/updates.types'; +import { CurrentInfo, LatestInfo } from 'types/updates.types'; import { formatTimestamp } from 'utils/formatTimestamp'; -export const formatVersion = ({ version, timestamp, tag }: VersionInfo) => { +export const formatVersion = ({ + version, + timestamp, + tag, +}: LatestInfo & CurrentInfo) => { const text = ` ${version}` + (timestamp ? `, ${formatTimestamp(timestamp)}` : ''); - if (version === '0.0.0') { + if (version === '0.0.0' && tag) { return `${text}, ${tag}`; } From 5a3558f926280ab040f28dbd3c1289680cdd2b0b Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 9 Jul 2024 13:40:47 +0200 Subject: [PATCH 33/74] PMM-12930 Fix version typings --- .../update-in-progress-card/UpdateInProgressCard.types.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx index ce80cfa2af..1189d3aa21 100644 --- a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx +++ b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx @@ -1,6 +1,6 @@ -import { UpdateStatus, VersionInfo } from 'types/updates.types'; +import { CurrentInfo, LatestInfo, UpdateStatus } from 'types/updates.types'; export interface UpdateInProgressCardProps { - versionInfo: VersionInfo; + versionInfo: CurrentInfo & LatestInfo; status: UpdateStatus; } From c43a1993b15699b7f3d15fd14158b9c9391633f8 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 9 Jul 2024 16:42:07 +0200 Subject: [PATCH 34/74] PMM-11231 Add admin & auth check --- ui/src/App.tsx | 5 ++- ui/src/api/settings.ts | 10 +++++ ui/src/api/user.ts | 7 ++++ ui/src/components/main/Main.tsx | 6 +-- ui/src/components/page/Page.messages.ts | 5 +++ ui/src/components/page/Page.tsx | 45 +++++++++++++++++++++ ui/src/components/page/Page.types.ts | 5 +++ ui/src/components/page/index.ts | 1 + ui/src/contexts/user/user.context.ts | 6 +++ ui/src/contexts/user/user.context.types.tsx | 6 +++ ui/src/contexts/user/user.hooks.ts | 4 ++ ui/src/contexts/user/user.provider.tsx | 25 ++++++++++++ ui/src/contexts/user/user.utils.ts | 18 +++++++++ ui/src/hooks/api/useSettings.ts | 9 +++++ ui/src/hooks/api/useUser.ts | 8 ++++ ui/src/hooks/utils/useBootstrap.ts | 9 +++++ ui/src/pages/updates/Updates.tsx | 43 ++++++++------------ ui/src/types/settings.types.ts | 2 + ui/src/types/user.types.ts | 30 ++++++++++++++ 19 files changed, 214 insertions(+), 30 deletions(-) create mode 100644 ui/src/api/settings.ts create mode 100644 ui/src/api/user.ts create mode 100644 ui/src/components/page/Page.messages.ts create mode 100644 ui/src/components/page/Page.tsx create mode 100644 ui/src/components/page/Page.types.ts create mode 100644 ui/src/components/page/index.ts create mode 100644 ui/src/contexts/user/user.context.ts create mode 100644 ui/src/contexts/user/user.context.types.tsx create mode 100644 ui/src/contexts/user/user.hooks.ts create mode 100644 ui/src/contexts/user/user.provider.tsx create mode 100644 ui/src/contexts/user/user.utils.ts create mode 100644 ui/src/hooks/api/useSettings.ts create mode 100644 ui/src/hooks/api/useUser.ts create mode 100644 ui/src/hooks/utils/useBootstrap.ts create mode 100644 ui/src/types/settings.types.ts create mode 100644 ui/src/types/user.types.ts diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 4b06d8641f..bd4f98d963 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -8,6 +8,7 @@ import { NotistackMuiSnackbar } from '@percona/ui-lib'; import { SnackbarProvider } from 'notistack'; import pmmThemeOptions from 'themes/PmmTheme'; import { AuthProvider } from 'contexts/auth'; +import { UserProvider } from 'contexts/user/user.provider'; const queryClient = new QueryClient({ defaultOptions: { @@ -37,7 +38,9 @@ const App = () => ( > - + + + diff --git a/ui/src/api/settings.ts b/ui/src/api/settings.ts new file mode 100644 index 0000000000..7fed2dd041 --- /dev/null +++ b/ui/src/api/settings.ts @@ -0,0 +1,10 @@ +import { GetSettingsResponse } from 'types/settings.types'; +import { api } from './api'; +import { AxiosResponse } from 'axios'; + +export const getSettings = async () => { + const res = await api.post>( + 'Settings/Get' + ); + return res.data; +}; diff --git a/ui/src/api/user.ts b/ui/src/api/user.ts new file mode 100644 index 0000000000..6bd3bc3a7c --- /dev/null +++ b/ui/src/api/user.ts @@ -0,0 +1,7 @@ +import { GetUserResponse } from 'types/user.types'; +import { grafanaApi } from './api'; + +export const getCurrentUser = async () => { + const res = await grafanaApi.get('/user'); + return res.data; +}; diff --git a/ui/src/components/main/Main.tsx b/ui/src/components/main/Main.tsx index 1fcbe5f50e..e66794eb38 100644 --- a/ui/src/components/main/Main.tsx +++ b/ui/src/components/main/Main.tsx @@ -1,12 +1,12 @@ import { CircularProgress, Stack } from '@mui/material'; import { Outlet } from 'react-router-dom'; import { AppBar } from '../app-bar/AppBar'; -import { useAuth } from 'contexts/auth'; +import { useBootstrap } from 'hooks/utils/useBootstrap'; export const Main = () => { - const { isLoading } = useAuth(); + const { isReady } = useBootstrap(); - if (isLoading) { + if (!isReady) { return ( = ({ title, children }) => { + const { user } = useUser(); + + return ( + + {!!title && {title}} + {user?.isAuthorized ? ( + children + ) : ( + + + {Messages.noAcccess} + + + + {Messages.goBack} + {Messages.home} + + + + )} + + ); +}; diff --git a/ui/src/components/page/Page.types.ts b/ui/src/components/page/Page.types.ts new file mode 100644 index 0000000000..4abc8f88c9 --- /dev/null +++ b/ui/src/components/page/Page.types.ts @@ -0,0 +1,5 @@ +import { PropsWithChildren } from 'react'; + +export interface PageProps extends PropsWithChildren { + title?: string; +} diff --git a/ui/src/components/page/index.ts b/ui/src/components/page/index.ts new file mode 100644 index 0000000000..d9925d7520 --- /dev/null +++ b/ui/src/components/page/index.ts @@ -0,0 +1 @@ +export * from './Page'; diff --git a/ui/src/contexts/user/user.context.ts b/ui/src/contexts/user/user.context.ts new file mode 100644 index 0000000000..540c3f2fe6 --- /dev/null +++ b/ui/src/contexts/user/user.context.ts @@ -0,0 +1,6 @@ +import { createContext } from 'react'; +import { UserContextProps } from './user.context.types'; + +export const UserContext = createContext({ + isLoading: false, +}); diff --git a/ui/src/contexts/user/user.context.types.tsx b/ui/src/contexts/user/user.context.types.tsx new file mode 100644 index 0000000000..b074e11c9b --- /dev/null +++ b/ui/src/contexts/user/user.context.types.tsx @@ -0,0 +1,6 @@ +import { User } from "types/user.types"; + +export interface UserContextProps { + isLoading: boolean; + user?: User; +} diff --git a/ui/src/contexts/user/user.hooks.ts b/ui/src/contexts/user/user.hooks.ts new file mode 100644 index 0000000000..7c9426c9c6 --- /dev/null +++ b/ui/src/contexts/user/user.hooks.ts @@ -0,0 +1,4 @@ +import { useContext } from 'react'; +import { UserContext } from './user.context'; + +export const useUser = () => useContext(UserContext); diff --git a/ui/src/contexts/user/user.provider.tsx b/ui/src/contexts/user/user.provider.tsx new file mode 100644 index 0000000000..78f8618cc4 --- /dev/null +++ b/ui/src/contexts/user/user.provider.tsx @@ -0,0 +1,25 @@ +import { FC, PropsWithChildren, useMemo } from 'react'; +import { UserContext } from './user.context'; +import { useCurrentUser } from 'hooks/api/useUser'; +import { useSettings } from 'hooks/api/useSettings'; +import { getPerconaUser, isAuthorized } from './user.utils'; + +export const UserProvider: FC = ({ children }) => { + const { data, isLoading: isLoadingUser } = useCurrentUser(); + const { error, isLoading: isLoadingSettings } = useSettings({ retry: false }); + const user = useMemo( + () => data && getPerconaUser(data, isAuthorized(error)), + [data, error] + ); + + return ( + + {children} + + ); +}; diff --git a/ui/src/contexts/user/user.utils.ts b/ui/src/contexts/user/user.utils.ts new file mode 100644 index 0000000000..f05775e36e --- /dev/null +++ b/ui/src/contexts/user/user.utils.ts @@ -0,0 +1,18 @@ +import { AxiosError } from 'axios'; +import { OrgRole, User, GetUserResponse } from 'types/user.types'; + +export const getPerconaUser = ( + user: GetUserResponse, + isAuthorized: boolean +): User => ({ + id: user.id, + isPMMAdmin: isPMMAdmin(user), + isAuthorized, + orgRole: user.orgRole, +}); + +export const isAuthorized = (error?: Error | null) => + !error || (error as AxiosError).response?.status !== 401; + +export const isPMMAdmin = (user: GetUserResponse): boolean => + user.isGrafanaAdmin || user.orgRole === OrgRole.Admin; diff --git a/ui/src/hooks/api/useSettings.ts b/ui/src/hooks/api/useSettings.ts new file mode 100644 index 0000000000..da9c1a9872 --- /dev/null +++ b/ui/src/hooks/api/useSettings.ts @@ -0,0 +1,9 @@ +import { useQuery, UseQueryOptions } from '@tanstack/react-query'; +import { getSettings } from 'api/settings'; + +export const useSettings = (options?: Partial) => + useQuery({ + queryKey: ['settings'], + queryFn: () => getSettings(), + ...options, + }); diff --git a/ui/src/hooks/api/useUser.ts b/ui/src/hooks/api/useUser.ts new file mode 100644 index 0000000000..2f95b44f37 --- /dev/null +++ b/ui/src/hooks/api/useUser.ts @@ -0,0 +1,8 @@ +import { useQuery } from '@tanstack/react-query'; +import { getCurrentUser } from 'api/user'; + +export const useCurrentUser = () => + useQuery({ + queryKey: ['user'], + queryFn: () => getCurrentUser(), + }); diff --git a/ui/src/hooks/utils/useBootstrap.ts b/ui/src/hooks/utils/useBootstrap.ts new file mode 100644 index 0000000000..24c63c60db --- /dev/null +++ b/ui/src/hooks/utils/useBootstrap.ts @@ -0,0 +1,9 @@ +import { useAuth } from 'contexts/auth'; +import { useUser } from 'contexts/user/user.hooks'; + +export const useBootstrap = () => { + const { isLoading: isLoadingAuth } = useAuth(); + const { isLoading: isLoadingUser } = useUser(); + + return { isReady: !isLoadingAuth && !isLoadingUser }; +}; diff --git a/ui/src/pages/updates/Updates.tsx b/ui/src/pages/updates/Updates.tsx index 87d6a453c2..8b06efc598 100644 --- a/ui/src/pages/updates/Updates.tsx +++ b/ui/src/pages/updates/Updates.tsx @@ -4,30 +4,21 @@ import { FC } from 'react'; import Welcome from 'assets/welcome.svg'; import { UpdateCard } from './update-card'; import { Messages } from './Updates.messages'; +import { Page } from 'components/page'; -export const Updates: FC = () => { - return ( - - {Messages.title} - - - - - {Messages.welcome.title} - - {Messages.welcome.description} - - - - - - - ); -}; +export const Updates: FC = () => ( + + + + + + {Messages.welcome.title} + + {Messages.welcome.description} + + + + + + +); diff --git a/ui/src/types/settings.types.ts b/ui/src/types/settings.types.ts new file mode 100644 index 0000000000..1e2d131bbb --- /dev/null +++ b/ui/src/types/settings.types.ts @@ -0,0 +1,2 @@ +// no need to specify for now +export interface GetSettingsResponse {} diff --git a/ui/src/types/user.types.ts b/ui/src/types/user.types.ts new file mode 100644 index 0000000000..7a8425eae6 --- /dev/null +++ b/ui/src/types/user.types.ts @@ -0,0 +1,30 @@ +// comes from grafana +export enum OrgRole { + None = 'None', + Viewer = 'Viewer', + Editor = 'Editor', + Admin = 'Admin', +} + +export interface User { + id: number; + orgRole: OrgRole | ''; + isPMMAdmin: boolean; + isAuthorized: boolean; +} + +// comes from grafana +export interface GetUserResponse { + id: number; + email: string; + name: string; + login: string; + createdAt: string; + orgRole: OrgRole; + isDisabled: boolean; + isExternal: boolean; + isExtarnallySynced: boolean; + isGrafanaAdmin: boolean; + isGrafanaAdminExternallySynced: boolean; + theme: 'dark' | 'light' | 'system' | ''; +} From c6dc014ce13b9f8e8d34273b3b24cfcf404b3214 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 9 Jul 2024 17:01:11 +0200 Subject: [PATCH 35/74] PMM-12930 Make page component responsive --- ui/src/components/page/Page.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ui/src/components/page/Page.tsx b/ui/src/components/page/Page.tsx index ea6acc4975..d933a0571c 100644 --- a/ui/src/components/page/Page.tsx +++ b/ui/src/components/page/Page.tsx @@ -18,8 +18,13 @@ export const Page: FC = ({ title, children }) => { return ( Date: Tue, 9 Jul 2024 17:07:47 +0200 Subject: [PATCH 36/74] PMM-12930 Add Page unit tests --- ui/src/components/page/Page.test.tsx | 54 ++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 ui/src/components/page/Page.test.tsx diff --git a/ui/src/components/page/Page.test.tsx b/ui/src/components/page/Page.test.tsx new file mode 100644 index 0000000000..f7df1b0928 --- /dev/null +++ b/ui/src/components/page/Page.test.tsx @@ -0,0 +1,54 @@ +import { screen, render } from '@testing-library/react'; +import { Page } from './Page'; +import { TestWrapper } from 'utils/testWrapper'; +import { UserContext } from 'contexts/user/user.context'; +import { OrgRole } from 'types/user.types'; +import { Messages } from './Page.messages'; + +const MOCK_USER = { + id: 1, + isAuthorized: true, + isPMMAdmin: true, + orgRole: OrgRole.Admin, +}; + +describe('Page', () => { + it('it shows page content when authorized', () => { + render( + + + +
Authorized
+
+
+
+ ); + + expect(screen.queryByText('Page Content')).toBeDefined(); + }); + + it('it shows no access page when unauthorized', () => { + render( + + + +
Page Content
+
+
+
+ ); + + expect(screen.queryByText('Page Content')).toBeNull(); + expect(screen.queryByText(Messages.noAcccess)).toBeDefined(); + }); +}); From d0e38c6755c7653ea5916a0629fe4a1eafb8f90b Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 9 Jul 2024 17:01:11 +0200 Subject: [PATCH 37/74] PMM-12930 Make page component responsive --- ui/src/components/page/Page.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ui/src/components/page/Page.tsx b/ui/src/components/page/Page.tsx index ea6acc4975..d933a0571c 100644 --- a/ui/src/components/page/Page.tsx +++ b/ui/src/components/page/Page.tsx @@ -18,8 +18,13 @@ export const Page: FC = ({ title, children }) => { return ( Date: Tue, 9 Jul 2024 17:07:47 +0200 Subject: [PATCH 38/74] PMM-12930 Add Page unit tests --- ui/src/components/page/Page.test.tsx | 54 ++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 ui/src/components/page/Page.test.tsx diff --git a/ui/src/components/page/Page.test.tsx b/ui/src/components/page/Page.test.tsx new file mode 100644 index 0000000000..f7df1b0928 --- /dev/null +++ b/ui/src/components/page/Page.test.tsx @@ -0,0 +1,54 @@ +import { screen, render } from '@testing-library/react'; +import { Page } from './Page'; +import { TestWrapper } from 'utils/testWrapper'; +import { UserContext } from 'contexts/user/user.context'; +import { OrgRole } from 'types/user.types'; +import { Messages } from './Page.messages'; + +const MOCK_USER = { + id: 1, + isAuthorized: true, + isPMMAdmin: true, + orgRole: OrgRole.Admin, +}; + +describe('Page', () => { + it('it shows page content when authorized', () => { + render( + + + +
Authorized
+
+
+
+ ); + + expect(screen.queryByText('Page Content')).toBeDefined(); + }); + + it('it shows no access page when unauthorized', () => { + render( + + + +
Page Content
+
+
+
+ ); + + expect(screen.queryByText('Page Content')).toBeNull(); + expect(screen.queryByText(Messages.noAcccess)).toBeDefined(); + }); +}); From 7660144d6a3ebec145172254350e21b38769823a Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 23 Jul 2024 11:38:19 +0200 Subject: [PATCH 39/74] PMM-11231 Update api endpoints --- ui/src/api/settings.ts | 7 +-- ui/src/api/updates.ts | 15 +++--- ui/src/constants.ts | 1 + ui/src/hooks/api/useSettings.ts | 3 +- ui/src/pages/updates/Updates.messages.ts | 5 ++ ui/src/pages/updates/Updates.tsx | 64 +++++++++++++++++------- ui/src/types/settings.types.ts | 9 +++- ui/src/types/updates.types.ts | 2 +- 8 files changed, 72 insertions(+), 34 deletions(-) diff --git a/ui/src/api/settings.ts b/ui/src/api/settings.ts index 7fed2dd041..642b16318c 100644 --- a/ui/src/api/settings.ts +++ b/ui/src/api/settings.ts @@ -1,10 +1,7 @@ import { GetSettingsResponse } from 'types/settings.types'; import { api } from './api'; -import { AxiosResponse } from 'axios'; export const getSettings = async () => { - const res = await api.post>( - 'Settings/Get' - ); - return res.data; + const res = await api.get('/server/settings'); + return res.data.settings; }; diff --git a/ui/src/api/updates.ts b/ui/src/api/updates.ts index d3fc3fb55f..14ab16216d 100644 --- a/ui/src/api/updates.ts +++ b/ui/src/api/updates.ts @@ -2,25 +2,24 @@ import { AxiosResponse } from 'axios'; import { GetUpdateStatusBody, GetUpdateStatusResponse, - GetUpdatesBody, + GetUpdatesParams, GetUpdatesResponse, StartUpdateResponse, } from 'types/updates.types'; import { api } from './api'; export const checkForUpdates = async ( - body: GetUpdatesBody = { force: false } + params: GetUpdatesParams = { force: false } ) => { - const res = await api.post>( - '/Updates/Check', - body - ); + const res = await api.get('/server/updates', { + params, + }); return res.data; }; export const startUpdate = async () => { const res = await api.post>( - '/Updates/Start', + '/server/updates:start', {} ); return res.data; @@ -30,6 +29,6 @@ export const getUpdateStatus = async (body: GetUpdateStatusBody) => { const res = await api.post< GetUpdateStatusBody, AxiosResponse - >('/Updates/Status', body); + >('/server/updates:getStatus', body); return res.data; }; diff --git a/ui/src/constants.ts b/ui/src/constants.ts index 6de8ce1c5c..899f66b838 100644 --- a/ui/src/constants.ts +++ b/ui/src/constants.ts @@ -1,4 +1,5 @@ export const PMM_HOME_URL = '/graph/d/pmm-home'; export const PMM_LOGIN_URL = '/graph/login'; +export const PMM_SETTINGS_URL = '/graph/settings/advanced-settings'; export const PMM_SUPPORT_URL = 'https://docs.percona.com/percona-monitoring-and-management/index.html'; diff --git a/ui/src/hooks/api/useSettings.ts b/ui/src/hooks/api/useSettings.ts index da9c1a9872..f4dcc7c547 100644 --- a/ui/src/hooks/api/useSettings.ts +++ b/ui/src/hooks/api/useSettings.ts @@ -1,7 +1,8 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { getSettings } from 'api/settings'; +import { Settings } from 'types/settings.types'; -export const useSettings = (options?: Partial) => +export const useSettings = (options?: Partial>) => useQuery({ queryKey: ['settings'], queryFn: () => getSettings(), diff --git a/ui/src/pages/updates/Updates.messages.ts b/ui/src/pages/updates/Updates.messages.ts index 825554a998..2461a3319c 100644 --- a/ui/src/pages/updates/Updates.messages.ts +++ b/ui/src/pages/updates/Updates.messages.ts @@ -5,4 +5,9 @@ export const Messages = { description: 'The future is promising! We are brewing some changes to make your experience smoother, performant, but still powerful. Stay tuned to the future PMM updates!', }, + disabled: { + title: 'Upgrades are disabled', + description: 'You can enable them in ', + settings: 'PMM Settings', + }, }; diff --git a/ui/src/pages/updates/Updates.tsx b/ui/src/pages/updates/Updates.tsx index 8b06efc598..3e862514f8 100644 --- a/ui/src/pages/updates/Updates.tsx +++ b/ui/src/pages/updates/Updates.tsx @@ -1,24 +1,54 @@ -import { CardContent, CardMedia, Stack, Typography } from '@mui/material'; +import { + Alert, + CardContent, + CardMedia, + Link, + Stack, + Typography, +} from '@mui/material'; import { Card } from '@mui/material'; import { FC } from 'react'; import Welcome from 'assets/welcome.svg'; import { UpdateCard } from './update-card'; import { Messages } from './Updates.messages'; import { Page } from 'components/page'; +import { useSettings } from 'hooks/api/useSettings'; +import { PMM_SETTINGS_URL } from 'constants'; -export const Updates: FC = () => ( - - - - - - {Messages.welcome.title} - - {Messages.welcome.description} - - - - - - -); +export const Updates: FC = () => { + const { data: settings } = useSettings(); + + return ( + + + + + + {Messages.welcome.title} + + {Messages.welcome.description} + + + + + {settings?.updatesEnabled ? ( + + ) : ( + + + + {Messages.disabled.title} + + {Messages.disabled.description} + + {Messages.disabled.settings} + + . + + + + + )} + + ); +}; diff --git a/ui/src/types/settings.types.ts b/ui/src/types/settings.types.ts index 1e2d131bbb..4a14bca507 100644 --- a/ui/src/types/settings.types.ts +++ b/ui/src/types/settings.types.ts @@ -1,2 +1,7 @@ -// no need to specify for now -export interface GetSettingsResponse {} +export interface Settings { + updatesEnabled: boolean; +} + +export interface GetSettingsResponse { + settings: Settings; +} diff --git a/ui/src/types/updates.types.ts b/ui/src/types/updates.types.ts index 5dc2b392b2..e908b2d403 100644 --- a/ui/src/types/updates.types.ts +++ b/ui/src/types/updates.types.ts @@ -1,4 +1,4 @@ -export interface GetUpdatesBody { +export interface GetUpdatesParams { force: boolean; onlyInstalledVersion?: boolean; } From cd6b68ffa9248e88bd86a996f57059114594bb81 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 24 Jul 2024 14:04:01 +0200 Subject: [PATCH 40/74] PMM-12930 Add upgrade docs link --- ui/src/constants.ts | 6 ++++-- ui/src/pages/updates/update-info/UpdateInfo.tsx | 9 ++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ui/src/constants.ts b/ui/src/constants.ts index 899f66b838..3938c47b23 100644 --- a/ui/src/constants.ts +++ b/ui/src/constants.ts @@ -1,5 +1,7 @@ export const PMM_HOME_URL = '/graph/d/pmm-home'; export const PMM_LOGIN_URL = '/graph/login'; export const PMM_SETTINGS_URL = '/graph/settings/advanced-settings'; -export const PMM_SUPPORT_URL = - 'https://docs.percona.com/percona-monitoring-and-management/index.html'; +export const PMM_SUPPORT_URL = 'https://per.co.na/pmm_documentation'; +// TODO: use shortened link +export const PMM_DOCS_UPDATES_URL = + 'https://docs.percona.com/percona-monitoring-and-management/how-to/upgrade.html'; diff --git a/ui/src/pages/updates/update-info/UpdateInfo.tsx b/ui/src/pages/updates/update-info/UpdateInfo.tsx index ca26ea4d61..727d8c4fa9 100644 --- a/ui/src/pages/updates/update-info/UpdateInfo.tsx +++ b/ui/src/pages/updates/update-info/UpdateInfo.tsx @@ -1,6 +1,7 @@ import { Link, Stack, Typography } from '@mui/material'; import { FC } from 'react'; import { Messages } from './UpdateInfo.messages'; +import { PMM_DOCS_UPDATES_URL } from 'constants'; export const UpdateInfo: FC = () => ( ( {Messages.upgrading}
- {Messages.readMore} + + {Messages.readMore} +
{Messages.whatsNext} From 10a6027591e0eddacc2ae3dc04bec78a32ac1012 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 24 Jul 2024 14:29:17 +0200 Subject: [PATCH 41/74] PMM-12930 Update types & readyz url --- ui/src/api/ready.ts | 5 +---- ui/src/hooks/api/useUpdates.tsx | 8 ++++++-- .../pages/updates/update-card/UpdateCard.tsx | 2 +- .../updates/update-card/UpdateCard.utils.ts | 2 +- .../UpdateInProgressCard.types.tsx | 2 +- ui/src/types/updates.types.ts | 18 +++++++++--------- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/ui/src/api/ready.ts b/ui/src/api/ready.ts index c5ad8aead0..7d40dfa3ce 100644 --- a/ui/src/api/ready.ts +++ b/ui/src/api/ready.ts @@ -1,9 +1,6 @@ -import { AxiosResponse } from 'axios'; import { api } from './api'; export const getReadiness = async () => { - const res = await api.get>>( - '/readyz' - ); + const res = await api.get>('/server/readyz'); return res.data; }; diff --git a/ui/src/hooks/api/useUpdates.tsx b/ui/src/hooks/api/useUpdates.tsx index f85a8f531a..432652d9aa 100644 --- a/ui/src/hooks/api/useUpdates.tsx +++ b/ui/src/hooks/api/useUpdates.tsx @@ -5,7 +5,7 @@ import { useQuery, } from '@tanstack/react-query'; import { AxiosError } from 'axios'; -import { StartUpdateBody } from 'types/updates.types'; +import { StartUpdateBody, StartUpdateResponse } from 'types/updates.types'; import { ApiErrorResponse } from 'types/api.types'; export const useCheckUpdates = () => @@ -24,7 +24,11 @@ export const useCheckUpdates = () => }); export const useStartUpdate = ( - options?: UseMutationOptions + options?: UseMutationOptions< + StartUpdateResponse | undefined, + unknown, + StartUpdateBody + > ) => useMutation({ mutationFn: async (args) => { diff --git a/ui/src/pages/updates/update-card/UpdateCard.tsx b/ui/src/pages/updates/update-card/UpdateCard.tsx index 4aae41fc84..8cd492801d 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.tsx +++ b/ui/src/pages/updates/update-card/UpdateCard.tsx @@ -102,7 +102,7 @@ export const UpdateCard: FC = () => { )} - {data.updateAvailable && data?.latest?.version && ( + {data.updateAvailable && data?.latest.version && ( {Messages.newUpdateAvailable(data.latest.version)} diff --git a/ui/src/pages/updates/update-card/UpdateCard.utils.ts b/ui/src/pages/updates/update-card/UpdateCard.utils.ts index 33dae1d148..48ea8751b0 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.utils.ts +++ b/ui/src/pages/updates/update-card/UpdateCard.utils.ts @@ -5,7 +5,7 @@ export const formatVersion = ({ version, timestamp, tag, -}: LatestInfo & CurrentInfo) => { +}: Partial) => { const text = ` ${version}` + (timestamp ? `, ${formatTimestamp(timestamp)}` : ''); diff --git a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx index 1189d3aa21..e87636bc51 100644 --- a/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx +++ b/ui/src/pages/updates/update-in-progress-card/UpdateInProgressCard.types.tsx @@ -1,6 +1,6 @@ import { CurrentInfo, LatestInfo, UpdateStatus } from 'types/updates.types'; export interface UpdateInProgressCardProps { - versionInfo: CurrentInfo & LatestInfo; + versionInfo: Partial; status: UpdateStatus; } diff --git a/ui/src/types/updates.types.ts b/ui/src/types/updates.types.ts index 1ec39b0ce3..9584805403 100644 --- a/ui/src/types/updates.types.ts +++ b/ui/src/types/updates.types.ts @@ -4,23 +4,23 @@ export interface GetUpdatesParams { } export interface CurrentInfo { - version?: string; - full_version?: string; - timestamp?: string; + version: string; + full_version: string; + timestamp: string | null; } export interface LatestInfo { - version?: string; - tag?: string; - timestamp?: string; + version: string; + tag: string; + timestamp: string | null; } export interface GetUpdatesResponse { lastCheck: string; - latest?: LatestInfo; + latest: LatestInfo; installed: CurrentInfo; - latestNewsUrl?: string; - updateAvailable?: boolean; + latestNewsUrl: string; + updateAvailable: boolean; } export interface StartUpdateBody { From 1c9fbaeddf3223336f94823c94176c9d9e505793 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 24 Jul 2024 14:34:25 +0200 Subject: [PATCH 42/74] PMM-12930 Remove temporary error handling --- ui/src/hooks/api/useUpdates.tsx | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/ui/src/hooks/api/useUpdates.tsx b/ui/src/hooks/api/useUpdates.tsx index 432652d9aa..732b1a1715 100644 --- a/ui/src/hooks/api/useUpdates.tsx +++ b/ui/src/hooks/api/useUpdates.tsx @@ -4,9 +4,7 @@ import { UseMutationOptions, useQuery, } from '@tanstack/react-query'; -import { AxiosError } from 'axios'; import { StartUpdateBody, StartUpdateResponse } from 'types/updates.types'; -import { ApiErrorResponse } from 'types/api.types'; export const useCheckUpdates = () => useQuery({ @@ -31,18 +29,6 @@ export const useStartUpdate = ( > ) => useMutation({ - mutationFn: async (args) => { - try { - return await startUpdate(args); - } catch (error) { - const { response } = error as AxiosError; - - if (response?.status === 499 || response?.data?.code === 14) { - return; - } - - throw error; - } - }, + mutationFn: (args) => startUpdate(args), ...options, }); From 0ce8c1f51e1e82ac3f80dd21974df76b6d1ddb8f Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Tue, 30 Jul 2024 13:19:55 +0200 Subject: [PATCH 43/74] PMM-12930 Add footer --- ui/src/App.tsx | 5 ++- ui/src/components/page/Page.tsx | 3 +- ui/src/components/page/Page.types.ts | 3 +- ui/src/contexts/updates/index.ts | 4 ++ ui/src/contexts/updates/updates.context.tsx | 11 +++++ .../contexts/updates/updates.context.types.ts | 10 +++++ ui/src/contexts/updates/updates.hooks.ts | 4 ++ ui/src/contexts/updates/updates.provider.tsx | 41 +++++++++++++++++++ ui/src/pages/updates/Updates.tsx | 3 +- .../pages/updates/update-card/UpdateCard.tsx | 20 +++------ .../update-footer/UpdateFooter.messages.ts | 6 +++ .../updates/update-footer/UpdateFooter.tsx | 30 ++++++++++++++ .../update-footer/UpdateFooter.utils.ts | 2 + ui/src/pages/updates/update-footer/index.ts | 1 + ui/src/types/updates.types.ts | 4 +- 15 files changed, 127 insertions(+), 20 deletions(-) create mode 100644 ui/src/contexts/updates/index.ts create mode 100644 ui/src/contexts/updates/updates.context.tsx create mode 100644 ui/src/contexts/updates/updates.context.types.ts create mode 100644 ui/src/contexts/updates/updates.hooks.ts create mode 100644 ui/src/contexts/updates/updates.provider.tsx create mode 100644 ui/src/pages/updates/update-footer/UpdateFooter.messages.ts create mode 100644 ui/src/pages/updates/update-footer/UpdateFooter.tsx create mode 100644 ui/src/pages/updates/update-footer/UpdateFooter.utils.ts create mode 100644 ui/src/pages/updates/update-footer/index.ts diff --git a/ui/src/App.tsx b/ui/src/App.tsx index bd4f98d963..214bb5d025 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -9,6 +9,7 @@ import { SnackbarProvider } from 'notistack'; import pmmThemeOptions from 'themes/PmmTheme'; import { AuthProvider } from 'contexts/auth'; import { UserProvider } from 'contexts/user/user.provider'; +import { UpdatesProvider } from 'contexts/updates'; const queryClient = new QueryClient({ defaultOptions: { @@ -39,7 +40,9 @@ const App = () => ( - + + + diff --git a/ui/src/components/page/Page.tsx b/ui/src/components/page/Page.tsx index d933a0571c..e11f851186 100644 --- a/ui/src/components/page/Page.tsx +++ b/ui/src/components/page/Page.tsx @@ -12,7 +12,7 @@ import { useUser } from 'contexts/user/user.hooks'; import { Messages } from './Page.messages'; import { PMM_HOME_URL } from 'constants'; -export const Page: FC = ({ title, children }) => { +export const Page: FC = ({ title, footer, children }) => { const { user } = useUser(); return ( @@ -45,6 +45,7 @@ export const Page: FC = ({ title, children }) => { )} + {footer && {footer}} ); }; diff --git a/ui/src/components/page/Page.types.ts b/ui/src/components/page/Page.types.ts index 4abc8f88c9..a799376094 100644 --- a/ui/src/components/page/Page.types.ts +++ b/ui/src/components/page/Page.types.ts @@ -1,5 +1,6 @@ -import { PropsWithChildren } from 'react'; +import { PropsWithChildren, ReactNode } from 'react'; export interface PageProps extends PropsWithChildren { title?: string; + footer?: ReactNode; } diff --git a/ui/src/contexts/updates/index.ts b/ui/src/contexts/updates/index.ts new file mode 100644 index 0000000000..b477960181 --- /dev/null +++ b/ui/src/contexts/updates/index.ts @@ -0,0 +1,4 @@ +export * from './updates.context'; +export * from './updates.provider'; +export * from './updates.context'; +export * from './updates.hooks'; diff --git a/ui/src/contexts/updates/updates.context.tsx b/ui/src/contexts/updates/updates.context.tsx new file mode 100644 index 0000000000..44f12f1c99 --- /dev/null +++ b/ui/src/contexts/updates/updates.context.tsx @@ -0,0 +1,11 @@ +import { createContext } from 'react'; +import { UpdatesContextProps } from './updates.context.types'; +import { UpdateStatus } from 'types/updates.types'; + +export const UpdatesContext = createContext({ + isLoading: false, + inProgress: false, + status: UpdateStatus.Pending, + setStatus: () => {}, + recheck: () => {}, +}); diff --git a/ui/src/contexts/updates/updates.context.types.ts b/ui/src/contexts/updates/updates.context.types.ts new file mode 100644 index 0000000000..bb3e2a1356 --- /dev/null +++ b/ui/src/contexts/updates/updates.context.types.ts @@ -0,0 +1,10 @@ +import { GetUpdatesResponse, UpdateStatus } from 'types/updates.types'; + +export interface UpdatesContextProps { + isLoading: boolean; + inProgress: boolean; + status: UpdateStatus; + setStatus: (status: UpdateStatus) => void; + versionInfo?: GetUpdatesResponse; + recheck: () => void; +} diff --git a/ui/src/contexts/updates/updates.hooks.ts b/ui/src/contexts/updates/updates.hooks.ts new file mode 100644 index 0000000000..7520599cfa --- /dev/null +++ b/ui/src/contexts/updates/updates.hooks.ts @@ -0,0 +1,4 @@ +import { useContext } from 'react'; +import { UpdatesContext } from './updates.context'; + +export const useUpdates = () => useContext(UpdatesContext); diff --git a/ui/src/contexts/updates/updates.provider.tsx b/ui/src/contexts/updates/updates.provider.tsx new file mode 100644 index 0000000000..f3b978ed23 --- /dev/null +++ b/ui/src/contexts/updates/updates.provider.tsx @@ -0,0 +1,41 @@ +import { FC, PropsWithChildren, useEffect, useMemo, useState } from 'react'; +import { UpdatesContext } from './updates.context'; +import { UpdateStatus } from 'types/updates.types'; +import { useCheckUpdates } from 'hooks/api/useUpdates'; + +export const UpdatesProvider: FC = ({ children }) => { + const [status, setStatus] = useState(UpdateStatus.Pending); + const { isLoading, data, error, isRefetching, refetch } = useCheckUpdates(); + const inProgress = useMemo( + () => + status === UpdateStatus.Updating || + status === UpdateStatus.Restarting || + status === UpdateStatus.Completed, + [status] + ); + + useEffect(() => { + if (error) { + setStatus(UpdateStatus.Error); + } else if (isLoading) { + setStatus(UpdateStatus.Checking); + } else if (data && data?.installed.version === data?.latest?.version) { + setStatus(UpdateStatus.UpToDate); + } + }, [data, error, isLoading]); + + return ( + + {children} + + ); +}; diff --git a/ui/src/pages/updates/Updates.tsx b/ui/src/pages/updates/Updates.tsx index 3e862514f8..75187ad7da 100644 --- a/ui/src/pages/updates/Updates.tsx +++ b/ui/src/pages/updates/Updates.tsx @@ -14,12 +14,13 @@ import { Messages } from './Updates.messages'; import { Page } from 'components/page'; import { useSettings } from 'hooks/api/useSettings'; import { PMM_SETTINGS_URL } from 'constants'; +import { UpdateFooter } from './update-footer'; export const Updates: FC = () => { const { data: settings } = useSettings(); return ( - + }> diff --git a/ui/src/pages/updates/update-card/UpdateCard.tsx b/ui/src/pages/updates/update-card/UpdateCard.tsx index 8cd492801d..234e3cb322 100644 --- a/ui/src/pages/updates/update-card/UpdateCard.tsx +++ b/ui/src/pages/updates/update-card/UpdateCard.tsx @@ -9,7 +9,7 @@ import { Skeleton, Alert, } from '@mui/material'; -import { FC, useMemo, useState } from 'react'; +import { FC } from 'react'; import { formatTimestamp } from 'utils/formatTimestamp'; import { PMM_HOME_URL } from 'constants'; import { Messages } from './UpdateCard.messages'; @@ -22,23 +22,13 @@ import { UpdateStatus } from 'types/updates.types'; import { KeyboardDoubleArrowUp } from '@mui/icons-material'; import { UpdateInfo } from '../update-info'; import { UpdateInProgressCard } from '../update-in-progress-card'; +import { useUpdates } from 'contexts/updates'; export const UpdateCard: FC = () => { + const { inProgress, status, setStatus } = useUpdates(); const { isLoading, data, error, isRefetching, refetch } = useCheckUpdates(); const { mutate: startUpdate } = useStartUpdate(); const { waitForReadiness } = useWaitForReadiness(); - const [status, setStatus] = useState(UpdateStatus.Pending); - const isUpToDate = useMemo( - () => data?.installed.version === data?.latest?.version, - [data] - ); - const updateInProgress = useMemo( - () => - status === UpdateStatus.Updating || - status === UpdateStatus.Restarting || - status === UpdateStatus.Completed, - [status] - ); const handleStartUpdate = async () => { setStatus(UpdateStatus.Updating); @@ -84,14 +74,14 @@ export const UpdateCard: FC = () => { ); } - if (updateInProgress && data.latest) { + if (inProgress && data.latest) { return ; } return ( - {isUpToDate && ( + {status === UpdateStatus.UpToDate && ( `PMM ${version}`, + inProgress: 'Update in progress...', + checkedOn: (date: string) => `Checked on: ${date}`, + checkNow: 'Check updates now', +}; diff --git a/ui/src/pages/updates/update-footer/UpdateFooter.tsx b/ui/src/pages/updates/update-footer/UpdateFooter.tsx new file mode 100644 index 0000000000..76495574cf --- /dev/null +++ b/ui/src/pages/updates/update-footer/UpdateFooter.tsx @@ -0,0 +1,30 @@ +import { Link, Stack, Typography } from '@mui/material'; +import { useUpdates } from 'contexts/updates'; +import { FC } from 'react'; +import { formatCheckDate } from './UpdateFooter.utils'; +import { Messages } from './UpdateFooter.messages'; + +export const UpdateFooter: FC = () => { + const { inProgress, versionInfo, recheck } = useUpdates(); + + console.log({ versionInfo }); + if (!versionInfo) return null; + + return ( + + + {Messages.version(versionInfo.installed.version)} + + + {inProgress + ? Messages.inProgress + : Messages.checkedOn(formatCheckDate(versionInfo.lastCheck))} + + {!inProgress && ( + + {Messages.checkNow} + + )} + + ); +}; diff --git a/ui/src/pages/updates/update-footer/UpdateFooter.utils.ts b/ui/src/pages/updates/update-footer/UpdateFooter.utils.ts new file mode 100644 index 0000000000..57808679e2 --- /dev/null +++ b/ui/src/pages/updates/update-footer/UpdateFooter.utils.ts @@ -0,0 +1,2 @@ +export const formatCheckDate = (date: string) => + new Date(date).toLocaleDateString('en-US'); diff --git a/ui/src/pages/updates/update-footer/index.ts b/ui/src/pages/updates/update-footer/index.ts new file mode 100644 index 0000000000..1c597e2ad1 --- /dev/null +++ b/ui/src/pages/updates/update-footer/index.ts @@ -0,0 +1 @@ +export * from './UpdateFooter'; diff --git a/ui/src/types/updates.types.ts b/ui/src/types/updates.types.ts index 9584805403..c6dbde9810 100644 --- a/ui/src/types/updates.types.ts +++ b/ui/src/types/updates.types.ts @@ -5,7 +5,7 @@ export interface GetUpdatesParams { export interface CurrentInfo { version: string; - full_version: string; + fullVersion: string; timestamp: string | null; } @@ -49,4 +49,6 @@ export enum UpdateStatus { Restarting = 'restarting', Completed = 'completed', Error = 'error', + Checking = 'checking', + UpToDate = 'up-to-date', } From 4b8741b35f50a053b9faa9a22f7ade852a1fac67 Mon Sep 17 00:00:00 2001 From: Matej Kubinec Date: Wed, 31 Jul 2024 14:04:14 +0200 Subject: [PATCH 44/74] PMM-12930 Refactor footer --- .../footer/Footer.messages.ts} | 1 - ui/src/components/footer/Footer.test.tsx | 58 +++++++++++++++++++ .../footer/Footer.tsx} | 16 ++--- ui/src/components/footer/Footer.utils.ts | 2 + ui/src/components/footer/index.ts | 1 + ui/src/components/page/Page.tsx | 3 +- ui/src/contexts/auth/index.ts | 1 + ui/src/contexts/updates/index.ts | 1 + ui/src/pages/updates/Updates.tsx | 3 +- .../update-footer/UpdateFooter.utils.ts | 2 - ui/src/pages/updates/update-footer/index.ts | 1 - 11 files changed, 71 insertions(+), 18 deletions(-) rename ui/src/{pages/updates/update-footer/UpdateFooter.messages.ts => components/footer/Footer.messages.ts} (83%) create mode 100644 ui/src/components/footer/Footer.test.tsx rename ui/src/{pages/updates/update-footer/UpdateFooter.tsx => components/footer/Footer.tsx} (52%) create mode 100644 ui/src/components/footer/Footer.utils.ts create mode 100644 ui/src/components/footer/index.ts delete mode 100644 ui/src/pages/updates/update-footer/UpdateFooter.utils.ts delete mode 100644 ui/src/pages/updates/update-footer/index.ts diff --git a/ui/src/pages/updates/update-footer/UpdateFooter.messages.ts b/ui/src/components/footer/Footer.messages.ts similarity index 83% rename from ui/src/pages/updates/update-footer/UpdateFooter.messages.ts rename to ui/src/components/footer/Footer.messages.ts index 518b7b7f3b..03093e8481 100644 --- a/ui/src/pages/updates/update-footer/UpdateFooter.messages.ts +++ b/ui/src/components/footer/Footer.messages.ts @@ -2,5 +2,4 @@ export const Messages = { version: (version: string) => `PMM ${version}`, inProgress: 'Update in progress...', checkedOn: (date: string) => `Checked on: ${date}`, - checkNow: 'Check updates now', }; diff --git a/ui/src/components/footer/Footer.test.tsx b/ui/src/components/footer/Footer.test.tsx new file mode 100644 index 0000000000..774c563042 --- /dev/null +++ b/ui/src/components/footer/Footer.test.tsx @@ -0,0 +1,58 @@ +import { screen, render } from '@testing-library/react'; +import { UpdatesContext, UpdatesContextProps } from 'contexts/updates'; +import { Footer } from './Footer'; +import { UpdateStatus } from 'types/updates.types'; +import { Messages } from './Footer.messages'; + +const renderWithProvider = (value: Partial = {}) => + render( + {}, + setStatus: () => {}, + versionInfo: { + installed: { + version: '3.0.0', + fullVersion: '3.0.0', + timestamp: '2024-07-23T00:00:00Z', + }, + latest: { + version: '3.0.0', + tag: '', + timestamp: null, + }, + updateAvailable: false, + latestNewsUrl: 'https://per.co.na/pmm/3.0.0', + lastCheck: '2024-07-30T10:34:05.886739003Z', + }, + ...value, + }} + > +