From 2250c1a177739941e1bb9ed3369caf6b90f7af32 Mon Sep 17 00:00:00 2001 From: Gregory Mallios Date: Sun, 3 Mar 2024 18:32:56 +0200 Subject: [PATCH] feat(ui): Add eslint and prettier, reformat code and fix ts errors --- .eslintrc.cjs | 39 + .prettierrc | 8 + package.json | 10 + src/App.tsx | 64 +- src/components/ANCModeCard/ANCModeCard.tsx | 91 +- src/components/ANCModeCard/base.tsx | 491 +++--- src/components/AppBar.tsx | 26 +- src/components/DeviceList.tsx | 71 +- src/components/DeviceListItem.tsx | 50 +- src/components/DisconnectedScreen.tsx | 117 +- src/components/EQCard.tsx | 102 +- src/components/OverviewCard.tsx | 337 ++-- src/hooks/useAsyncBridge.tsx | 21 + src/hooks/useBluetooth.tsx | 83 +- src/hooks/useDeviceStore.tsx | 74 +- src/hooks/useSoundcoreDevice.tsx | 241 +-- src/hooks/useTray.tsx | 86 +- src/main.tsx | 33 +- src/stores/baseSlice.tsx | 52 + src/stores/bluetoothSlice.tsx | 12 + src/stores/deviceStateSlice.tsx | 15 + src/stores/useSoundcoreStore.tsx | 12 + src/types/soundcore-lib.d.ts | 107 +- src/types/tauri-backend.d.ts | 73 +- yarn.lock | 1686 +++++++++++++++++++- 25 files changed, 2965 insertions(+), 936 deletions(-) create mode 100644 .eslintrc.cjs create mode 100644 .prettierrc create mode 100644 src/hooks/useAsyncBridge.tsx create mode 100644 src/stores/baseSlice.tsx create mode 100644 src/stores/bluetoothSlice.tsx create mode 100644 src/stores/deviceStateSlice.tsx create mode 100644 src/stores/useSoundcoreStore.tsx diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..c8e3c57 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,39 @@ +module.exports = { + env: { + browser: true, + es2021: true, + jest: true + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react/recommended', + 'plugin:prettier/recommended' + ], + overrides: [ + { + env: { + node: true + }, + files: ['.eslintrc.{js,cjs}'], + parserOptions: { + sourceType: 'script' + } + } + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module' + }, + plugins: ['@typescript-eslint', 'react'], + rules: { + 'react/react-in-jsx-scope': 'off', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }] + }, + settings: { + react: { + version: 'detect' + } + } +}; diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..f829f0a --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "tabWidth": 2, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "none", + "jsxBracketSameLine": true +} diff --git a/package.json b/package.json index f8484a9..3799705 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,9 @@ "version": "0.1.0", "type": "module", "scripts": { + "lint": "eslint ./src", + "lint:fix": "eslint --fix ./src", + "format": "prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc", "dev": "vite", "build-bindings": "cargo test --manifest-path ./src-tauri/Cargo.toml", "build": "tsc && vite build", @@ -35,7 +38,14 @@ "@types/node": "^18.7.10", "@types/react": "^18.2.6", "@types/react-dom": "^18.0.6", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-react": "^7.33.2", + "prettier": "^3.2.5", "typescript": "^5.0.4", "vite": "^4.3.1" } diff --git a/src/App.tsx b/src/App.tsx index 2200e44..c5a5403 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,17 +1,22 @@ -import React, { useEffect, useState } from "react"; -import "./App.css"; -import OverviewCard from "./components/OverviewCard"; -import EQCard from "./components/EQCard"; -import AppBar from "./components/AppBar"; -import useDeviceStore, { DeviceConnectionState } from "./hooks/useDeviceStore"; +import React, { useEffect } from 'react'; +import './App.css'; +import OverviewCard from './components/OverviewCard'; +import EQCard from './components/EQCard'; +import useDeviceStore, { DeviceConnectionState } from './hooks/useDeviceStore'; import Stack from '@mui/material/Stack'; -import ANCModeCard from "./components/ANCModeCard/ANCModeCard"; -import DisconnectedScreen from "./components/DisconnectedScreen"; -import { ITrayStatus, setTrayMenu, useUpdateTray, useWindowEvent } from "./hooks/useTray"; -import { CircularProgress } from "@mui/material"; -import { useANC, useBatteryLevel, useCharging, useDeviceModel, useStatus, useUpdateANC } from "./hooks/useSoundcoreDevice"; -import { ANCModes } from "./types/tauri-backend"; - +import ANCModeCard from './components/ANCModeCard/ANCModeCard'; +import DisconnectedScreen from './components/DisconnectedScreen'; +import { ITrayStatus, useUpdateTray, useWindowEvent } from './hooks/useTray'; +import { CircularProgress } from '@mui/material'; +import { + useANC, + useBatteryLevel, + useCharging, + useStatus, + useUpdateANC +} from './hooks/useSoundcoreDevice'; +import { ANCModes } from './types/tauri-backend'; +import { useSoundcoreStore } from './stores/useSoundcoreStore'; function App() { const { deviceConnectionState } = useDeviceStore(); @@ -20,27 +25,35 @@ function App() { const { data: charging, isSuccess: isBatteryChargingSuccess } = useCharging(); const { data: ancStatus, isSuccess: isANCStatusSuccess } = useANC(); const { data: devStatus, isSuccess: isStatusSuccess } = useStatus(); - const { data: deviceModel, isSuccess: isDeviceModelSuccess } = useDeviceModel(); - const isDataSuccess = isBatteryLevelSuccess && isBatteryChargingSuccess && isANCStatusSuccess && isStatusSuccess; - const isDataNotNull = level != undefined && charging != undefined && ancStatus != undefined && devStatus != undefined; + const isDataSuccess = + isBatteryLevelSuccess && isBatteryChargingSuccess && isANCStatusSuccess && isStatusSuccess; + const isDataNotNull = + level != undefined && charging != undefined && ancStatus != undefined && devStatus != undefined; const trayMutation = useUpdateTray(); const ancMutation = useUpdateANC(); + const deviceStates = useSoundcoreStore((state) => state.states); + + console.log('Device state: ', deviceStates); /* On Tray Event - Handles the anc submenu event */ - useWindowEvent("anc_sub_change", event => { + useWindowEvent('anc_sub_change', (event) => { ancMutation.mutate(event.payload as ANCModes); }); /* Update tray status on every change */ useEffect(() => { - if (deviceConnectionState == DeviceConnectionState.CONNECTED && isDataSuccess && isDataNotNull) { - let trayStatus: ITrayStatus = { + if ( + deviceConnectionState == DeviceConnectionState.CONNECTED && + isDataSuccess && + isDataNotNull + ) { + const trayStatus: ITrayStatus = { deviceConnectionState: deviceConnectionState, level, charging, - anc_mode: ancStatus, - } + anc_mode: ancStatus + }; trayMutation.mutate(trayStatus); } }, [level, charging, ancStatus, deviceConnectionState]); @@ -61,7 +74,14 @@ function App() { ) : ( -
+
)} diff --git a/src/components/ANCModeCard/ANCModeCard.tsx b/src/components/ANCModeCard/ANCModeCard.tsx index 468d0a5..b88fbcb 100644 --- a/src/components/ANCModeCard/ANCModeCard.tsx +++ b/src/components/ANCModeCard/ANCModeCard.tsx @@ -1,49 +1,46 @@ -import { useDeviceModel } from "../../hooks/useSoundcoreDevice"; -import { ANCModes } from "../../types/tauri-backend"; -import BaseANCModeCard, { ANCSliderProps } from "./base"; +import { useDeviceModel } from '../../hooks/useSoundcoreDevice'; +import { ANCModes } from '../../types/tauri-backend'; +import BaseANCModeCard from './base'; export default function ANCModeCard() { - let { data: model } = useDeviceModel(); - let Component = (props: ANCSliderProps) =>
; - let ancButtons: Array<[string, ANCModes]> = []; - let transButtons: Array<[string, ANCModes]> = []; - - switch (model) { - case "A3935": - case "A3951": - Component = BaseANCModeCard; - ancButtons = - [ - ["Transport", { mode: "AncTransportMode" }], - ["Outdoor", { mode: "AncOutdoorMode" }], - ["Indoor", { mode: "AncIndoorMode" }], - ["Custom", { mode: "AncCustomValue", value: 0 }] - ]; - transButtons = [ - ["Fully Trasparent", { mode: "TransparencyFullyTransparentMode" }], - ["Vocal Mode", { mode: "TransparencyVocalMode" }] - ]; - break; - case "A3027": - case "A3028": - case "A3029": - Component = BaseANCModeCard; - ancButtons = - [ - ["Transport", { mode: "AncTransportMode" }], - ["Outdoor", { mode: "AncOutdoorMode" }], - ["Indoor", { mode: "AncIndoorMode" }], - ]; - transButtons = [["Fully Trasparent", { mode: "TransparencyFullyTransparentMode"}]]; - break; - default: - Component = () =>
Not implemented
; - break; - } - - console.log("Model: " + model); - - return ( - - ) -} \ No newline at end of file + const { data: model } = useDeviceModel(); + let Component = () =>
; + let ancButtons: Array<[string, ANCModes]> = []; + let transButtons: Array<[string, ANCModes]> = []; + const defaultComponent = () => { + return
Not implemented
; + }; + switch (model) { + case 'A3935': + case 'A3951': + Component = BaseANCModeCard; + ancButtons = [ + ['Transport', { mode: 'AncTransportMode' }], + ['Outdoor', { mode: 'AncOutdoorMode' }], + ['Indoor', { mode: 'AncIndoorMode' }], + ['Custom', { mode: 'AncCustomValue', value: 0 }] + ]; + transButtons = [ + ['Fully Trasparent', { mode: 'TransparencyFullyTransparentMode' }], + ['Vocal Mode', { mode: 'TransparencyVocalMode' }] + ]; + break; + case 'A3027': + case 'A3028': + case 'A3029': + Component = BaseANCModeCard; + ancButtons = [ + ['Transport', { mode: 'AncTransportMode' }], + ['Outdoor', { mode: 'AncOutdoorMode' }], + ['Indoor', { mode: 'AncIndoorMode' }] + ]; + transButtons = [['Fully Trasparent', { mode: 'TransparencyFullyTransparentMode' }]]; + break; + default: + Component = defaultComponent; + break; + } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + return ; +} diff --git a/src/components/ANCModeCard/base.tsx b/src/components/ANCModeCard/base.tsx index bf9e29c..df7595d 100644 --- a/src/components/ANCModeCard/base.tsx +++ b/src/components/ANCModeCard/base.tsx @@ -1,257 +1,318 @@ -import { Button, Collapse, Grid, Icon, Paper, Slider, Stack, styled } from "@mui/material"; -import { Children, ReactNode, useEffect, useState } from "react"; -import ANCIcon from "../../assets/ambient_icon_anc.png"; -import NormalIcon from "../../assets/ambient_icon_off.png"; -import TransIcon from "../../assets/ambient_icon_trans.png"; -import useDeviceStore from "../../hooks/useDeviceStore"; -import { useANC, useUpdateANC } from "../../hooks/useSoundcoreDevice"; -import { ANCModes } from "../../types/tauri-backend"; +import { Button, Collapse, Grid, Icon, Paper, Slider, Stack, styled } from '@mui/material'; +import { ReactNode, useEffect, useState } from 'react'; +import ANCIcon from '../../assets/ambient_icon_anc.png'; +import NormalIcon from '../../assets/ambient_icon_off.png'; +import TransIcon from '../../assets/ambient_icon_trans.png'; +import { useANC, useUpdateANC } from '../../hooks/useSoundcoreDevice'; +import { ANCModes } from '../../types/tauri-backend'; const width = window.innerWidth - 35; const Metrics = { - containerWidth: width - 30, - switchWidth: width / 2.7, -} + containerWidth: width - 30, + switchWidth: width / 2.7 +}; -const ANCSliderContainer = styled("div")(({ theme }) => ({ - width: Metrics.containerWidth, - height: 55, - display: "flex", - flexDirection: "row", - backgroundColor: theme.palette.background.paper, - alignItems: "center", - justifyContent: "center", - borderWidth: 1, - borderColor: theme.palette.divider, - borderStyle: "solid", - borderRadius: 27.5, +const ANCSliderContainer = styled('div')(({ theme }) => ({ + width: Metrics.containerWidth, + height: 55, + display: 'flex', + flexDirection: 'row', + backgroundColor: theme.palette.background.paper, + alignItems: 'center', + justifyContent: 'center', + borderWidth: 1, + borderColor: theme.palette.divider, + borderStyle: 'solid', + borderRadius: 27.5 })); -export type AllowedSliderPositions = "left" | "right" | "center" | null; +export type AllowedSliderPositions = 'left' | 'right' | 'center' | null; interface ANCSliderSwitcherProps { - position: AllowedSliderPositions; + position: AllowedSliderPositions; } -const ANCSliderSwitcher = styled("div", { - shouldForwardProp: (prop) => prop !== "position", +const ANCSliderSwitcher = styled('div', { + shouldForwardProp: (prop) => prop !== 'position' })(({ position, theme }) => ({ - /* Remove border radius for miiddle item and animate it */ - zIndex: 2, - display: "flex", - flexDirection: "row", - position: "absolute", - backgroundColor: theme.palette.primary.dark, - borderRadius: 28, - height: 53, - alignItems: "center", - justifyContent: "center", - width: Metrics.switchWidth, - elevation: 4, - shadowColor: "black", - shadowRadius: 10, - shadowOpacity: 0.31, - transition: "transform 0.32s cubic-bezier(0.87, 0, 0.13, 1)", - ...(position == "left" && { - transform: "translateX(-78%)", - }), - ...(position == "right" && { - transform: "translateX(78%)", - }), - ...(position == "center" && { - transform: "translateX(0)", - }), - + /* Remove border radius for miiddle item and animate it */ + zIndex: 2, + display: 'flex', + flexDirection: 'row', + position: 'absolute', + backgroundColor: theme.palette.primary.dark, + borderRadius: 28, + height: 53, + alignItems: 'center', + justifyContent: 'center', + width: Metrics.switchWidth, + elevation: 4, + shadowColor: 'black', + shadowRadius: 10, + shadowOpacity: 0.31, + transition: 'transform 0.32s cubic-bezier(0.87, 0, 0.13, 1)', + ...(position == 'left' && { + transform: 'translateX(-78%)' + }), + ...(position == 'right' && { + transform: 'translateX(78%)' + }), + ...(position == 'center' && { + transform: 'translateX(0)' + }) })); const ANCSliderButton = styled(Button, { - shouldForwardProp: (prop) => prop !== "position", -})(({ theme, position }) => ({ - display: "flex", - flex: 1, - width: Metrics.containerWidth / 3, - height: 54, - justifyContent: "center", - alignItems: "center", - ...(position == "left" && { - borderRadius: "28px 0 0 28px", - }), - ...(position == "center" && { - borderRadius: "0 0 0 0", - }), - ...(position == "right" && { - borderRadius: "0 28px 28px 0", - }), + shouldForwardProp: (prop) => prop !== 'position' +})(({ position }) => ({ + display: 'flex', + flex: 1, + width: Metrics.containerWidth / 3, + height: 54, + justifyContent: 'center', + alignItems: 'center', + ...(position == 'left' && { + borderRadius: '28px 0 0 28px' + }), + ...(position == 'center' && { + borderRadius: '0 0 0 0' + }), + ...(position == 'right' && { + borderRadius: '0 28px 28px 0' + }) })); - export interface ANCSliderProps { - ancModes: Array<[string, ANCModes]>; - transModes: Array<[string, ANCModes]>; + ancModes: Array<[string, ANCModes]>; + transModes: Array<[string, ANCModes]>; } export default function BaseANCModeCard() { + const { data: currentANCMode, isSuccess } = useANC(); + const ancMutation = useUpdateANC(); - const { data: currentANCMode, isSuccess } = useANC(); - let ancMutation = useUpdateANC(); - - let [sliderPosition, setSliderPosition] = useState(null); - let [sliderIcon, setSliderIcon] = useState(NormalIcon); - let [submenuOpen, setSubmenuOpen] = useState(false); - let [ancModeSelected, setAncModeSelected] = useState({ mode: "AncOutdoorMode" }); - let [transModeSelected, setTransModeSelected] = useState({ mode: "TransparencyFullyTransparentMode" }); - let [ancCustomValue, setAncCustomValue] = useState(10); - - - let ancButtons: Array<[string, ANCModes]> = - [ - ["Transport", { mode: "AncTransportMode" }], - ["Outdoor", { mode: "AncOutdoorMode" }], - ["Indoor", { mode: "AncIndoorMode" }], - ["Custom", { mode: "AncCustomValue", value: 0 }] - ]; + const [sliderPosition, setSliderPosition] = useState(null); + const [sliderIcon, setSliderIcon] = useState(NormalIcon); + const [submenuOpen, setSubmenuOpen] = useState(false); + const [ancModeSelected, setAncModeSelected] = useState({ mode: 'AncOutdoorMode' }); + const [transModeSelected, setTransModeSelected] = useState({ + mode: 'TransparencyFullyTransparentMode' + }); + const [ancCustomValue, setAncCustomValue] = useState(10); - let transButtons: Array<[string, ANCModes]> = - [ - ["Fully Trasparent", { mode: "TransparencyFullyTransparentMode"}], - ["Vocal Mode", { mode: "TransparencyVocalMode" }] - ]; + const ancButtons: Array<[string, ANCModes]> = [ + ['Transport', { mode: 'AncTransportMode' }], + ['Outdoor', { mode: 'AncOutdoorMode' }], + ['Indoor', { mode: 'AncIndoorMode' }], + ['Custom', { mode: 'AncCustomValue', value: 0 }] + ]; - useEffect(() => { - /* Update component from current ANC mode */ - if (!isSuccess) return; + const transButtons: Array<[string, ANCModes]> = [ + ['Fully Trasparent', { mode: 'TransparencyFullyTransparentMode' }], + ['Vocal Mode', { mode: 'TransparencyVocalMode' }] + ]; - if (currentANCMode.mode == "NormalMode") { - setSliderPosition("center"); - } else if (currentANCMode.mode == "TransparencyFullyTransparentMode" || currentANCMode.mode == "TransparencyVocalMode") { - setSliderPosition("right"); - setTransModeSelected(currentANCMode); - } else { - setSliderPosition("left"); - if (currentANCMode.mode == "AncCustomValue") { - setAncCustomValue(currentANCMode.value); - setAncModeSelected({mode: "AncCustomValue", value: currentANCMode.value}); - } else { - setAncModeSelected(currentANCMode!); - } - } - }, [isSuccess]); + useEffect(() => { + /* Update component from current ANC mode */ + if (!isSuccess) return; + if (currentANCMode.mode == 'NormalMode') { + setSliderPosition('center'); + } else if ( + currentANCMode.mode == 'TransparencyFullyTransparentMode' || + currentANCMode.mode == 'TransparencyVocalMode' + ) { + setSliderPosition('right'); + setTransModeSelected(currentANCMode); + } else { + setSliderPosition('left'); + if (currentANCMode.mode == 'AncCustomValue') { + setAncCustomValue(currentANCMode.value); + setAncModeSelected({ mode: 'AncCustomValue', value: currentANCMode.value }); + } else { + setAncModeSelected(currentANCMode!); + } + } + }, [isSuccess]); - useEffect(() => { - if (sliderPosition == "center") { - ancMutation.mutate({ mode: "NormalMode" }); - setSubmenuOpen(false); - } else if (sliderPosition == "left") { - if (ancModeSelected.mode != "AncCustomValue") { - ancMutation.mutate(ancModeSelected); - } - setSubmenuOpen(true); - } else if (sliderPosition == "right") { - ancMutation.mutate(transModeSelected); - setSubmenuOpen(true); - } - }, [sliderPosition]); + useEffect(() => { + if (sliderPosition == 'center') { + ancMutation.mutate({ mode: 'NormalMode' }); + setSubmenuOpen(false); + } else if (sliderPosition == 'left') { + if (ancModeSelected.mode != 'AncCustomValue') { + ancMutation.mutate(ancModeSelected); + } + setSubmenuOpen(true); + } else if (sliderPosition == 'right') { + ancMutation.mutate(transModeSelected); + setSubmenuOpen(true); + } + }, [sliderPosition]); - useEffect(() => { - if (sliderPosition == "left") { - if (ancModeSelected.mode == "AncCustomValue") { - if (ancCustomValue == null) { - setAncCustomValue(10); - } - ancMutation.mutate({ mode: "AncCustomValue", value: ancCustomValue as number }); - } else { - ancMutation.mutate(ancModeSelected); - } + useEffect(() => { + if (sliderPosition == 'left') { + if (ancModeSelected.mode == 'AncCustomValue') { + if (ancCustomValue == null) { + setAncCustomValue(10); } - console.log(ancModeSelected); - }, [ancModeSelected, ancCustomValue]); + ancMutation.mutate({ mode: 'AncCustomValue', value: ancCustomValue as number }); + } else { + ancMutation.mutate(ancModeSelected); + } + } + console.log(ancModeSelected); + }, [ancModeSelected, ancCustomValue]); - useEffect(() => { - if (sliderPosition == "right") { - ancMutation.mutate(transModeSelected); - } - }, [transModeSelected]); + useEffect(() => { + if (sliderPosition == 'right') { + ancMutation.mutate(transModeSelected); + } + }, [transModeSelected]); - return ( - - - - - - - - - - - - - - - - - - - {ancCustomValue != null && - setAncCustomValue(newValue)} - onChangeCommitted={(_, newValue) => setAncCustomValue(newValue)} - sx={{ mt: 2, pb: 0, width: "98%" }} - min={0} - max={10} - marks - aria-label="Small" - valueLabelDisplay="auto" - />} - - - - - - - ) -}; - -enum ANCCardButtonVariant { - NOISE_CANCELLING, - NORMAL_MODE, - TRANSPARENCY_MODE + return ( + + + + + + + + + + + + + + + + + + + {ancCustomValue != null && ( + setAncCustomValue(newValue)} + onChangeCommitted={(_, newValue) => setAncCustomValue(newValue)} + sx={{ mt: 2, pb: 0, width: '98%' }} + min={0} + max={10} + marks + aria-label="Small" + valueLabelDisplay="auto" + /> + )} + + + + + + + ); } -function ANCCardButton({ setSliderIcon, setSliderPosition, position, icon }: { setSliderIcon: React.Dispatch>, setSliderPosition: React.Dispatch>, position: AllowedSliderPositions, icon: string }) { - return ( - { setSliderPosition(position); setSliderIcon(icon); }}> - - - - - ); +function ANCCardButton({ + setSliderIcon, + setSliderPosition, + position, + icon +}: { + setSliderIcon: React.Dispatch>; + setSliderPosition: React.Dispatch>; + position: AllowedSliderPositions; + icon: string; +}) { + return ( + { + setSliderPosition(position); + setSliderIcon(icon); + }}> + + + + + ); } interface ANCModeButtonProps { - active?: boolean + active?: boolean; } const ANCModeButton = styled(Button, { - shouldForwardProp: (prop) => prop !== "active", + shouldForwardProp: (prop) => prop !== 'active' })(({ theme, active }) => ({ - //width: "100px", - backgroundColor: active ? theme.palette.primary.dark : "transparent", - color: active ? theme.palette.text.primary : theme.palette.text.secondary, + //width: "100px", + backgroundColor: active ? theme.palette.primary.dark : 'transparent', + color: active ? theme.palette.text.primary : theme.palette.text.secondary })); - -function ButtonGrid({ children, buttonArray, setButtonSelected, buttonSelected }: { children: ReactNode, buttonArray: Array<[string, ANCModes]>, setButtonSelected: React.Dispatch>, buttonSelected: any }) { - return ( - - - {buttonArray.map(([title, mode]) => ( - { setButtonSelected(mode) }} size="small">{title} - ))} - - {children} - ); -} \ No newline at end of file +function ButtonGrid({ + children, + buttonArray, + setButtonSelected, + buttonSelected +}: { + children: ReactNode; + buttonArray: Array<[string, ANCModes]>; + setButtonSelected: React.Dispatch>; + buttonSelected: { mode: string }; +}) { + return ( + + + {buttonArray.map(([title, mode]) => ( + + { + setButtonSelected(mode); + }} + size="small"> + {title} + + + ))} + + {children} + + ); +} diff --git a/src/components/AppBar.tsx b/src/components/AppBar.tsx index 6637c33..ac56bd2 100644 --- a/src/components/AppBar.tsx +++ b/src/components/AppBar.tsx @@ -1,18 +1,16 @@ -import { AppBar as MUIBar, Box, Toolbar } from "@mui/material"; -import SettingsIcon from '@mui/icons-material/Settings'; +import { AppBar as MUIBar, Box, Toolbar } from '@mui/material'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import MoreVertIcon from '@mui/icons-material/MoreVert'; -import React from "react"; export default function AppBar() { - return ( - - - - - - - - - ); -} \ No newline at end of file + return ( + + + + + + + + + ); +} diff --git a/src/components/DeviceList.tsx b/src/components/DeviceList.tsx index 98991e3..dc21b0e 100644 --- a/src/components/DeviceList.tsx +++ b/src/components/DeviceList.tsx @@ -1,43 +1,46 @@ -import React, { useEffect } from "react"; -import { List, SxProps, } from "@mui/material"; -import DeviceListItem from "./DeviceListItem"; -import { BthScanResult } from "../types/tauri-backend"; - +import React, { useEffect } from 'react'; +import { List, SxProps } from '@mui/material'; +import DeviceListItem from './DeviceListItem'; +import { BthScanResult } from '../types/tauri-backend'; interface IDeviceListProps { - devices: BthScanResult[] | undefined; - sx: SxProps; - setSelectedDevice: (device: BthScanResult) => void; + devices: BthScanResult[] | undefined; + sx: SxProps; + setSelectedDevice: (device: BthScanResult) => void; } export default function DeviceList(props: IDeviceListProps) { - const { devices, sx, setSelectedDevice } = props; + const { devices, sx, setSelectedDevice } = props; - if (devices) { - // const connectedDevices = devices.filter(device => device.is_connected); - const connectedDevices = devices; - const [selectedIndex, setSelectedIndex] = React.useState(0); + if (devices) { + // const connectedDevices = devices.filter(device => device.is_connected); + const connectedDevices = devices; + const [selectedIndex, setSelectedIndex] = React.useState(0); - useEffect(() => { - setSelectedDevice(connectedDevices[selectedIndex]); - }, [selectedIndex]); + useEffect(() => { + setSelectedDevice(connectedDevices[selectedIndex]); + }, [selectedIndex]); - return ( - - - {devices && connectedDevices.map((device, idx) => ( - { setSelectedIndex(idx); }} /> - ))} - - - ); - } else { - return ; - } + return ( + + + {devices && + connectedDevices.map((device, idx) => ( + { + setSelectedIndex(idx); + }} + /> + ))} + + + ); + } else { + return ; + } } diff --git a/src/components/DeviceListItem.tsx b/src/components/DeviceListItem.tsx index d2e8e37..aad0610 100644 --- a/src/components/DeviceListItem.tsx +++ b/src/components/DeviceListItem.tsx @@ -1,31 +1,35 @@ -import { ListItem, ListItemButton, ListItemIcon, ListItemText } from "@mui/material"; +import { ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import BluetoothIcon from '@mui/icons-material/Bluetooth'; import DoneIcon from '@mui/icons-material/Done'; export interface IDeviceListItemProps { - name: string; - isConnected: boolean; - isSelected: boolean; - idx: number; - onItemClicked: (event: React.MouseEvent, index: number) => void; + name: string; + isConnected: boolean; + isSelected: boolean; + idx: number; + onItemClicked: (event: React.MouseEvent, index: number) => void; } export default function DeviceListItem(props: IDeviceListItemProps) { - const { name, isConnected, isSelected, onItemClicked, idx } = props; + const { name, isConnected, isSelected, onItemClicked, idx } = props; - return ( - - { onItemClicked(event, idx); }}> - - - - - {isConnected && - - - - } - - - ); -} \ No newline at end of file + return ( + + { + onItemClicked(event, idx); + }}> + + + + + {isConnected && ( + + + + )} + + + ); +} diff --git a/src/components/DisconnectedScreen.tsx b/src/components/DisconnectedScreen.tsx index eef5d0e..909b852 100644 --- a/src/components/DisconnectedScreen.tsx +++ b/src/components/DisconnectedScreen.tsx @@ -1,60 +1,75 @@ -import React, { useEffect } from "react"; -import { CircularProgress, Fab, Stack, Typography } from "@mui/material"; -import { useSearch } from "../hooks/useBluetooth"; -import DeviceList from "./DeviceList"; +import React, { useEffect } from 'react'; +import { CircularProgress, Fab, Stack, Typography } from '@mui/material'; +import { useSearch } from '../hooks/useBluetooth'; +import DeviceList from './DeviceList'; import ArrowForwardIcon from '@mui/icons-material/ArrowForward'; -import useDeviceStore, { DeviceConnectionState } from "../hooks/useDeviceStore"; -import { setTrayMenu } from "../hooks/useTray"; -import { BthScanResult } from "../types/tauri-backend"; - - - +import useDeviceStore, { DeviceConnectionState } from '../hooks/useDeviceStore'; +import { setTrayMenu } from '../hooks/useTray'; +import { BthScanResult } from '../types/tauri-backend'; export default function DisconnectedScreen() { - //const { loading, data } = scanForDevices(); - const { isLoading, data } = useSearch(); - const { connectUUID } = useDeviceStore(); - const [selectedDevice, setSelectedDevice] = React.useState(); - const { setDeviceConnectionState, close } = useDeviceStore(); - const { updateDeviceModel } = useDeviceStore((state) => ({ - deviceModel: state.deviceModel, - updateDeviceModel: state.updateDeviceModel, - shallow: true - })); + const { isLoading, data } = useSearch(); + const { connectUUID } = useDeviceStore(); + const [selectedDevice, setSelectedDevice] = React.useState(); + const { close } = useDeviceStore(); + useDeviceStore((state) => ({ + deviceModel: state.deviceModel, + updateDeviceModel: state.updateDeviceModel, + shallow: true + })); - - - useEffect(() => { - // setDeviceConnectionState(DeviceConnectionState.DISCONNECTED); - setTrayMenu(DeviceConnectionState.DISCONNECTED); - close(); - }, []); + useEffect(() => { + // setDeviceConnectionState(DeviceConnectionState.DISCONNECTED); + setTrayMenu(DeviceConnectionState.DISCONNECTED); + close(); + }, []); - const handleFabClick = () => { - if (selectedDevice) { - console.log("Connecting to: " + selectedDevice.address) - connectUUID(selectedDevice.name , selectedDevice.address); - } - }; - - if (isLoading) { - return ( -
- -
- ); + const handleFabClick = () => { + if (selectedDevice) { + console.log('Connecting to: ' + selectedDevice.address); + connectUUID(selectedDevice.name, selectedDevice.address); } + }; + if (isLoading) { return ( -
- - Select a connected device... - - handleFabClick()} variant="extended" size="medium" color="primary" aria-label="add" sx={{ position: "absolute", bottom: 16, right: 16 }}> - Connect - - - -
+
+ +
); -} \ No newline at end of file + } + + return ( +
+ + Select a connected device... + + handleFabClick()} + variant="extended" + size="medium" + color="primary" + aria-label="add" + sx={{ position: 'absolute', bottom: 16, right: 16 }}> + Connect + + + +
+ ); +} diff --git a/src/components/EQCard.tsx b/src/components/EQCard.tsx index 4231b80..9816f5c 100644 --- a/src/components/EQCard.tsx +++ b/src/components/EQCard.tsx @@ -1,5 +1,5 @@ -import React, { useEffect, useState } from "react"; -import { Line } from "react-chartjs-2"; +import { useEffect, useState } from 'react'; +import { Line } from 'react-chartjs-2'; import 'chartjs-plugin-dragdata'; import { Chart as ChartJS, @@ -10,11 +10,11 @@ import { Title, Tooltip, Legend, - Filler, + Filler } from 'chart.js'; -import { Button, Paper } from "@mui/material"; -import useDeviceStore, { EQWave } from "../hooks/useDeviceStore"; -import { useStatus, useUpdateEQ } from "../hooks/useSoundcoreDevice"; +import { Paper } from '@mui/material'; +import { EQWave } from '../hooks/useDeviceStore'; +import { useStatus, useUpdateEQ } from '../hooks/useSoundcoreDevice'; ChartJS.register( CategoryScale, @@ -24,14 +24,10 @@ ChartJS.register( Title, Tooltip, Legend, - Filler, + Filler ); - - - export default function EQCard() { - const options = { dragData: true, scales: { @@ -40,23 +36,20 @@ export default function EQCard() { max: 6, min: -6, grid: { - display: false, + display: false } }, x: { grid: { - display: false, + display: false } } }, // Set cursor - onHover(e: any) { - const point = e.chart.getElementsAtEventForMode( - e, - 'nearest', - { intersect: true }, - false - ); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + onHover(e) { + const point = e.chart.getElementsAtEventForMode(e, 'nearest', { intersect: true }, false); if (point.length) e.native.target.style.cursor = 'grab'; else e.native.target.style.cursor = 'default'; }, @@ -65,39 +58,37 @@ export default function EQCard() { round: 1, dragX: true, showTooltip: true, - onDragEnd: function (_e: any, _datasetIndex: any, index: string | number, value: number) { - let newDataSet = dataSet; + onDragEnd: function ( + _e: unknown, + _datasetIndex: number, + index: string | number, + value: number + ) { + const newDataSet = dataSet; newDataSet[index as number] = value; setDataSet(newDataSet.slice(0, 8)); } }, legend: { - display: false, + display: false }, title: { display: true, - text: 'EQ', - }, - }, - + text: 'EQ' + } + } }; - - const labels = ["100", "200", "400", "800", "1.6k", "3.2k", "6.4k", "12.8kHz"]; + const labels = ['100', '200', '400', '800', '1.6k', '3.2k', '6.4k', '12.8kHz']; const [dataSet, setDataSet] = useState([0, 0, 0, 0, 0, 0, 0, 0]); /* Values are in dB -6 to 6 */ const { data: status, isSuccess } = useStatus(); const updateEQ = useUpdateEQ(); const [isDataLoaded, setIsDataLoaded] = useState(false); function scale(number: number, inMin: number, inMax: number, outMin: number, outMax: number) { - return (number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin; - } - - function resetEQ() { - setDataSet([0, 0, 0, 0, 0, 0, 0, 0]); + return ((number - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin; } - useEffect(() => { if (status != undefined) { const newDataSet: number[] = []; @@ -120,32 +111,37 @@ export default function EQCard() { pos6: scale(dataSet[6], -6, 6, 6, 18), pos7: scale(dataSet[7], -6, 6, 6, 18), pos8: 12, - pos9: 12, + pos9: 12 }; updateEQ.mutate(eq); }, [dataSet]); - const data = { labels: labels, - datasets: [{ - data: dataSet, - borderColor: '9B9B9B', - borderWidth: 1, - pointRadius: 2, - pointHoverRadius: 3, - pointBackgroundColor: '#609ACF', - pointBorderWidth: 0, - spanGaps: false, - fill: true, - backgroundColor: 'rgba(53, 162, 235, 0.5)', - lineTension: 0.3, - }], + datasets: [ + { + data: dataSet, + borderColor: '9B9B9B', + borderWidth: 1, + pointRadius: 2, + pointHoverRadius: 3, + pointBackgroundColor: '#609ACF', + pointBorderWidth: 0, + spanGaps: false, + fill: true, + backgroundColor: 'rgba(53, 162, 235, 0.5)', + lineTension: 0.3 + } + ] }; return ( - - {isDataLoaded && <>} + + {isDataLoaded && ( + <> + + + )} ); -} \ No newline at end of file +} diff --git a/src/components/OverviewCard.tsx b/src/components/OverviewCard.tsx index fca9231..9fba08f 100644 --- a/src/components/OverviewCard.tsx +++ b/src/components/OverviewCard.tsx @@ -1,12 +1,11 @@ -import { Box, Card, CardContent, Grid, Paper, Typography } from "@mui/material"; -import useDeviceStore from "../hooks/useDeviceStore"; -import A3951ImgLeft from "./../assets/a3951_img_device_left.webp"; -import A3951ImgRight from "./../assets/a3951_img_device_right_edited.webp"; -import A3027Img from "./../assets/a3027_img_device.webp"; -import A3028Img from "./../assets/a3028_img_device.webp"; -import A3029Img from "./../assets/a3029_img_device.webp"; -import A3040Img from "./../assets/a3040_img_device.webp"; -import A3935Img from "./../assets/a3935_img_device.webp"; +import { Box, Grid, Paper, Typography } from '@mui/material'; +import A3951ImgLeft from './../assets/a3951_img_device_left.webp'; +import A3951ImgRight from './../assets/a3951_img_device_right_edited.webp'; +import A3027Img from './../assets/a3027_img_device.webp'; +import A3028Img from './../assets/a3028_img_device.webp'; +import A3029Img from './../assets/a3029_img_device.webp'; +import A3040Img from './../assets/a3040_img_device.webp'; +import A3935Img from './../assets/a3935_img_device.webp'; import BatteryAlertIcon from '@mui/icons-material/BatteryAlert'; import Battery20Icon from '@mui/icons-material/Battery20'; @@ -20,158 +19,206 @@ import BatteryCharging80Icon from '@mui/icons-material/BatteryCharging80'; import BatteryFullIcon from '@mui/icons-material/BatteryFull'; import BatteryChargingFullIcon from '@mui/icons-material/BatteryChargingFull'; import BatteryUnknownIcon from '@mui/icons-material/BatteryUnknown'; -import { useBatteryLevel, useCharging, useDeviceModel } from "../hooks/useSoundcoreDevice"; +import { useBatteryLevel, useCharging, useDeviceModel } from '../hooks/useSoundcoreDevice'; export default function OverviewCard() { + // if(levelQuery.isLoading || chargingQuery.isLoading) { + // return( + //
+ // ); + // } - - - // if(levelQuery.isLoading || chargingQuery.isLoading) { - // return( - //
- // ); - // } - - return ( - // As card - // - // - // - // - // - // - // - // {/* - // - // */} - // - - - - - - ) + return ( + // As card + // + // + // + // + // + // + // + // {/* + // + // */} + // + + + + + + ); } function OverviewItem() { - const chargingQuery = useCharging(); - const levelQuery = useBatteryLevel(); - const {data: deviceModel} = useDeviceModel(); + const chargingQuery = useCharging(); + const levelQuery = useBatteryLevel(); + const { data: deviceModel } = useDeviceModel(); - switch (deviceModel) { - case "A3951": - return ( - <> - - - - ); - case "A3027": - return ( - - ); - case "A3028": - return ( - - ); - case "A3029": - return ( - - ); - case "A3040": - return ( - - ); - case "A3935": - return ( - - ); - default: - return ( -

Something went wrong...

- ); - } + switch (deviceModel) { + case 'A3951': + return ( + <> + + + + ); + case 'A3027': + return ( + + ); + case 'A3028': + return ( + + ); + case 'A3029': + return ( + + ); + case 'A3040': + return ( + + ); + case 'A3935': + return ( + + ); + default: + return

Something went wrong...

; + } } -function SingleImgTwoBattery({ img, imgSize, leftBattLevel, rightBattLevel, leftCharging, rightCharging }: any) { - return ( +function SingleImgTwoBattery({ + img, + imgSize, + leftBattLevel, + rightBattLevel, + leftCharging, + rightCharging + // eslint-disable-next-line @typescript-eslint/no-explicit-any +}: any) { + return ( + + + - - - - - - - + - ); + + + + ); } -function EarbudItem({ alignTo, batteryLevel, batteryCharging, img, imgSize }: { alignTo: "left" | "right", batteryLevel: number | undefined, batteryCharging: boolean | undefined, img: string, imgSize: number }) { - return ( +function EarbudItem({ + alignTo, + batteryLevel, + batteryCharging, + img, + imgSize +}: { + alignTo: 'left' | 'right'; + batteryLevel: number | undefined; + batteryCharging: boolean | undefined; + img: string; + imgSize: number; +}) { + return ( + + + {alignTo == 'left' && ( + + )} - - {alignTo == "left" && - - } - - - - {alignTo == "right" && - - } - + - ) + {alignTo == 'right' && ( + + )} + + + ); } +// eslint-disable-next-line @typescript-eslint/no-explicit-any function EarbudBattery({ batteryLevel, batteryCharging }: any) { - let icon = null; - //0-5 - switch (batteryLevel) { - case 0: - icon = !batteryCharging ? : ; - break; - case 1: - icon = !batteryCharging ? : ; - break; - case 2: - icon = !batteryCharging ? : ; - break; - case 3: - icon = !batteryCharging ? : ; - break; - case 4: - icon = !batteryCharging ? : ; - break; - case 5: - icon = !batteryCharging ? : ; - break; - default: - icon = ; - break; - } + let icon = null; + //0-5 + switch (batteryLevel) { + case 0: + icon = !batteryCharging ? : ; + break; + case 1: + icon = !batteryCharging ? : ; + break; + case 2: + icon = !batteryCharging ? : ; + break; + case 3: + icon = !batteryCharging ? : ; + break; + case 4: + icon = !batteryCharging ? : ; + break; + case 5: + icon = !batteryCharging ? : ; + break; + default: + icon = ; + break; + } - return ( - - {icon} - - {batteryLevel * 2 * 10}% - - - ) -} \ No newline at end of file + return ( + + {icon} + + {batteryLevel * 2 * 10}% + + + ); +} diff --git a/src/hooks/useAsyncBridge.tsx b/src/hooks/useAsyncBridge.tsx new file mode 100644 index 0000000..d0d26d1 --- /dev/null +++ b/src/hooks/useAsyncBridge.tsx @@ -0,0 +1,21 @@ +import { Event, listen } from '@tauri-apps/api/event'; +import { useEffect } from 'react'; +import { BridgeResponse } from '../types/tauri-backend'; + +export const useAsyncBridgeEvent = (cb: (event: Event) => void) => { + return useEffect(() => { + const unlisten = async () => { + await listen('async-bridge-event', (event: Event) => { + cb(event as Event); + }); + }; + + unlisten().catch((error) => { + console.error(`Could not set up async bridge event listener. ${error}`); + }); + + return () => { + unlisten(); + }; + }, [cb]); +}; diff --git a/src/hooks/useBluetooth.tsx b/src/hooks/useBluetooth.tsx index 2e52851..760888a 100644 --- a/src/hooks/useBluetooth.tsx +++ b/src/hooks/useBluetooth.tsx @@ -1,50 +1,53 @@ -import { useEffect, useState } from "react"; -import { invoke } from "@tauri-apps/api/tauri"; -import { useQuery } from "@tanstack/react-query"; -import { BthScanResult } from "../types/tauri-backend"; +import { useEffect, useState } from 'react'; +import { invoke } from '@tauri-apps/api/tauri'; +import { useQuery } from '@tanstack/react-query'; +import { BthScanResult } from '../types/tauri-backend'; export function scanForDevices() { - const [data, setData] = useState([]); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(null); + const [data, setData] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); - useEffect(() => { - setLoading(true); - const fetchDevices = async () => { - invoke("scan_for_devices").then((result) => { - let scanResult = result as [BthScanResult]; - setData(scanResult); - setLoading(false); - }).catch((err) => { - setError(err); - setLoading(false); - }); - } - fetchDevices(); - }, []); + useEffect(() => { + setLoading(true); + const fetchDevices = async () => { + invoke('scan_for_devices') + .then((result) => { + const scanResult = result as [BthScanResult]; + setData(scanResult); + setLoading(false); + }) + .catch((err) => { + setError(err); + setLoading(false); + }); + }; + fetchDevices(); + }, []); - return { data, loading, error }; + return { data, loading, error }; } export function useSearch() { - return useQuery(["bt_search"], async () => { - const res = await invoke("scan_for_devices"); - return res as BthScanResult[]; - }); + return useQuery(['bt_search'], async () => { + const res = await invoke('scan_for_devices'); + return res as BthScanResult[]; + }); } - export function getIsConnected() { - const [res, setRes] = useState(false); - useEffect(() => { - const fetchStatus = async () => { - invoke("is_connected").then((result) => { - setRes(result as boolean); - }).catch((err) => { - setRes(false); - }); - } - fetchStatus(); - }, []); - return { res }; -} \ No newline at end of file + const [res, setRes] = useState(false); + useEffect(() => { + const fetchStatus = async () => { + invoke('is_connected') + .then((result) => { + setRes(result as boolean); + }) + .catch((_err) => { + setRes(false); + }); + }; + fetchStatus(); + }, []); + return { res }; +} diff --git a/src/hooks/useDeviceStore.tsx b/src/hooks/useDeviceStore.tsx index 03bee13..576188e 100644 --- a/src/hooks/useDeviceStore.tsx +++ b/src/hooks/useDeviceStore.tsx @@ -3,12 +3,12 @@ import create from 'zustand'; import { SupportedModels } from '../types/soundcore-lib'; interface DeviceStoreState { - deviceConnectionState: DeviceConnectionState - deviceModel: SupportedModels | undefined, - updateDeviceModel: (model: SupportedModels) => void, - setDeviceConnectionState: (state: DeviceConnectionState) => void, - connectUUID: (bt_name: String, bt_addr: String) => void, - close: () => void, + deviceConnectionState: DeviceConnectionState; + deviceModel: SupportedModels | undefined; + updateDeviceModel: (model: SupportedModels) => void; + setDeviceConnectionState: (state: DeviceConnectionState) => void; + connectUUID: (bt_name: string, bt_addr: string) => void; + close: () => void; } export enum DeviceConnectionState { @@ -54,23 +54,23 @@ export enum DeviceConnectionState { // } export interface ANCValues { - option: number, - anc_option: number, - transparency_option: number, - anc_custom: number, + option: number; + anc_option: number; + transparency_option: number; + anc_custom: number; } export interface EQWave { - pos0: number, - pos1: number, - pos2: number, - pos3: number, - pos4: number, - pos5: number, - pos6: number, - pos7: number, - pos8: number, - pos9: number, + pos0: number; + pos1: number; + pos2: number; + pos3: number; + pos4: number; + pos5: number; + pos6: number; + pos7: number; + pos8: number; + pos9: number; } const useDeviceStore = create((set) => ({ @@ -82,23 +82,27 @@ const useDeviceStore = create((set) => ({ setDeviceConnectionState: (new_state: DeviceConnectionState) => { set((state) => ({ ...state, deviceConnectionState: new_state })); }, - connectUUID: (selection: String, addr: String) => { + connectUUID: (selection: string, addr: string) => { set((state) => ({ ...state, deviceConnectionState: DeviceConnectionState.CONNECTING })); - invoke("connect", { btName: selection, btAddr: addr }).then((_msg) => { - set((state) => ({ ...state, deviceConnectionState: DeviceConnectionState.CONNECTED })); - }).catch((err) => { - console.log(err); - set((state) => ({ ...state, deviceConnectionState: DeviceConnectionState.DISCONNECTED })); - }); + invoke('connect', { btName: selection, btAddr: addr }) + .then((_msg) => { + set((state) => ({ ...state, deviceConnectionState: DeviceConnectionState.CONNECTED })); + }) + .catch((err) => { + console.log(err); + set((state) => ({ ...state, deviceConnectionState: DeviceConnectionState.DISCONNECTED })); + }); }, close: () => { - invoke("close").then((_msg) => { - set((state) => ({ ...state, deviceConnectionState: DeviceConnectionState.DISCONNECTED })); - }).catch((err) => { - console.log(err); - set((state) => ({ ...state, deviceConnectionState: DeviceConnectionState.DISCONNECTED })); - }); + invoke('close') + .then((_msg) => { + set((state) => ({ ...state, deviceConnectionState: DeviceConnectionState.DISCONNECTED })); + }) + .catch((err) => { + console.log(err); + set((state) => ({ ...state, deviceConnectionState: DeviceConnectionState.DISCONNECTED })); + }); } -})) +})); -export default useDeviceStore; \ No newline at end of file +export default useDeviceStore; diff --git a/src/hooks/useSoundcoreDevice.tsx b/src/hooks/useSoundcoreDevice.tsx index fca6d94..4ca0b3b 100644 --- a/src/hooks/useSoundcoreDevice.tsx +++ b/src/hooks/useSoundcoreDevice.tsx @@ -1,139 +1,168 @@ /* Not in use - Draft */ /* Move to async state react-query and define here async functions to "fetch" */ -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { invoke } from "@tauri-apps/api/tauri"; -import { useEffect, useState } from "react"; -import { BatteryCharging, BatteryLevel, DeviceStatus, SupportedModels } from "../types/soundcore-lib"; -import { ANCModes } from "../types/tauri-backend"; -import useDeviceStore, { DeviceConnectionState, EQWave } from "./useDeviceStore"; - - +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { invoke } from '@tauri-apps/api/tauri'; +import { useEffect, useState } from 'react'; +import { + BatteryCharging, + BatteryLevel, + DeviceStatus, + SupportedModels +} from '../types/soundcore-lib'; +import { ANCModes } from '../types/tauri-backend'; +import useDeviceStore, { DeviceConnectionState, EQWave } from './useDeviceStore'; export enum SupportedModelIDs { - A3951 = "A3951", + A3951 = 'A3951' } export function tryInitialize(modelID: SupportedModelIDs) { - invoke("init_device", { device: modelID }); + invoke('init_device', { device: modelID }); } -export function connectWithUUID(macAddr: String, uuid: String) { - const [status, setStatus] = useState(DeviceConnectionState.UNINITIALIZED); - const [connecting, setConnecting] = useState(false); - const [error, setError] = useState(null); +export function connectWithUUID(macAddr: string, uuid: string) { + const [status, setStatus] = useState(DeviceConnectionState.UNINITIALIZED); + const [connecting, setConnecting] = useState(false); + const [error, setError] = useState(null); - useEffect(() => { - setConnecting(true); - setStatus(DeviceConnectionState.CONNECTING); - const connect = async () => { - invoke("connect_device", { macAddr: macAddr, uuid: uuid }).then((_result) => { - setStatus(DeviceConnectionState.CONNECTED); - setConnecting(false); - }).catch((err) => { - setStatus(DeviceConnectionState.DISCONNECTED); - setError(err); - setConnecting(false); - }); - } - connect(); - }, []); + useEffect(() => { + setConnecting(true); + setStatus(DeviceConnectionState.CONNECTING); + const connect = async () => { + invoke('connect_device', { macAddr: macAddr, uuid: uuid }) + .then((_result) => { + setStatus(DeviceConnectionState.CONNECTED); + setConnecting(false); + }) + .catch((err) => { + setStatus(DeviceConnectionState.DISCONNECTED); + setError(err); + setConnecting(false); + }); + }; + connect(); + }, []); - return { status, connecting, error }; + return { status, connecting, error }; } //TODO: Add type for result (SupportedModel) export function useDeviceModel() { - const { deviceConnectionState } = useDeviceStore(); - return useQuery(["model"], async () => { - try { - const result = await invoke("get_model"); - return result as SupportedModels; - } catch (err) { - throw new Error("Error getting device model: " + err); - } - }, { - enabled: deviceConnectionState == DeviceConnectionState.CONNECTED, - }); + const { deviceConnectionState } = useDeviceStore(); + return useQuery( + ['model'], + async () => { + try { + const result = await invoke('get_model'); + return result as SupportedModels; + } catch (err) { + throw new Error('Error getting device model: ' + err); + } + }, + { + enabled: deviceConnectionState == DeviceConnectionState.CONNECTED + } + ); } export function useCharging() { - const { deviceConnectionState } = useDeviceStore(); - return useQuery(["charging"], async () => { - try { - const result = await invoke("get_battery_charging"); - return result as BatteryCharging; - } catch (err) { - console.error("Charging Error: " + err); - return { left: false, right: false } as BatteryCharging; - } - }, { - refetchInterval: 500, - enabled: deviceConnectionState == DeviceConnectionState.CONNECTED, - }); + const { deviceConnectionState } = useDeviceStore(); + return useQuery( + ['charging'], + async () => { + try { + const result = await invoke('get_battery_charging'); + return result as BatteryCharging; + } catch (err) { + console.error('Charging Error: ' + err); + return { left: false, right: false } as BatteryCharging; + } + }, + { + refetchInterval: 500, + enabled: deviceConnectionState == DeviceConnectionState.CONNECTED + } + ); } export function useBatteryLevel() { - const { deviceConnectionState } = useDeviceStore(); - return useQuery(["battery"], async () => { - try { - const result = await invoke("get_battery_level"); - return result as BatteryLevel; - } catch (err) { - console.error("Battery Error: " + err); - return { left: 0, right: 0 } as BatteryLevel; - } - }, { - refetchInterval: 5000, - enabled: deviceConnectionState == DeviceConnectionState.CONNECTED, - }); + const { deviceConnectionState } = useDeviceStore(); + return useQuery( + ['battery'], + async () => { + try { + const result = await invoke('get_battery_level'); + return result as BatteryLevel; + } catch (err) { + console.error('Battery Error: ' + err); + return { left: 0, right: 0 } as BatteryLevel; + } + }, + { + refetchInterval: 5000, + enabled: deviceConnectionState == DeviceConnectionState.CONNECTED + } + ); } export function useStatus() { - const { deviceConnectionState } = useDeviceStore(); - return useQuery(["status"], async () => { - const result = await invoke("get_status"); - return result as DeviceStatus; - }, { - refetchInterval: 5000, - enabled: deviceConnectionState == DeviceConnectionState.CONNECTED, - }); + const { deviceConnectionState } = useDeviceStore(); + return useQuery( + ['status'], + async () => { + const result = await invoke('get_status'); + return result as DeviceStatus; + }, + { + refetchInterval: 5000, + enabled: deviceConnectionState == DeviceConnectionState.CONNECTED + } + ); } export function useANC() { - const { deviceConnectionState } = useDeviceStore(); - return useQuery(["anc"], async () => { - const result = await invoke("get_anc"); - return result as ANCModes; - }, { - refetchInterval: 2000, - enabled: deviceConnectionState == DeviceConnectionState.CONNECTED, - }); + const { deviceConnectionState } = useDeviceStore(); + return useQuery( + ['anc'], + async () => { + const result = await invoke('get_anc'); + return result as ANCModes; + }, + { + refetchInterval: 2000, + enabled: deviceConnectionState == DeviceConnectionState.CONNECTED + } + ); } export function useUpdateANC() { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: (newMode: ANCModes) => { return invoke("set_anc", { mode: newMode }); }, - onMutate: async (newMode: ANCModes) => { - await queryClient.cancelQueries({ queryKey: ["anc"] }); - queryClient.setQueryData(["anc"], newMode); - }, - }); + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (newMode: ANCModes) => { + return invoke('set_anc', { mode: newMode }); + }, + onMutate: async (newMode: ANCModes) => { + await queryClient.cancelQueries({ queryKey: ['anc'] }); + queryClient.setQueryData(['anc'], newMode); + } + }); } export function useUpdateEQ() { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: (newEQ: EQWave) => { return invoke("set_eq", { eq: newEQ }); }, - onMutate: async (newEQ: EQWave) => { - await queryClient.cancelQueries({ queryKey: ["status"] }); - queryClient.setQueryData(["status"], (old: any) => { - return { - ...old!, - left_eq: newEQ, - right_eq: newEQ, - } - }); - }, - }); -} \ No newline at end of file + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (newEQ: EQWave) => { + return invoke('set_eq', { eq: newEQ }); + }, + onMutate: async (newEQ: EQWave) => { + await queryClient.cancelQueries({ queryKey: ['status'] }); + queryClient.setQueryData(['status'], (old) => { + return { + ...old!, + left_eq: newEQ, + right_eq: newEQ + }; + }); + } + }); +} diff --git a/src/hooks/useTray.tsx b/src/hooks/useTray.tsx index 8d90c07..03f1484 100644 --- a/src/hooks/useTray.tsx +++ b/src/hooks/useTray.tsx @@ -1,42 +1,40 @@ -import { invoke } from "@tauri-apps/api/tauri"; -import { DeviceConnectionState } from "./useDeviceStore"; -import { useEffect } from "react"; -import { appWindow } from "@tauri-apps/api/window"; -import { Event, listen } from "@tauri-apps/api/event"; -import { useMutation } from "@tanstack/react-query"; -import { useANC, useBatteryLevel, useCharging } from "./useSoundcoreDevice"; -import { ANCModes, NewTrayDeviceStatus } from "../types/tauri-backend"; -import { BatteryCharging, BatteryLevel } from "../types/soundcore-lib"; +import { invoke } from '@tauri-apps/api/tauri'; +import { DeviceConnectionState } from './useDeviceStore'; +import { useEffect } from 'react'; +import { Event, listen } from '@tauri-apps/api/event'; +import { useMutation } from '@tanstack/react-query'; +import { ANCModes, NewTrayDeviceStatus } from '../types/tauri-backend'; +import { BatteryCharging, BatteryLevel } from '../types/soundcore-lib'; export interface ITrayStatus { - deviceConnectionState: DeviceConnectionState, - level: BatteryLevel, - charging: BatteryCharging, - anc_mode: ANCModes, + deviceConnectionState: DeviceConnectionState; + level: BatteryLevel; + charging: BatteryCharging; + anc_mode: ANCModes; } export const useUpdateTray = () => { - return useMutation({ - mutationFn: (newTray: ITrayStatus) => { - return updateTrayStatus(newTray); - } - }) + return useMutation({ + mutationFn: (newTray: ITrayStatus) => { + return updateTrayStatus(newTray); + } + }); }; function updateTrayStatus(data: ITrayStatus) { - let { deviceConnectionState, level, charging, anc_mode } = data; - let status: NewTrayDeviceStatus = { - is_connected: deviceConnectionState === DeviceConnectionState.CONNECTED, - level, - charging, - anc_mode - } - console.log(status); - return invoke("set_tray_device_status", { status }); + const { deviceConnectionState, level, charging, anc_mode } = data; + const status: NewTrayDeviceStatus = { + is_connected: deviceConnectionState === DeviceConnectionState.CONNECTED, + level, + charging, + anc_mode + }; + console.log(status); + return invoke('set_tray_device_status', { status }); } export function setTrayMenu(connection_state: DeviceConnectionState) { - invoke("set_tray_menu", { isConnected: DeviceConnectionState.CONNECTED === connection_state }); + invoke('set_tray_menu', { isConnected: DeviceConnectionState.CONNECTED === connection_state }); } // export const useUpdateTray = useMutation(async (status: ITrayStatus) => { @@ -44,24 +42,24 @@ export function setTrayMenu(connection_state: DeviceConnectionState) { // }); /* https://github.com/tauri-apps/tauri/issues/4630 */ -type RemoveListenerBlock = () => void +type RemoveListenerBlock = () => void; export function useWindowEvent(name: string, callback: (event: Event) => void) { - return useEffect(() => { - let removeListener: RemoveListenerBlock | undefined + return useEffect(() => { + let removeListener: RemoveListenerBlock | undefined; - const setUpListener = async () => { - removeListener = await listen(name, (event: any) => { - callback(event as Event) - }) - } + const setUpListener = async () => { + removeListener = await listen(name, (event: unknown) => { + callback(event as Event); + }); + }; - setUpListener().catch(error => { - console.error(`Could not set up window event listener. ${error}`) - }) + setUpListener().catch((error) => { + console.error(`Could not set up window event listener. ${error}`); + }); - return () => { - removeListener?.() - } - }, [name, callback]) -} \ No newline at end of file + return () => { + removeListener?.(); + }; + }, [name, callback]); +} diff --git a/src/main.tsx b/src/main.tsx index 97d6c21..c812945 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,35 +1,38 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import App from "./App"; -import "./style.css"; -import { ThemeProvider, createTheme } from '@mui/material/styles'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './style.css'; +import { createTheme, ThemeProvider } from '@mui/material/styles'; import CssBaseline from '@mui/material/CssBaseline'; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { ReactQueryDevtools } from '@tanstack/react-query-devtools' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { appLogDir } from '@tauri-apps/api/path'; +import { attachConsole } from 'tauri-plugin-log-api'; const darkTheme = createTheme({ palette: { - mode: 'dark', - }, + mode: 'dark' + } }); const queryClient = new QueryClient({ defaultOptions: { queries: { - refetchOnWindowFocus: "always", - refetchIntervalInBackground: true, - }, - }, + refetchOnWindowFocus: 'always', + refetchIntervalInBackground: true + } + } }); +attachConsole(); (async () => { const logDir = await appLogDir(); - console.log(`Found a bug or something isn't working? \nCheck out the logs at ${logDir}\nand open/respond to an issue at https://github.com/gmallios/SoundcoreManager`); + console.log( + `Found a bug or something isn't working? \nCheck out the logs at ${logDir}\nand open/respond to an issue at https://github.com/gmallios/SoundcoreManager` + ); })(); -ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( diff --git a/src/stores/baseSlice.tsx b/src/stores/baseSlice.tsx new file mode 100644 index 0000000..13f2077 --- /dev/null +++ b/src/stores/baseSlice.tsx @@ -0,0 +1,52 @@ +import { Event } from '@tauri-apps/api/event'; +import { StateCreator, StoreApi } from 'zustand'; +import { SoundcoreStoreSlices } from './useSoundcoreStore'; +import { BridgeResponse } from '../types/tauri-backend'; + +export const createBaseSlice: StateCreator = ( + set, + get +) => ({ + handleAsyncBridgeEvent: (e: Event) => { + console.log('Handling async bridge event', e); + + const payload = e.payload as BridgeResponse; + const kind = e.payload.kind as BridgeResponse['kind']; + const handler = bridgeResponseHandlers[kind]; + if (handler) { + handler(payload.payload, set, get); + } + } +}); + +type BridgeResponseHandlers = { + [K in BridgeResponse['kind']]: ( + e: Extract['payload'], + set: StoreApi['setState'], + get: StoreApi['getState'] + ) => void; +}; +const bridgeResponseHandlers: BridgeResponseHandlers = { + newState: (payload, _set, get) => { + console.log('Handling new state', payload); + get().setStateFromBridgeResponse(payload); + }, + scanResult: function (payload, _set, get): void { + console.log('Handling scan result', payload); + get().setLatestScan(payload); + }, + connectionEstablished: function (_e, _set, _get): void { + throw new Error('Function not implemented.'); + }, + disconnected: function (_e, _set, _get): void { + throw new Error('Function not implemented.'); + }, + error: function (_e, _set, _get): void { + throw new Error('Function not implemented.'); + } +}; + +// TODO: Add types +export interface BaseSlice { + handleAsyncBridgeEvent: (e: Event) => void; +} diff --git a/src/stores/bluetoothSlice.tsx b/src/stores/bluetoothSlice.tsx new file mode 100644 index 0000000..f85819c --- /dev/null +++ b/src/stores/bluetoothSlice.tsx @@ -0,0 +1,12 @@ +import { StateCreator } from 'zustand'; +import { DiscoveredDevice } from '../types/soundcore-lib'; + +export const createBluetoothSlice: StateCreator = (set, _get) => ({ + latestScan: null, + setLatestScan: (scanRes: DiscoveredDevice[]) => set({ latestScan: scanRes }) +}); + +export interface BluetoothSlice { + latestScan: DiscoveredDevice[] | null; + setLatestScan: (scanRes: DiscoveredDevice[]) => void; +} diff --git a/src/stores/deviceStateSlice.tsx b/src/stores/deviceStateSlice.tsx new file mode 100644 index 0000000..31907a4 --- /dev/null +++ b/src/stores/deviceStateSlice.tsx @@ -0,0 +1,15 @@ +import { StateCreator } from 'zustand'; +import { BluetoothAdrr, SoundcoreDeviceState } from '../types/soundcore-lib'; +import { NewStateResponse } from '../types/tauri-backend'; + +export const createDeviceStateSlice: StateCreator = (set, get) => ({ + states: new Map(), + setStateFromBridgeResponse: (resp: NewStateResponse) => { + get().states.set(resp.addr, resp.state); + } +}); + +export interface DeviceStateSlice { + states: Map; + setStateFromBridgeResponse: (resp: NewStateResponse) => void; +} diff --git a/src/stores/useSoundcoreStore.tsx b/src/stores/useSoundcoreStore.tsx new file mode 100644 index 0000000..22b53f7 --- /dev/null +++ b/src/stores/useSoundcoreStore.tsx @@ -0,0 +1,12 @@ +import { create } from 'zustand'; +import { DeviceStateSlice, createDeviceStateSlice } from './deviceStateSlice'; +import { createBaseSlice, BaseSlice } from './baseSlice'; +import { BluetoothSlice, createBluetoothSlice } from './bluetoothSlice'; + +export type SoundcoreStoreSlices = BaseSlice & DeviceStateSlice & BluetoothSlice; + +export const useSoundcoreStore = create()((...a) => ({ + ...createDeviceStateSlice(...a), + ...createBaseSlice(...a), + ...createBluetoothSlice(...a) +})); diff --git a/src/types/soundcore-lib.d.ts b/src/types/soundcore-lib.d.ts index b82ace8..cbce716 100644 --- a/src/types/soundcore-lib.d.ts +++ b/src/types/soundcore-lib.d.ts @@ -4,83 +4,82 @@ /** This is a generalized version of the state for all devices */ export interface SoundcoreDeviceState { - featureFlags: BitFlags; - battery: Battery; - soundMode: SoundMode; - serial?: SerialNumber; - fw?: FirmwareVer; - drcFw?: FirmwareVer; - hostDevice?: number; - twsStatus?: TwsStatus; - buttonModel?: ButtonModel; - sideTone?: SideTone; - hearidEqPreset?: number; - wearDetection?: WearDetection; - hearId?: HearID; - ageRange?: AgeRange; + featureFlags: BitFlags; + battery: Battery; + soundMode: SoundMode; + serial?: SerialNumber; + fw?: FirmwareVer; + drcFw?: FirmwareVer; + hostDevice?: number; + twsStatus?: TwsStatus; + buttonModel?: ButtonModel; + sideTone?: SideTone; + hearidEqPreset?: number; + wearDetection?: WearDetection; + hearId?: HearID; + ageRange?: AgeRange; } export interface BluetoothAdrr { - address: [number, number, number, number, number, number]; + address: [number, number, number, number, number, number]; } export enum SupportedModels { - A3027 = "A3027", - A3028 = "A3028", - A3029 = "A3029", - A3040 = "A3040", - A3930 = "A3930", - A3931 = "A3931", - A3935 = "A3935", - A3951 = "A3951", + A3027 = 'A3027', + A3028 = 'A3028', + A3029 = 'A3029', + A3040 = 'A3040', + A3930 = 'A3930', + A3931 = 'A3931', + A3935 = 'A3935', + A3951 = 'A3951' } /** A discovered BLE device. The DiscoveredDevice can be upgraded to a SoundcoreBLEDevice. */ export interface DiscoveredDevice { - /** The BLE device descriptor. */ - descriptor: BLEDeviceDescriptor; - /** The model of the device, resolved using the device's advertised name. */ - model?: SupportedModels; + /** The BLE device descriptor. */ + descriptor: BLEDeviceDescriptor; + /** The model of the device, resolved using the device's advertised name. */ + model?: SupportedModels; } export interface DeviceInfo { - left_fw: string; - right_fw: string; - sn: string; + left_fw: string; + right_fw: string; + sn: string; } export interface BatteryLevel { - left: number; - right: number; + left: number; + right: number; } export interface BatteryCharging { - left: boolean; - right: boolean; + left: boolean; + right: boolean; } export interface ANCProfile { - option: number; - anc_option: number; - transparency_option: number; - anc_custom: number; + option: number; + anc_option: number; + transparency_option: number; + anc_custom: number; } export interface DeviceStatus { - host_device: number; - tws_status: boolean; - battery_level: BatteryLevel; - battery_charging: BatteryCharging; - anc_status: ANCProfile; - side_tone_enabled: boolean; - wear_detection_enabled: boolean; - touch_tone_enabled: boolean; - left_eq: EQWave; - right_eq: EQWave; - hearid_enabled: boolean; - left_hearid: EQWave; - right_hearid: EQWave; - left_hearid_customdata: EQWave; - right_hearid_customdata: EQWave; + host_device: number; + tws_status: boolean; + battery_level: BatteryLevel; + battery_charging: BatteryCharging; + anc_status: ANCProfile; + side_tone_enabled: boolean; + wear_detection_enabled: boolean; + touch_tone_enabled: boolean; + left_eq: EQWave; + right_eq: EQWave; + hearid_enabled: boolean; + left_hearid: EQWave; + right_hearid: EQWave; + left_hearid_customdata: EQWave; + right_hearid_customdata: EQWave; } - diff --git a/src/types/tauri-backend.d.ts b/src/types/tauri-backend.d.ts index 357f2d1..9b149f5 100644 --- a/src/types/tauri-backend.d.ts +++ b/src/types/tauri-backend.d.ts @@ -3,55 +3,54 @@ */ export interface NewStateResponse { - addr: BluetoothAdrr; - state: SoundcoreDeviceState; + addr: BluetoothAdrr; + state: SoundcoreDeviceState; } export interface BthScanResult { - name: string; - address: string; - is_connected: boolean; + name: string; + address: string; + is_connected: boolean; } -export type ANCModes = - | { mode: "NormalMode", value?: undefined } - | { mode: "AncTransportMode", value?: undefined } - | { mode: "AncOutdoorMode", value?: undefined } - | { mode: "AncIndoorMode", value?: undefined } - | { mode: "AncCustomValue", value: number } - | { mode: "TransparencyFullyTransparentMode", value?: undefined } - | { mode: "TransparencyVocalMode", value?: undefined }; +export type ANCModes = + | { mode: 'NormalMode'; value?: undefined } + | { mode: 'AncTransportMode'; value?: undefined } + | { mode: 'AncOutdoorMode'; value?: undefined } + | { mode: 'AncIndoorMode'; value?: undefined } + | { mode: 'AncCustomValue'; value: number } + | { mode: 'TransparencyFullyTransparentMode'; value?: undefined } + | { mode: 'TransparencyVocalMode'; value?: undefined }; export interface NewTrayDeviceStatus { - is_connected: boolean; - charging: BatteryCharging; - level: BatteryLevel; - anc_mode: ANCModes; + is_connected: boolean; + charging: BatteryCharging; + level: BatteryLevel; + anc_mode: ANCModes; } export enum SupportedANCProfiles { - Normal = "Normal", - AncTransportMode = "AncTransportMode", - AncOutdoorMode = "AncOutdoorMode", - AncIndoorMode = "AncIndoorMode", - AncCustomValue = "AncCustomValue", - TransparencyFullyTransparentMode = "TransparencyFullyTransparentMode", - TransparencyVocalMode = "TransparencyVocalMode", + Normal = 'Normal', + AncTransportMode = 'AncTransportMode', + AncOutdoorMode = 'AncOutdoorMode', + AncIndoorMode = 'AncIndoorMode', + AncCustomValue = 'AncCustomValue', + TransparencyFullyTransparentMode = 'TransparencyFullyTransparentMode', + TransparencyVocalMode = 'TransparencyVocalMode' } export interface DeviceFeatures { - profiles: SupportedANCProfiles[]; + profiles: SupportedANCProfiles[]; } -export type BridgeCommand = - | { command: "scan", payload?: undefined } - | { command: "connect", payload: DiscoveredDevice } - | { command: "disconnect", payload: BluetoothAdrr }; - -export type BridgeResponse = - | { kind: "scanResult", payload: DiscoveredDevice[] } - | { kind: "connectionEstablished", payload: BluetoothAdrr } - | { kind: "newState", payload: NewStateResponse } - | { kind: "disconnected", payload: BluetoothAdrr } - | { kind: "error", payload: string }; - +export type BridgeCommand = + | { command: 'scan'; payload?: undefined } + | { command: 'connect'; payload: DiscoveredDevice } + | { command: 'disconnect'; payload: BluetoothAdrr }; + +export type BridgeResponse = + | { kind: 'scanResult'; payload: DiscoveredDevice[] } + | { kind: 'connectionEstablished'; payload: BluetoothAdrr } + | { kind: 'newState'; payload: NewStateResponse } + | { kind: 'disconnected'; payload: BluetoothAdrr } + | { kind: 'error'; payload: string }; diff --git a/yarn.lock b/yarn.lock index d2e69f9..b558292 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -432,6 +437,38 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + 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.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.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + 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.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + "@floating-ui/core@^1.4.2": version "1.5.2" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.2.tgz#53a0f7a98c550e63134d504f26804f6b83dbc071" @@ -464,6 +501,25 @@ resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-4.5.8.tgz#56347764786079838faf43f0eeda22dd7328437f" integrity sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + 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.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -587,6 +643,32 @@ prop-types "^15.8.1" react-is "^18.2.0" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + 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.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + "@popperjs/core@^2.11.8": version "2.11.8" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" @@ -725,6 +807,11 @@ dependencies: "@babel/types" "^7.20.7" +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/node@^18.7.10": version "18.19.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.4.tgz#89672e84f11a2c19543d694dac00ab8d7bc20ddb" @@ -770,6 +857,102 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@typescript-eslint/eslint-plugin@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz#22bb999a8d59893c0ea07923e8a21f9d985ad740" + integrity sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "7.1.0" + "@typescript-eslint/type-utils" "7.1.0" + "@typescript-eslint/utils" "7.1.0" + "@typescript-eslint/visitor-keys" "7.1.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@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.1.0.tgz#b89dab90840f7d2a926bf4c23b519576e8c31970" + integrity sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w== + dependencies: + "@typescript-eslint/scope-manager" "7.1.0" + "@typescript-eslint/types" "7.1.0" + "@typescript-eslint/typescript-estree" "7.1.0" + "@typescript-eslint/visitor-keys" "7.1.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz#e4babaa39a3d612eff0e3559f3e99c720a2b4a54" + integrity sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A== + dependencies: + "@typescript-eslint/types" "7.1.0" + "@typescript-eslint/visitor-keys" "7.1.0" + +"@typescript-eslint/type-utils@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz#372dfa470df181bcee0072db464dc778b75ed722" + integrity sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew== + dependencies: + "@typescript-eslint/typescript-estree" "7.1.0" + "@typescript-eslint/utils" "7.1.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.1.0.tgz#52a86d6236fda646e7e5fe61154991dc0dc433ef" + integrity sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA== + +"@typescript-eslint/typescript-estree@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz#419b1310f061feee6df676c5bed460537310c593" + integrity sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ== + dependencies: + "@typescript-eslint/types" "7.1.0" + "@typescript-eslint/visitor-keys" "7.1.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@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.1.0.tgz#710ecda62aff4a3c8140edabf3c5292d31111ddd" + integrity sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "7.1.0" + "@typescript-eslint/types" "7.1.0" + "@typescript-eslint/typescript-estree" "7.1.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz#576c4ad462ca1378135a55e2857d7aced96ce0a0" + integrity sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA== + dependencies: + "@typescript-eslint/types" "7.1.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@vitejs/plugin-react@^4.0.0": version "4.2.1" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" @@ -781,6 +964,31 @@ "@types/babel__core" "^7.20.5" react-refresh "^0.14.0" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + 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.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -788,6 +996,101 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.6: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + +available-typed-arrays@^1.0.6, available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" @@ -797,6 +1100,33 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + 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.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + browserslist@^4.22.2: version "4.22.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" @@ -807,6 +1137,17 @@ browserslist@^4.22.2: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +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.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + 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.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -826,6 +1167,14 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chart.js@^3.9.1, chart.js@~3.9.1: version "3.9.1" resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.9.1.tgz#3abf2c775169c4c71217a107163ac708515924b8" @@ -852,11 +1201,28 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + 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.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" @@ -885,6 +1251,15 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + csstype@^3.0.2, csstype@^3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" @@ -908,13 +1283,57 @@ d3-selection@3, d3-selection@^3.0.0: resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== -debug@^4.1.0, debug@^4.3.1: +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + 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.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -935,6 +1354,111 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.22.4: + version "1.22.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.5.tgz#1417df4e97cc55f09bf7e58d1e614bc61cb8df46" + integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.1" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.0" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.14" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.0.0, es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.12: + version "1.0.17" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz#123d1315780df15b34eb181022da43e734388bb8" + integrity sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.22.4" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.0" + +es-set-tostringtag@^2.0.2, es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + esbuild@^0.18.10: version "0.18.20" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" @@ -978,11 +1502,222 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-plugin-prettier@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.8.6" + +eslint-plugin-react@^7.33.2: + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + 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.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + 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.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + 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.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + 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.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + 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.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + 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.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + 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.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -993,21 +1728,154 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + 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-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + 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@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + 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" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.1, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + hasown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" @@ -1015,6 +1883,13 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +hasown@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" + integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== + dependencies: + function-bind "^1.1.2" + hoist-non-react-statics@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -1022,6 +1897,11 @@ hoist-non-react-statics@^3.3.1: dependencies: react-is "^16.7.0" +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -1030,11 +1910,73 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + 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.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-core-module@^2.13.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" @@ -1042,36 +1984,237 @@ is-core-module@^2.13.0: dependencies: hasown "^2.0.0" +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-what@^4.1.8: version "4.1.16" resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + 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.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -1086,6 +2229,40 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + 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.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -1096,6 +2273,11 @@ nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" @@ -1106,6 +2288,94 @@ object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + 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" + +object.entries@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + 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.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + 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.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -1123,6 +2393,21 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -1138,6 +2423,16 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss@^8.4.27: version "8.4.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" @@ -1147,6 +2442,23 @@ postcss@^8.4.27: picocolors "^1.0.0" source-map-js "^1.0.2" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== + prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -1156,6 +2468,16 @@ prop-types@^15.6.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + react-chartjs-2@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/react-chartjs-2/-/react-chartjs-2-4.3.1.tgz#9941e7397fb963f28bb557addb401e9ff96c6681" @@ -1201,11 +2523,34 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" +reflect.getprototypeof@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz#e0bd28b597518f16edaf9c0e292c631eb13e0674" + integrity sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.0.0" + get-intrinsic "^1.2.3" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + 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.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" @@ -1225,6 +2570,27 @@ resolve@^1.19.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.4: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.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.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rollup@^3.27.1: version "3.29.4" resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" @@ -1232,6 +2598,32 @@ rollup@^3.27.1: optionalDependencies: fsevents "~2.3.2" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" + integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== + dependencies: + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -1244,6 +2636,62 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +set-function-length@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" + integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== + dependencies: + define-data-property "^1.1.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + 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.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + 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" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -1254,6 +2702,60 @@ source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +string.prototype.matchall@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + stylis@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" @@ -1273,27 +2775,130 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + 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.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +synckit@^0.8.6: + version "0.8.8" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + "tauri-plugin-log-api@https://github.com/tauri-apps/tauri-plugin-log#v1": version "0.0.0" resolved "https://github.com/tauri-apps/tauri-plugin-log#19f5dcc0425e9127d2c591780e5047b83e77a7c2" dependencies: "@tauri-apps/api" "1.5.3" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.2.1.tgz#f716c7e027494629485b21c0df6180f4d08f5e8b" + integrity sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA== + +tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5" + integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + typescript@^5.0.4: version "5.3.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -1307,6 +2912,13 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" @@ -1323,16 +2935,88 @@ vite@^4.3.1: optionalDependencies: fsevents "~2.3.2" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + 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-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.14, which-typed-array@^1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" + integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== + dependencies: + available-typed-arrays "^1.0.6" + call-bind "^1.0.5" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.1" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + zustand@^4.1.3: version "4.4.7" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.7.tgz#355406be6b11ab335f59a66d2cf9815e8f24038c"