From a69cc007793acea1042d25722c39568c3423fefc Mon Sep 17 00:00:00 2001 From: Stefan Date: Wed, 4 May 2022 21:32:31 +0200 Subject: [PATCH 01/17] installer: add client dropdowns --- src/react/App.tsx | 5 +- .../components/InstallFlow/0-SystemCheck.tsx | 5 +- .../InstallFlow/1-Configuration.tsx | 7 +- .../components/InstallFlow/2-Install.tsx | 96 +++++++++++++++++-- src/react/constants.ts | 37 +++++++ src/react/pages/MainWizard.tsx | 5 +- 6 files changed, 136 insertions(+), 19 deletions(-) diff --git a/src/react/App.tsx b/src/react/App.tsx index af34732..717c4f2 100644 --- a/src/react/App.tsx +++ b/src/react/App.tsx @@ -11,9 +11,8 @@ import { Network } from './types'; import SystemOverview from "./pages/SystemOverview"; const Container = styled.main` - display: flex; - flex-direction: column; - min-height: 100vh; + display: block; + padding: 20px; `; /** diff --git a/src/react/components/InstallFlow/0-SystemCheck.tsx b/src/react/components/InstallFlow/0-SystemCheck.tsx index ed42c3f..09c94c8 100644 --- a/src/react/components/InstallFlow/0-SystemCheck.tsx +++ b/src/react/components/InstallFlow/0-SystemCheck.tsx @@ -11,6 +11,7 @@ type SystemCheckProps = { const ContentGrid = styled(Grid)` height: 320px; margin-top: 16px; + margin-bottom: 16px; `; /** @@ -22,9 +23,9 @@ const ContentGrid = styled(Grid)` const SystemCheck: FC = (props): ReactElement => { return ( - + - + System Check diff --git a/src/react/components/InstallFlow/1-Configuration.tsx b/src/react/components/InstallFlow/1-Configuration.tsx index 13fe0f2..1439e8b 100644 --- a/src/react/components/InstallFlow/1-Configuration.tsx +++ b/src/react/components/InstallFlow/1-Configuration.tsx @@ -11,6 +11,7 @@ type ConfigurationProps = { const ContentGrid = styled(Grid)` height: 320px; margin-top: 16px; + margin-bottom: 16px; `; /** @@ -22,13 +23,13 @@ const ContentGrid = styled(Grid)` const Configuration: FC = (props): ReactElement => { return ( - + - + Configuration - + {/* props.children is the stepper */} diff --git a/src/react/components/InstallFlow/2-Install.tsx b/src/react/components/InstallFlow/2-Install.tsx index b224af2..e23f20d 100644 --- a/src/react/components/InstallFlow/2-Install.tsx +++ b/src/react/components/InstallFlow/2-Install.tsx @@ -1,7 +1,9 @@ -import React, { FC, ReactElement } from 'react'; -import { Grid, Typography } from '@mui/material'; +import React, { FC, ReactElement, useState } from 'react'; +import { Grid, Typography, FormControl, Select, MenuItem, InputLabel, SelectChangeEvent } from '@mui/material'; import StepNavigation from '../StepNavigation'; import styled from '@emotion/styled'; +import { ConsensusClients, ExecutionClients, IConsensusClient, IExecutionClient } from '../../constants' +import { ConsensusClient } from '../../../electron/IMultiClientInstaller'; type InstallProps = { onStepBack: () => void, @@ -11,8 +13,30 @@ type InstallProps = { const ContentGrid = styled(Grid)` height: 320px; margin-top: 16px; + margin-bottom: 16px; `; +const Row = styled.div` + display: flex; + justify-content: space-around; + align-items: center; +` + +// const InputGroup = styled(Grid)` +// margin: 1rem 0; +// border: 1px solid orange; +// ` + +// const ExecutionSelector = styled(Grid)` + +// ` + +// const ConsensusSelector = styled(Grid)` + +// ` + + + /** * This page is the third step of the install process where the software is being installed. * @@ -21,15 +45,73 @@ const ContentGrid = styled(Grid)` */ const Install: FC = (props): ReactElement => { + const [consensusClient, setConsensusClient] = useState('prysm'); + const [executionClient, setExecutionClient] = useState('geth'); + + const handleConsensusClientChange = (client: SelectChangeEvent) => { + setConsensusClient(client.target.value) + } + + const handleExecutionClientChange = (client: SelectChangeEvent) => { + setExecutionClient(client.target.value) + } + return ( - + - + Installing - - + + + + + Consensus Client + + + + {/* Consensus Client */} + + + + + + + Execution Client + + + + {/* Execution Client */} + + + + + {/* props.children is the stepper */} {props.children} @@ -37,7 +119,7 @@ const Install: FC = (props): ReactElement => { onPrev={props.onStepBack} onNext={props.onStepForward} backLabel={"Back"} - nextLabel={"Next"} + nextLabel={"Install"} disableBack={false} disableNext={false} /> diff --git a/src/react/constants.ts b/src/react/constants.ts index b15e079..7e15d23 100644 --- a/src/react/constants.ts +++ b/src/react/constants.ts @@ -1,3 +1,4 @@ +import { ConsensusClient, ExecutionClient } from '../electron/IMultiClientInstaller'; import { StepKey } from './types'; export const errors = { @@ -11,3 +12,39 @@ export const stepLabels = { [StepKey.Configuration]: 'Configuration', [StepKey.Installing]: 'Install', }; + + +export interface IExecutionClient { + key: ExecutionClient; + label: string; +} + +export interface IConsensusClient { + key: ConsensusClient; + label: string; +} + + +export const ConsensusClients: IConsensusClient[] = [{ + key: ConsensusClient.PRYSM, + label: 'Prysm (recommended)', +}, +{ + key: ConsensusClient.LIGHTHOUSE, + label: 'Lighthouse', +}, { + key: ConsensusClient.NIMBUS, + label: 'Nimbus', +}, { + key: ConsensusClient.TEKU, + label: 'Teku' +} +] +export const ExecutionClients: IExecutionClient[] = [{ + key: ExecutionClient.GETH, + label: 'Geth (recommended)', +}, { + key: ExecutionClient.NETHERMIND, + label: 'Nethermind' +}, +] \ No newline at end of file diff --git a/src/react/pages/MainWizard.tsx b/src/react/pages/MainWizard.tsx index 9cb68e5..8b358ee 100644 --- a/src/react/pages/MainWizard.tsx +++ b/src/react/pages/MainWizard.tsx @@ -19,9 +19,6 @@ const stepSequenceMap: Record = { } const MainGrid = styled(Grid)` - width: 100%; - margin: 0px; - text-align: center; `; const StyledStepper = styled(Stepper)` @@ -118,7 +115,7 @@ const Wizard: FC = (props): ReactElement => { } return ( - + From dc9dda928f43b56a8b79a8dabba61b18997b0c72 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 6 May 2022 19:42:43 +0200 Subject: [PATCH 02/17] add advanced options --- .../InstallFlow/1-Configuration.tsx | 98 ++++++++++++++++++- .../components/InstallFlow/2-Install.tsx | 93 ++---------------- src/react/components/StepNavigation.tsx | 4 +- src/react/pages/MainWizard.tsx | 4 +- 4 files changed, 106 insertions(+), 93 deletions(-) diff --git a/src/react/components/InstallFlow/1-Configuration.tsx b/src/react/components/InstallFlow/1-Configuration.tsx index 1439e8b..ac4d43c 100644 --- a/src/react/components/InstallFlow/1-Configuration.tsx +++ b/src/react/components/InstallFlow/1-Configuration.tsx @@ -1,7 +1,10 @@ -import React, { FC, ReactElement } from 'react'; -import { Grid, Typography } from '@mui/material'; +import React, { FC, ReactElement, useState } from 'react'; +import { Grid, Typography, FormControl, Select, MenuItem, InputLabel, SelectChangeEvent, Modal, Box, Button } from '@mui/material'; import StepNavigation from '../StepNavigation'; import styled from '@emotion/styled'; +import { ConsensusClients, ExecutionClients, IConsensusClient, IExecutionClient } from '../../constants' +import { ConsensusClient } from '../../../electron/IMultiClientInstaller'; + type ConfigurationProps = { onStepBack: () => void, @@ -14,6 +17,19 @@ const ContentGrid = styled(Grid)` margin-bottom: 16px; `; + +const ModalStyle = { + position: 'absolute' as 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 400, + bgcolor: 'background.paper', + border: '2px solid #000', + boxShadow: 24, + p: 4, +}; + /** * This page is the second step of the install process where the user inputs their configuration. * @@ -21,6 +37,17 @@ const ContentGrid = styled(Grid)` * @returns */ const Configuration: FC = (props): ReactElement => { + const [consensusClient, setConsensusClient] = useState('prysm'); + const [executionClient, setExecutionClient] = useState('geth'); + const [isModalOpen, setModalOpen] = useState(false) + + const handleConsensusClientChange = (client: SelectChangeEvent) => { + setConsensusClient(client.target.value) + } + + const handleExecutionClientChange = (client: SelectChangeEvent) => { + setExecutionClient(client.target.value) + } return ( @@ -29,8 +56,71 @@ const Configuration: FC = (props): ReactElement => { Configuration - - + + + + + Consensus Client + + + + {/* Consensus Client */} + + + + + + + Execution Client + + + + {/* Execution Client */} + + + + + + + setModalOpen(false)} + aria-labelledby="modal-modal-title" + aria-describedby="modal-modal-description" + > + + + Text in a modal + + + Duis mollis, est non commodo luctus, nisi erat porttitor ligula. + + + {/* props.children is the stepper */} {props.children} diff --git a/src/react/components/InstallFlow/2-Install.tsx b/src/react/components/InstallFlow/2-Install.tsx index e23f20d..143afb7 100644 --- a/src/react/components/InstallFlow/2-Install.tsx +++ b/src/react/components/InstallFlow/2-Install.tsx @@ -1,9 +1,7 @@ -import React, { FC, ReactElement, useState } from 'react'; -import { Grid, Typography, FormControl, Select, MenuItem, InputLabel, SelectChangeEvent } from '@mui/material'; +import React, { FC, ReactElement } from 'react'; +import { Grid, Typography } from '@mui/material'; import StepNavigation from '../StepNavigation'; import styled from '@emotion/styled'; -import { ConsensusClients, ExecutionClients, IConsensusClient, IExecutionClient } from '../../constants' -import { ConsensusClient } from '../../../electron/IMultiClientInstaller'; type InstallProps = { onStepBack: () => void, @@ -16,26 +14,6 @@ const ContentGrid = styled(Grid)` margin-bottom: 16px; `; -const Row = styled.div` - display: flex; - justify-content: space-around; - align-items: center; -` - -// const InputGroup = styled(Grid)` -// margin: 1rem 0; -// border: 1px solid orange; -// ` - -// const ExecutionSelector = styled(Grid)` - -// ` - -// const ConsensusSelector = styled(Grid)` - -// ` - - /** * This page is the third step of the install process where the software is being installed. @@ -44,18 +22,6 @@ const Row = styled.div` * @returns */ const Install: FC = (props): ReactElement => { - - const [consensusClient, setConsensusClient] = useState('prysm'); - const [executionClient, setExecutionClient] = useState('geth'); - - const handleConsensusClientChange = (client: SelectChangeEvent) => { - setConsensusClient(client.target.value) - } - - const handleExecutionClientChange = (client: SelectChangeEvent) => { - setExecutionClient(client.target.value) - } - return ( @@ -64,54 +30,11 @@ const Install: FC = (props): ReactElement => { - - - - Consensus Client - - - - {/* Consensus Client */} - - - - - - - Execution Client - - - - {/* Execution Client */} - - - - - +
    +
  • Downloading Clients
  • +
  • Starting Consensus Client
  • +
  • Starting Execution Client
  • +
{/* props.children is the stepper */} {props.children} @@ -119,7 +42,7 @@ const Install: FC = (props): ReactElement => { onPrev={props.onStepBack} onNext={props.onStepForward} backLabel={"Back"} - nextLabel={"Install"} + nextLabel={"Finish"} disableBack={false} disableNext={false} /> diff --git a/src/react/components/StepNavigation.tsx b/src/react/components/StepNavigation.tsx index 424c5ba..0ba2acc 100644 --- a/src/react/components/StepNavigation.tsx +++ b/src/react/components/StepNavigation.tsx @@ -29,13 +29,13 @@ const StepNavigation: FC = (props): ReactElement => { return ( - + {!props.hideBack && ( )} - + {!props.hideNext && ( )} diff --git a/src/react/pages/MainWizard.tsx b/src/react/pages/MainWizard.tsx index 8b358ee..ae34650 100644 --- a/src/react/pages/MainWizard.tsx +++ b/src/react/pages/MainWizard.tsx @@ -12,7 +12,7 @@ import SystemCheck from '../components/InstallFlow/0-SystemCheck'; const stepSequenceMap: Record = { install: [ - StepKey.SystemCheck, + // StepKey.SystemCheck, StepKey.Configuration, StepKey.Installing, ] @@ -74,7 +74,7 @@ const Wizard: FC = (props): ReactElement => { * This is the UI stepper component rendering where the user is in the process */ const stepper = ( - + {stepSequence.map((stepKey: StepKey) => ( From 4b90e3523d74acdd18727f4433b8a694b31cdbd6 Mon Sep 17 00:00:00 2001 From: Stefan Date: Thu, 12 May 2022 00:47:04 +0200 Subject: [PATCH 03/17] add advanced option text fields --- .../InstallFlow/1-Configuration.tsx | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/src/react/components/InstallFlow/1-Configuration.tsx b/src/react/components/InstallFlow/1-Configuration.tsx index ac4d43c..f71165e 100644 --- a/src/react/components/InstallFlow/1-Configuration.tsx +++ b/src/react/components/InstallFlow/1-Configuration.tsx @@ -1,5 +1,6 @@ import React, { FC, ReactElement, useState } from 'react'; -import { Grid, Typography, FormControl, Select, MenuItem, InputLabel, SelectChangeEvent, Modal, Box, Button } from '@mui/material'; +import { Grid, Typography, FormControl, Select, MenuItem, InputLabel, SelectChangeEvent, Modal, Box, Button, TextField, InputAdornment } from '@mui/material'; +import { Folder, Link } from '@mui/icons-material' import StepNavigation from '../StepNavigation'; import styled from '@emotion/styled'; import { ConsensusClients, ExecutionClients, IConsensusClient, IExecutionClient } from '../../constants' @@ -23,7 +24,7 @@ const ModalStyle = { top: '50%', left: '50%', transform: 'translate(-50%, -50%)', - width: 400, + width: 600, bgcolor: 'background.paper', border: '2px solid #000', boxShadow: 24, @@ -114,11 +115,63 @@ const Configuration: FC = (props): ReactElement => { > - Text in a modal - - - Duis mollis, est non commodo luctus, nisi erat porttitor ligula. + Advanced options +
+ + + + + Checkpoint Sync + + + , + }} + /> + + + + + Execution Client Fallback + + + , + }} + /> + + + + + Installation Path + + + { ev.preventDefault(); console.log('lols') }} + sx={{ my: 2, minWidth: '215' }} + variant="outlined" + disabled + InputProps={{ + startAdornment: , + }} + /> + + + +
From cd88d67e14585aa22b97b245109b44823f86c9a9 Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 30 May 2022 18:51:59 +0200 Subject: [PATCH 04/17] add advanced options --- .../InstallFlow/1-Configuration.tsx | 56 ++++++++++++++----- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/src/react/components/InstallFlow/1-Configuration.tsx b/src/react/components/InstallFlow/1-Configuration.tsx index f71165e..e9497cb 100644 --- a/src/react/components/InstallFlow/1-Configuration.tsx +++ b/src/react/components/InstallFlow/1-Configuration.tsx @@ -1,10 +1,11 @@ -import React, { FC, ReactElement, useState } from 'react'; +import React, { ChangeEvent, FC, FormEvent, ReactElement, useState } from 'react'; import { Grid, Typography, FormControl, Select, MenuItem, InputLabel, SelectChangeEvent, Modal, Box, Button, TextField, InputAdornment } from '@mui/material'; import { Folder, Link } from '@mui/icons-material' import StepNavigation from '../StepNavigation'; import styled from '@emotion/styled'; import { ConsensusClients, ExecutionClients, IConsensusClient, IExecutionClient } from '../../constants' import { ConsensusClient } from '../../../electron/IMultiClientInstaller'; +import { BackgroundLight, } from '../../colors'; type ConfigurationProps = { @@ -25,8 +26,10 @@ const ModalStyle = { left: '50%', transform: 'translate(-50%, -50%)', width: 600, - bgcolor: 'background.paper', - border: '2px solid #000', + padding: '20px', + borderRadius: '20px', + background: BackgroundLight, + // border: '2px solid #000', boxShadow: 24, p: 4, }; @@ -41,13 +44,26 @@ const Configuration: FC = (props): ReactElement => { const [consensusClient, setConsensusClient] = useState('prysm'); const [executionClient, setExecutionClient] = useState('geth'); const [isModalOpen, setModalOpen] = useState(false) + const [checkpointSync, setCheckpointSync] = useState(''); + const [executionClientFallback, setExecutionClientFallback] = useState(''); + const [installationPath, setInstallationPath] = useState(''); - const handleConsensusClientChange = (client: SelectChangeEvent) => { - setConsensusClient(client.target.value) + const handleConsensusClientChange = (ev: SelectChangeEvent) => { + setConsensusClient(ev.target.value) } - const handleExecutionClientChange = (client: SelectChangeEvent) => { - setExecutionClient(client.target.value) + const handleExecutionClientChange = (ev: SelectChangeEvent) => { + setExecutionClient(ev.target.value) + } + + const handleCheckpointSyncChange = (ev: ChangeEvent) => { + setCheckpointSync(ev.target.value) + } + const handleExecutionClientFallbackChange = (ev: ChangeEvent) => { + setExecutionClient(ev.target.value) + } + const handleInstallationPathChange = (ev: ChangeEvent) => { + setInstallationPath(ev.target.value) } return ( @@ -60,10 +76,12 @@ const Configuration: FC = (props): ReactElement => { - - Consensus Client + + + Consensus Client - + + {/* Consensus Client */} + - - Execution Client + + + Execution Client - + + {/* Execution Client */} + @@ -114,7 +136,7 @@ const Configuration: FC = (props): ReactElement => { aria-describedby="modal-modal-description" > - + Advanced options
@@ -126,6 +148,7 @@ const Configuration: FC = (props): ReactElement => {
= (props): ReactElement => { InputProps={{ startAdornment: , }} + onChange={handleCheckpointSyncChange} />
@@ -143,6 +167,7 @@ const Configuration: FC = (props): ReactElement => {
= (props): ReactElement => { InputProps={{ startAdornment: , }} + onChange={handleInstallationPathChange} />
@@ -160,6 +186,7 @@ const Configuration: FC = (props): ReactElement => {
{ ev.preventDefault(); console.log('lols') }} sx={{ my: 2, minWidth: '215' }} variant="outlined" @@ -167,6 +194,7 @@ const Configuration: FC = (props): ReactElement => { InputProps={{ startAdornment: , }} + onChange={handleInstallationPathChange} />
From 12e67c2a6233d8a3b74413c889f54fc2a2d038b7 Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 30 May 2022 18:52:06 +0200 Subject: [PATCH 05/17] update networkpicker --- src/react/components/NetworkPicker.tsx | 46 +++++++++++--------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/src/react/components/NetworkPicker.tsx b/src/react/components/NetworkPicker.tsx index 5e5ca6b..0e1210c 100644 --- a/src/react/components/NetworkPicker.tsx +++ b/src/react/components/NetworkPicker.tsx @@ -1,32 +1,25 @@ import { BackgroundLight, } from '../colors'; -import { FormControl, FormControlLabel, Radio, RadioGroup, Button } from '@mui/material'; +import { FormControl, FormControlLabel, Radio, RadioGroup, Button, Typography } from '@mui/material'; import React, { Dispatch, SetStateAction } from 'react'; import { Network } from '../types'; import styled from '@emotion/styled'; const Container = styled.div` - display: flex; - flex-direction: column; - height: 320px; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + padding: 20px; width: 350px; - background: rgba(27, 38, 44, 0.95); border-radius: 20px; - align-items: center; background: ${BackgroundLight}; - margin: auto; - margin-top: 150px; -`; - -const Header = styled.div` - font-size: 36px; - margin-top: 30px; - margin-bottom: 30px; `; const Submit = styled(Button)` - margin: 35px auto 0; - margin-top: 35px; + margin: 8px auto 0; + text-align: center; + display: flex; `; type NetworkPickerProps = { @@ -56,16 +49,17 @@ export const NetworkPicker = (props: NetworkPickerProps) => { return ( -
Network
-
-
- - - } label={Network.PRATER} /> - } label={Network.MAINNET} /> - - -
+ + Network + +
+ + + + } label={Network.PRATER} /> + } label={Network.MAINNET} /> + + OK
From 045da87f8031d4feead2d0de0a965732b157df97 Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 30 May 2022 18:52:23 +0200 Subject: [PATCH 06/17] add initial install page --- .../components/InstallFlow/2-Install.tsx | 183 +++++++++++++++++- 1 file changed, 176 insertions(+), 7 deletions(-) diff --git a/src/react/components/InstallFlow/2-Install.tsx b/src/react/components/InstallFlow/2-Install.tsx index 143afb7..a24a188 100644 --- a/src/react/components/InstallFlow/2-Install.tsx +++ b/src/react/components/InstallFlow/2-Install.tsx @@ -1,8 +1,11 @@ import React, { FC, ReactElement } from 'react'; -import { Grid, Typography } from '@mui/material'; +import { Grid, Typography, Fab, CircularProgress, Box } from '@mui/material'; import StepNavigation from '../StepNavigation'; +import { DoneOutline, DownloadingOutlined, ComputerOutlined, RocketLaunchOutlined } from '@mui/icons-material'; import styled from '@emotion/styled'; +import { green } from '@mui/material/colors'; + type InstallProps = { onStepBack: () => void, onStepForward: () => void, @@ -22,6 +25,84 @@ const ContentGrid = styled(Grid)` * @returns */ const Install: FC = (props): ReactElement => { + + const [loadingPreInstall, setLoadingPreInstall] = React.useState(false); + const [loadingInstall, setLoadingInstall] = React.useState(false); + const [loadingPostInstall, setLoadingPostInstall] = React.useState(false); + const [successPreInstall, setSuccessPreInstall] = React.useState(false); + const [successInstall, setSuccessInstall] = React.useState(false); + const [successPostInstall, setSuccessPostInstall] = React.useState(false); + const timerPreInstall = React.useRef(); + const timerInstall = React.useRef(); + const timerPostInstall = React.useRef(); + + const buttonPreInstallSx = { + ...(successPreInstall && { + bgcolor: green[500], + '&:hover': { + bgcolor: green[700], + }, + }), + }; + + const buttonInstallSx = { + ...(successInstall && { + bgcolor: green[500], + '&:hover': { + bgcolor: green[700], + }, + }), + }; + + const buttonPostInstallSx = { + ...(successPostInstall && { + bgcolor: green[500], + '&:hover': { + bgcolor: green[700], + }, + }), + }; + + React.useEffect(() => { + return () => { + clearTimeout(timerPostInstall.current); + clearTimeout(timerPreInstall.current); + clearTimeout(timerInstall.current); + }; + }, []); + + + const handlePreInstall = () => { + if (!loadingPreInstall) { + setSuccessPreInstall(false); + setLoadingPreInstall(true); + timerPreInstall.current = window.setTimeout(() => { + setSuccessPreInstall(true); + setLoadingPreInstall(false); + }, 2000); + } + }; + const handleInstall = () => { + if (!loadingInstall) { + setSuccessInstall(false); + setLoadingInstall(true); + timerInstall.current = window.setTimeout(() => { + setSuccessInstall(true); + setLoadingInstall(false); + }, 2000); + } + }; + const handlePostInstall = () => { + if (!loadingPostInstall) { + setSuccessPostInstall(false); + setLoadingPostInstall(true); + timerPostInstall.current = window.setTimeout(() => { + setSuccessPostInstall(true); + setLoadingPostInstall(false); + }, 2000); + } + }; + return ( @@ -29,12 +110,100 @@ const Install: FC = (props): ReactElement => { Installing - -
    -
  • Downloading Clients
  • -
  • Starting Consensus Client
  • -
  • Starting Execution Client
  • -
+ + + + + + + {successPreInstall ? : } + + {loadingPreInstall && ( + + )} + + + + Downloading dependencies + + + + + + + + + {successInstall ? : } + + {loadingInstall && ( + + )} + + + + Installing services + + + + + + + + + {successPostInstall ? : } + + {loadingPostInstall && ( + + )} + + + + Configuring and launching + + + {/* props.children is the stepper */} {props.children} From 2dd4597de8722f821a22ec5cce1d5999daf77535 Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 30 May 2022 21:01:10 +0200 Subject: [PATCH 07/17] Install animation flow --- src/react/App.tsx | 14 +- .../InstallFlow/1-Configuration.tsx | 38 +- .../components/InstallFlow/2-Install.tsx | 167 ++- src/react/components/NetworkPicker.tsx | 17 +- src/react/pages/Home.tsx | 8 +- src/react/pages/MainWizard.tsx | 13 +- src/react/pages/SystemOverview.tsx | 13 +- yarn.lock | 1185 +++++++++-------- 8 files changed, 808 insertions(+), 647 deletions(-) diff --git a/src/react/App.tsx b/src/react/App.tsx index 717c4f2..37aa8ab 100644 --- a/src/react/App.tsx +++ b/src/react/App.tsx @@ -9,6 +9,7 @@ import MainWizard from "./pages/MainWizard"; import theme from "./theme"; import { Network } from './types'; import SystemOverview from "./pages/SystemOverview"; +import { ConsensusClient, ExecutionClient, InstallDetails } from "../electron/IMultiClientInstaller"; const Container = styled.main` display: block; @@ -21,7 +22,12 @@ const Container = styled.main` * @returns the react element containing the app */ const App: FC = (): ReactElement => { - const [network, setNetwork] = useState(Network.PRATER); + // const [network, setNetwork] = useState(Network.PRATER); + const [installationDetails, setInstallationDetails] = useState({ + consensusClient: ConsensusClient.PRYSM, + executionClient: ExecutionClient.GETH, + network: Network.PRATER + }) return ( @@ -29,9 +35,9 @@ const App: FC = (): ReactElement => { - } /> - } /> - } /> + } /> + } /> + } /> diff --git a/src/react/components/InstallFlow/1-Configuration.tsx b/src/react/components/InstallFlow/1-Configuration.tsx index e9497cb..0835d7e 100644 --- a/src/react/components/InstallFlow/1-Configuration.tsx +++ b/src/react/components/InstallFlow/1-Configuration.tsx @@ -1,16 +1,17 @@ -import React, { ChangeEvent, FC, FormEvent, ReactElement, useState } from 'react'; +import React, { ChangeEvent, Dispatch, FC, FormEvent, ReactElement, SetStateAction, useState } from 'react'; import { Grid, Typography, FormControl, Select, MenuItem, InputLabel, SelectChangeEvent, Modal, Box, Button, TextField, InputAdornment } from '@mui/material'; import { Folder, Link } from '@mui/icons-material' import StepNavigation from '../StepNavigation'; import styled from '@emotion/styled'; import { ConsensusClients, ExecutionClients, IConsensusClient, IExecutionClient } from '../../constants' -import { ConsensusClient } from '../../../electron/IMultiClientInstaller'; +import { ConsensusClient, ExecutionClient, InstallDetails } from '../../../electron/IMultiClientInstaller'; import { BackgroundLight, } from '../../colors'; - type ConfigurationProps = { onStepBack: () => void, onStepForward: () => void, + installationDetails: InstallDetails, + setInstallationDetails: Dispatch> } const ContentGrid = styled(Grid)` @@ -41,26 +42,26 @@ const ModalStyle = { * @returns */ const Configuration: FC = (props): ReactElement => { - const [consensusClient, setConsensusClient] = useState('prysm'); - const [executionClient, setExecutionClient] = useState('geth'); + const [consensusClient, setConsensusClient] = useState(props.installationDetails.consensusClient); + const [executionClient, setExecutionClient] = useState(props.installationDetails.executionClient); const [isModalOpen, setModalOpen] = useState(false) const [checkpointSync, setCheckpointSync] = useState(''); const [executionClientFallback, setExecutionClientFallback] = useState(''); const [installationPath, setInstallationPath] = useState(''); const handleConsensusClientChange = (ev: SelectChangeEvent) => { - setConsensusClient(ev.target.value) + setConsensusClient(ev.target.value as ConsensusClient) } const handleExecutionClientChange = (ev: SelectChangeEvent) => { - setExecutionClient(ev.target.value) + setExecutionClient(ev.target.value as ExecutionClient) } const handleCheckpointSyncChange = (ev: ChangeEvent) => { setCheckpointSync(ev.target.value) } const handleExecutionClientFallbackChange = (ev: ChangeEvent) => { - setExecutionClient(ev.target.value) + setExecutionClientFallback(ev.target.value) } const handleInstallationPathChange = (ev: ChangeEvent) => { setInstallationPath(ev.target.value) @@ -151,9 +152,8 @@ const Configuration: FC = (props): ReactElement => { placeholder="https://beaconcha.in/checkpoint" type={'url'} sx={{ my: 2, minWidth: '215' }} - // label="Checkpoint URL" variant="outlined" - disabled + value={checkpointSync} InputProps={{ startAdornment: , }} @@ -172,11 +172,11 @@ const Configuration: FC = (props): ReactElement => { sx={{ my: 2, minWidth: '215' }} // label="Fallback URL" variant="outlined" - disabled + value={executionClientFallback} InputProps={{ startAdornment: , }} - onChange={handleInstallationPathChange} + onChange={handleExecutionClientFallbackChange} />
@@ -191,6 +191,7 @@ const Configuration: FC = (props): ReactElement => { sx={{ my: 2, minWidth: '215' }} variant="outlined" disabled + value={installationPath} InputProps={{ startAdornment: , }} @@ -207,7 +208,18 @@ const Configuration: FC = (props): ReactElement => { {props.children} { + + let installationDetails: InstallDetails = { + consensusClient, + executionClient, + network: props.installationDetails.network + } + + props.setInstallationDetails(installationDetails) + + props.onStepForward() + }} backLabel={"Back"} nextLabel={"Install"} disableBack={false} diff --git a/src/react/components/InstallFlow/2-Install.tsx b/src/react/components/InstallFlow/2-Install.tsx index a24a188..083a202 100644 --- a/src/react/components/InstallFlow/2-Install.tsx +++ b/src/react/components/InstallFlow/2-Install.tsx @@ -1,14 +1,17 @@ -import React, { FC, ReactElement } from 'react'; +import React, { Dispatch, FC, ReactElement, SetStateAction, useState, useRef, useEffect, MouseEventHandler } from 'react'; import { Grid, Typography, Fab, CircularProgress, Box } from '@mui/material'; import StepNavigation from '../StepNavigation'; import { DoneOutline, DownloadingOutlined, ComputerOutlined, RocketLaunchOutlined } from '@mui/icons-material'; import styled from '@emotion/styled'; import { green } from '@mui/material/colors'; +import { InstallDetails } from '../../../electron/IMultiClientInstaller'; type InstallProps = { onStepBack: () => void, onStepForward: () => void, + installationDetails: InstallDetails, + setInstallationDetails: Dispatch> } const ContentGrid = styled(Grid)` @@ -26,15 +29,19 @@ const ContentGrid = styled(Grid)` */ const Install: FC = (props): ReactElement => { - const [loadingPreInstall, setLoadingPreInstall] = React.useState(false); - const [loadingInstall, setLoadingInstall] = React.useState(false); - const [loadingPostInstall, setLoadingPostInstall] = React.useState(false); - const [successPreInstall, setSuccessPreInstall] = React.useState(false); - const [successInstall, setSuccessInstall] = React.useState(false); - const [successPostInstall, setSuccessPostInstall] = React.useState(false); - const timerPreInstall = React.useRef(); - const timerInstall = React.useRef(); - const timerPostInstall = React.useRef(); + const [loadingPreInstall, setLoadingPreInstall] = useState(false); + const [loadingInstall, setLoadingInstall] = useState(false); + const [loadingPostInstall, setLoadingPostInstall] = useState(false); + const [successPreInstall, setSuccessPreInstall] = useState(false); + const [successInstall, setSuccessInstall] = useState(false); + const [successPostInstall, setSuccessPostInstall] = useState(false); + const timerPreInstall = useRef(); + const timerInstall = useRef(); + const timerPostInstall = useRef(); + const timerWaitBeforeStart = useRef(); + + const [disableBack, setDisableBack] = useState(true) + const [disableForward, setDisableForward] = useState(true) const buttonPreInstallSx = { ...(successPreInstall && { @@ -63,65 +70,109 @@ const Install: FC = (props): ReactElement => { }), }; - React.useEffect(() => { + useEffect(() => { return () => { clearTimeout(timerPostInstall.current); clearTimeout(timerPreInstall.current); clearTimeout(timerInstall.current); + clearTimeout(timerWaitBeforeStart.current) }; }, []); - const handlePreInstall = () => { - if (!loadingPreInstall) { - setSuccessPreInstall(false); - setLoadingPreInstall(true); - timerPreInstall.current = window.setTimeout(() => { - setSuccessPreInstall(true); - setLoadingPreInstall(false); - }, 2000); - } + const handlePreInstall: () => Promise = () => { + return new Promise((resolve) => { + if (!loadingPreInstall) { + setSuccessPreInstall(false); + setLoadingPreInstall(true); + + window.ethDocker.preInstall() + .then((preInstallResult) => { + setSuccessPreInstall(true); + setLoadingPreInstall(false); + resolve(preInstallResult) + }) + + } + }) }; - const handleInstall = () => { - if (!loadingInstall) { - setSuccessInstall(false); - setLoadingInstall(true); - timerInstall.current = window.setTimeout(() => { - setSuccessInstall(true); - setLoadingInstall(false); - }, 2000); - } + + const handleInstall: () => Promise = () => { + return new Promise((resolve) => { + if (!loadingInstall) { + setSuccessInstall(false); + setLoadingInstall(true); + + window.ethDocker.install(props.installationDetails) + .then(res => { + setSuccessInstall(true); + setLoadingInstall(false); + resolve(res) + }) + } + }) }; - const handlePostInstall = () => { - if (!loadingPostInstall) { - setSuccessPostInstall(false); - setLoadingPostInstall(true); - timerPostInstall.current = window.setTimeout(() => { - setSuccessPostInstall(true); - setLoadingPostInstall(false); - }, 2000); - } + + const handlePostInstall: () => Promise = () => { + return new Promise((resolve) => { + if (!loadingPostInstall) { + setSuccessPostInstall(false); + setLoadingPostInstall(true); + + window.ethDocker.importKeys(props.installationDetails.network, '/home/remy/keys', 'password') + .then((importKeyResult) => { + if(importKeyResult) { + window.ethDocker.postInstall(props.installationDetails.network) + .then((res) => { + resolve(res) + } + ) + } + }) + } + }) }; + const install = async () => { + let preInstallResult = await handlePreInstall() + if (!preInstallResult) { + return + } + let installResult = await handleInstall() + if (!installResult) { + return + } + let postInstallResult = await handlePostInstall() + if (!postInstallResult) { + setDisableForward(false) + } + } + + useEffect(() => { + install() + }, []) + return ( - Installing + Installing - - + + - {successPreInstall ? : } + {successPreInstall ? : } {loadingPreInstall && ( = (props): ReactElement => { )} - + + Downloading dependencies - - + + - {successInstall ? : } + {successInstall ? : } {loadingInstall && ( = (props): ReactElement => { )} + Installing services - - + + - {successPostInstall ? : } + {successPostInstall ? + : } {loadingPostInstall && ( = (props): ReactElement => { )} + Configuring and launching @@ -212,8 +271,8 @@ const Install: FC = (props): ReactElement => { onNext={props.onStepForward} backLabel={"Back"} nextLabel={"Finish"} - disableBack={false} - disableNext={false} + disableBack={disableBack} + disableNext={disableForward} /> ); diff --git a/src/react/components/NetworkPicker.tsx b/src/react/components/NetworkPicker.tsx index 0e1210c..1036fa6 100644 --- a/src/react/components/NetworkPicker.tsx +++ b/src/react/components/NetworkPicker.tsx @@ -4,6 +4,7 @@ import React, { Dispatch, SetStateAction } from 'react'; import { Network } from '../types'; import styled from '@emotion/styled'; +import { InstallDetails } from '../../electron/IMultiClientInstaller'; const Container = styled.div` position: absolute; @@ -24,16 +25,16 @@ const Submit = styled(Button)` type NetworkPickerProps = { handleCloseNetworkModal: (event: object, reason: string) => void, - setNetwork: Dispatch>, - network: Network, + setInstallationDetails: Dispatch>, + installationDetails: InstallDetails, } /** * This is the network picker modal component where the user selects the desired network. * * @param props.handleCloseNetworkModal function to handle closing the network modal - * @param props.setNetwork update the selected network - * @param props.network the selected network + * @param props.setInstallationDetails the currently set installation details + * @param props.installationDetails the current installation details * @returns the network picker element to render */ export const NetworkPicker = (props: NetworkPickerProps) => { @@ -44,7 +45,11 @@ export const NetworkPicker = (props: NetworkPickerProps) => { } const networkChanged = (selected: React.ChangeEvent) => { - props.setNetwork(selected.target.value as Network); + + let network = selected.target.value as Network + let details = { ...props.installationDetails, network } + + props.setInstallationDetails(details); } return ( @@ -55,7 +60,7 @@ export const NetworkPicker = (props: NetworkPickerProps) => {
- + } label={Network.PRATER} /> } label={Network.MAINNET} /> diff --git a/src/react/pages/Home.tsx b/src/react/pages/Home.tsx index f44acb0..fadaa3f 100644 --- a/src/react/pages/Home.tsx +++ b/src/react/pages/Home.tsx @@ -57,8 +57,8 @@ const ContentGrid = styled(Grid)` `; type HomeProps = { - network: Network, - setNetwork: Dispatch> + installationDetails: InstallDetails, + setInstallationDetails: Dispatch> } /** @@ -151,7 +151,7 @@ const Home: FC = (props): ReactElement => { return ( - Select Network: + Select Network: = (props): ReactElement => { > {/* Added
here per the following link to fix error https://stackoverflow.com/a/63521049/5949270 */}
- +
diff --git a/src/react/pages/MainWizard.tsx b/src/react/pages/MainWizard.tsx index ae34650..5b53cfc 100644 --- a/src/react/pages/MainWizard.tsx +++ b/src/react/pages/MainWizard.tsx @@ -1,4 +1,4 @@ -import React, { FC, ReactElement, useState } from 'react'; +import React, { FC, ReactElement, SetStateAction, useState, Dispatch } from 'react'; import { useParams, useNavigate } from "react-router-dom"; import { Stepper, Step, StepLabel, Grid, Typography } from '@mui/material'; import styled from '@emotion/styled'; @@ -9,6 +9,7 @@ import VersionFooter from '../components/VersionFooter'; import Install from '../components/InstallFlow/2-Install'; import Configuration from '../components/InstallFlow/1-Configuration'; import SystemCheck from '../components/InstallFlow/0-SystemCheck'; +import { InstallDetails } from '../../electron/IMultiClientInstaller'; const stepSequenceMap: Record = { install: [ @@ -30,7 +31,8 @@ type RouteParams = { }; type WizardProps = { - network: Network + installationDetails: InstallDetails, + setInstallationDetails: Dispatch> } /** @@ -85,10 +87,13 @@ const Wizard: FC = (props): ReactElement => { ); + const commonProps = { onStepForward, onStepBack, - children: stepper + installationDetails: props.installationDetails, + setInstallationDetails: props.setInstallationDetails, + children: stepper, }; /** @@ -120,7 +125,7 @@ const Wizard: FC = (props): ReactElement => { - Network: {props.network} + Network: {props.installationDetails.network} diff --git a/src/react/pages/SystemOverview.tsx b/src/react/pages/SystemOverview.tsx index 7a306cb..6b9ffe9 100644 --- a/src/react/pages/SystemOverview.tsx +++ b/src/react/pages/SystemOverview.tsx @@ -3,6 +3,7 @@ import { Grid, Typography } from '@mui/material'; import { Network } from "../types"; import styled from '@emotion/styled'; import VersionFooter from "../components/VersionFooter"; +import { InstallDetails } from "../../electron/IMultiClientInstaller"; const MainGrid = styled(Grid)` width: 100%; @@ -11,7 +12,7 @@ const MainGrid = styled(Grid)` `; type SystemOverviewProps = { - network: Network + installationDetails: InstallDetails } const SystemOverview: FC = (props): ReactElement => { @@ -21,14 +22,20 @@ const SystemOverview: FC = (props): ReactElement => { - Network: {props.network} + Network: {props.installationDetails.network} - System Overview + {/* System Overview */} + Installation Complete +
    +
  • Network: {props.installationDetails.network}
  • +
  • Consensus Client: {props.installationDetails.consensusClient}
  • +
  • Execution Client: {props.installationDetails.executionClient}
  • +
diff --git a/yarn.lock b/yarn.lock index 58afef4..c087d5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -45,13 +45,13 @@ __metadata: linkType: hard "@babel/highlight@npm:^7.16.7": - version: 7.16.10 - resolution: "@babel/highlight@npm:7.16.10" + version: 7.17.9 + resolution: "@babel/highlight@npm:7.17.9" dependencies: "@babel/helper-validator-identifier": ^7.16.7 chalk: ^2.0.0 js-tokens: ^4.0.0 - checksum: 1f1bdd752a90844f4efc22166a46303fb651ba0fd75a06daba3ebae2575ab3edc1da9827c279872a3aaf305f50a18473c5fa1966752726a2b253065fd4c0745e + checksum: 7bdf10228f2e4d18f48f114411ed584380d356e7c168d7582c14abd8df9909b2fc09e0a7cd334f47c3eb0bc17e639e0c8d9688c6afd5d09a2bdbf0ac193b11fd languageName: node linkType: hard @@ -67,11 +67,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.7": - version: 7.17.2 - resolution: "@babel/runtime@npm:7.17.2" + version: 7.17.9 + resolution: "@babel/runtime@npm:7.17.9" dependencies: regenerator-runtime: ^0.13.4 - checksum: a48702d271ecc59c09c397856407afa29ff980ab537b3da58eeee1aeaa0f545402d340a1680c9af58aec94dfdcbccfb6abb211991b74686a86d03d3f6956cacd + checksum: 4d56bdb82890f386d5a57c40ef985a0ed7f0a78f789377a2d0c3e8826819e0f7f16ba0fe906d9b2241c5f7ca56630ef0653f5bb99f03771f7b87ff8af4bf5fe3 languageName: node linkType: hard @@ -96,15 +96,15 @@ __metadata: linkType: hard "@discoveryjs/json-ext@npm:^0.5.0": - version: 0.5.6 - resolution: "@discoveryjs/json-ext@npm:0.5.6" - checksum: e97df618511fb202dffa2eb0d23e17dfb02943a70e5bc38f6b9603ad1cb1d6b525aa2b07ff9fb00b041abe425b341146ddd9e487f1e35ddadc8c6b8c56358ae0 + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 languageName: node linkType: hard "@electron/get@npm:^1.13.0": - version: 1.13.1 - resolution: "@electron/get@npm:1.13.1" + version: 1.14.1 + resolution: "@electron/get@npm:1.14.1" dependencies: debug: ^4.1.1 env-paths: ^2.2.0 @@ -120,7 +120,7 @@ __metadata: optional: true global-tunnel-ng: optional: true - checksum: ea9863b73e8aedefb19cfe9b849c585b8bda29e11b90189b115680da4e9ab0167405efe63e5d141da2d13cde24eacacfde62f730f2730d047e58819fe69352f8 + checksum: 21fec5e82bbee8f9fa183b46e05675b137c3130c7999d3b2b34a0047d1a06ec3c76347b9bbdb9911ba9b2123697804e360a15dda9db614c0226d5d4dcc4d6d15 languageName: node linkType: hard @@ -138,8 +138,8 @@ __metadata: linkType: hard "@emotion/babel-plugin@npm:^11.7.1": - version: 11.7.2 - resolution: "@emotion/babel-plugin@npm:11.7.2" + version: 11.9.2 + resolution: "@emotion/babel-plugin@npm:11.9.2" dependencies: "@babel/helper-module-imports": ^7.12.13 "@babel/plugin-syntax-jsx": ^7.12.13 @@ -155,7 +155,7 @@ __metadata: stylis: 4.0.13 peerDependencies: "@babel/core": ^7.0.0 - checksum: eb9607356663c3e158b91ae7b8fde7335c74e6302d1671da1ca0b34142f762e1354bac8cb0bdf5baedf1278912eeea01e103b8f5c59ee107746d1b03f56aa664 + checksum: 2d2c4fadd389862896bcbc5f42c9b9c1a199810173fcf14e5520506c7179c2ddb991b8832fd273f42104cf0dae98886ad8e767b5e38ad235b652d903c3b8a328 languageName: node linkType: hard @@ -196,14 +196,13 @@ __metadata: linkType: hard "@emotion/react@npm:^11.8.1": - version: 11.8.1 - resolution: "@emotion/react@npm:11.8.1" + version: 11.9.0 + resolution: "@emotion/react@npm:11.9.0" dependencies: "@babel/runtime": ^7.13.10 "@emotion/babel-plugin": ^11.7.1 "@emotion/cache": ^11.7.1 - "@emotion/serialize": ^1.0.2 - "@emotion/sheet": ^1.1.0 + "@emotion/serialize": ^1.0.3 "@emotion/utils": ^1.1.0 "@emotion/weak-memoize": ^0.2.5 hoist-non-react-statics: ^3.3.1 @@ -215,20 +214,20 @@ __metadata: optional: true "@types/react": optional: true - checksum: a767c6d7ca9e45dc3c1e873cfa51952db24e0d279944403ceb06be82d15859354e128becf6f7d0f8ff2b5f3460e3c165cd2b16ab1a2446e8e15e134a69e6ea3a + checksum: 4ceb004f942fb7557a55ea17aad2c48c4cd48ed5a780ccdc2993e4bded2f94d7c1764bd2f4fbe53f5b26059263599cec64ff66d29447e281a58c60b39c72e5cc languageName: node linkType: hard -"@emotion/serialize@npm:^1.0.2": - version: 1.0.2 - resolution: "@emotion/serialize@npm:1.0.2" +"@emotion/serialize@npm:^1.0.2, @emotion/serialize@npm:^1.0.3": + version: 1.0.3 + resolution: "@emotion/serialize@npm:1.0.3" dependencies: "@emotion/hash": ^0.8.0 "@emotion/memoize": ^0.7.4 "@emotion/unitless": ^0.7.5 "@emotion/utils": ^1.0.0 csstype: ^3.0.2 - checksum: ff84fbe09ec06e7ad3deaef5c5b5ea6af6a522e8efe49c2b398b875d06872626284a83b6b18b7f777750c94264a61e7924157d869d9bca2f675731bbb91a6055 + checksum: 99a9053bd98c99d63af542ebee029281eeaf653e3a12e97ee79bad7330c68408104c30be6fc07a528e38bb69aba680655181744b76ec6c6f459c121cb805fac2 languageName: node linkType: hard @@ -283,16 +282,16 @@ __metadata: linkType: hard "@fontsource/roboto@npm:^4.5.3": - version: 4.5.3 - resolution: "@fontsource/roboto@npm:4.5.3" - checksum: 5c25485184dcb9162834ef2633528b8c21812ae4bbb37e9a32f07b4db93226361d6b60fe71c61b60aeea7e9fe69be6c9d80b05eea477ec71f166a0fd3feb3df5 + version: 4.5.5 + resolution: "@fontsource/roboto@npm:4.5.5" + checksum: ab6675e04392ccd5def878762be67dbbf64f77c49c26030c6a1d03c34ce33045b0eb1199ad1bd3f398f362e5fa1fcbcbe25c18af8dda855ab43df45561eea569 languageName: node linkType: hard -"@gar/promisify@npm:^1.0.1": - version: 1.1.2 - resolution: "@gar/promisify@npm:1.1.2" - checksum: d05081e0887a49c178b75ee3067bd6ee086f73c154d121b854fb2e044e8a89cb1cbb6de3a0dd93a519b80f0531fda68b099dd7256205f7fbb3490324342f2217 +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 languageName: node linkType: hard @@ -324,56 +323,57 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-alpha.70": - version: 5.0.0-alpha.70 - resolution: "@mui/base@npm:5.0.0-alpha.70" +"@mui/base@npm:5.0.0-alpha.78": + version: 5.0.0-alpha.78 + resolution: "@mui/base@npm:5.0.0-alpha.78" dependencies: "@babel/runtime": ^7.17.2 "@emotion/is-prop-valid": ^1.1.2 - "@mui/utils": ^5.4.4 - "@popperjs/core": ^2.4.4 + "@mui/types": ^7.1.3 + "@mui/utils": ^5.6.1 + "@popperjs/core": ^2.11.5 clsx: ^1.1.1 prop-types: ^15.7.2 react-is: ^17.0.2 peerDependencies: - "@types/react": ^16.8.6 || ^17.0.0 - react: ^17.0.0 - react-dom: ^17.0.0 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: aeed05cc8aab79e2dd1fcb89b40f5a108deb9c3eb5824bb7314355045d379c773b30c262dd3dbb1b260067004fd58d7648b3e93e499335dd41801aef64e59b86 + checksum: f0c3d29c6baa5e696f70c54f3c8f50e6426ce8af904472eb04aea346100b485cc500baaa2390093b79a1339b7adea18e2435ffa387dab5160dcfb113b5aecc16 languageName: node linkType: hard "@mui/icons-material@npm:^5.4.4": - version: 5.4.4 - resolution: "@mui/icons-material@npm:5.4.4" + version: 5.6.2 + resolution: "@mui/icons-material@npm:5.6.2" dependencies: "@babel/runtime": ^7.17.2 peerDependencies: "@mui/material": ^5.0.0 - "@types/react": ^16.8.6 || ^17.0.0 - react: ^17.0.0 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: c8207018a28a32b6447c682705ab0235e6250046c726bfb5bd9b65f81d633e02bdda8c0efa09906b52b2b31bea8c34a06465a60332c6b6057134c874e1ac600a + checksum: eef561fc68c01f103a8edde897b95628d179f4b79bf59a8cfa005db3dde1c473b13a803534018e901d5df287820bf6d62097dcad1c10db531ef237b407cfb51e languageName: node linkType: hard "@mui/material@npm:^5.4.4": - version: 5.4.4 - resolution: "@mui/material@npm:5.4.4" + version: 5.6.3 + resolution: "@mui/material@npm:5.6.3" dependencies: "@babel/runtime": ^7.17.2 - "@mui/base": 5.0.0-alpha.70 - "@mui/system": ^5.4.4 - "@mui/types": ^7.1.2 - "@mui/utils": ^5.4.4 + "@mui/base": 5.0.0-alpha.78 + "@mui/system": ^5.6.3 + "@mui/types": ^7.1.3 + "@mui/utils": ^5.6.1 "@types/react-transition-group": ^4.4.4 clsx: ^1.1.1 - csstype: ^3.0.10 + csstype: ^3.0.11 hoist-non-react-statics: ^3.3.2 prop-types: ^15.7.2 react-is: ^17.0.2 @@ -381,9 +381,9 @@ __metadata: peerDependencies: "@emotion/react": ^11.5.0 "@emotion/styled": ^11.3.0 - "@types/react": ^16.8.6 || ^17.0.0 - react: ^17.0.0 - react-dom: ^17.0.0 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@emotion/react": optional: true @@ -391,30 +391,30 @@ __metadata: optional: true "@types/react": optional: true - checksum: c24017266a6ae20b9aaaed86a60a418e496f38b44732d3de472e797133009027bcc5a984579de9ff2afe8a25f5cb8df4a20def24b3dfccdcf775f41f15996bf8 + checksum: d81f2870fc08458ce7bb02fb07adc165eb97e99380d141af75cbc4829fbb2d7ebe4d8d46821dc2e85b491bc2e7e5b3435f168289e3a419107f98d4d63029827f languageName: node linkType: hard -"@mui/private-theming@npm:^5.4.4": - version: 5.4.4 - resolution: "@mui/private-theming@npm:5.4.4" +"@mui/private-theming@npm:^5.6.2": + version: 5.6.2 + resolution: "@mui/private-theming@npm:5.6.2" dependencies: "@babel/runtime": ^7.17.2 - "@mui/utils": ^5.4.4 + "@mui/utils": ^5.6.1 prop-types: ^15.7.2 peerDependencies: - "@types/react": ^16.8.6 || ^17.0.0 - react: ^17.0.0 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: db180442865c29c50744fe55e696a53e2b3516389eca5d303a04a13df8ee715004ce6614a2cebbff46b6542a08753e949c335870ad163d961066ba765703f9fc + checksum: 6fa6c16c52255203123a83e9c50e9f5eac70c4b749f32157fbd6a2f7c12716dda5128bc830476a7e39e356a4a4cf2343d84c72d72979ab17aa924a4afb6c41a4 languageName: node linkType: hard -"@mui/styled-engine@npm:^5.4.4": - version: 5.4.4 - resolution: "@mui/styled-engine@npm:5.4.4" +"@mui/styled-engine@npm:^5.6.1": + version: 5.6.1 + resolution: "@mui/styled-engine@npm:5.6.1" dependencies: "@babel/runtime": ^7.17.2 "@emotion/cache": ^11.7.1 @@ -422,33 +422,33 @@ __metadata: peerDependencies: "@emotion/react": ^11.4.1 "@emotion/styled": ^11.3.0 - react: ^17.0.0 + react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@emotion/react": optional: true "@emotion/styled": optional: true - checksum: bdbc35a760fc6873bb5c0953a4448c26e66942b104cf370a1c39b582c3aa2c39b1543c971c2c660cbd508ec89a27d9e326d7c56fe78fad58571bab0f6a340ab0 + checksum: cd17d05902118d5cab20e321a2a8240de3be00454b7dfbce9cfb81404a7b3d996ad6b7de19dbf5fcfc7ee7a0f7acd80fc779830af1d2787914fb1b42408b4904 languageName: node linkType: hard -"@mui/system@npm:^5.4.4": - version: 5.4.4 - resolution: "@mui/system@npm:5.4.4" +"@mui/system@npm:^5.6.3": + version: 5.6.3 + resolution: "@mui/system@npm:5.6.3" dependencies: "@babel/runtime": ^7.17.2 - "@mui/private-theming": ^5.4.4 - "@mui/styled-engine": ^5.4.4 - "@mui/types": ^7.1.2 - "@mui/utils": ^5.4.4 + "@mui/private-theming": ^5.6.2 + "@mui/styled-engine": ^5.6.1 + "@mui/types": ^7.1.3 + "@mui/utils": ^5.6.1 clsx: ^1.1.1 - csstype: ^3.0.10 + csstype: ^3.0.11 prop-types: ^15.7.2 peerDependencies: "@emotion/react": ^11.5.0 "@emotion/styled": ^11.3.0 - "@types/react": ^16.8.6 || ^17.0.0 - react: ^17.0.0 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@emotion/react": optional: true @@ -456,25 +456,25 @@ __metadata: optional: true "@types/react": optional: true - checksum: 8a296a3315bbe4822ae1a65f9b5b56c2223bd682065b88ada45dbe82b6039d6046a7aab5296a56ab42d4e922d6807bc6575034a99b5affbf2a9ad3d6e9496216 + checksum: 63e119b46c829b5ec6c6a2628ca309a9f17e0f0e3123ee7d9a7a57fe838c59e5efdafc5993a7e8c91168722c0618f63eff66afa3b7f61f92bfd8e872fdcf4773 languageName: node linkType: hard -"@mui/types@npm:^7.1.2": - version: 7.1.2 - resolution: "@mui/types@npm:7.1.2" +"@mui/types@npm:^7.1.3": + version: 7.1.3 + resolution: "@mui/types@npm:7.1.3" peerDependencies: "@types/react": "*" peerDependenciesMeta: "@types/react": optional: true - checksum: 0d37947b0d2bcaed80b245ec4ac91bdff64ffedb5b0d56784311472b2c44131498ea700485f09dd3236baa97cd16af628e398453263e7081fabfe4fc1477249c + checksum: 4990f505f1058bdd4c01ea21a6a6f788e5d3ff73b50962879d33bbf9c98ef1f18d8b6664025ce1dbd42544a79d7697d0011834f8fd83d12c9705f2c702829bb4 languageName: node linkType: hard -"@mui/utils@npm:^5.4.4": - version: 5.4.4 - resolution: "@mui/utils@npm:5.4.4" +"@mui/utils@npm:^5.6.1": + version: 5.6.1 + resolution: "@mui/utils@npm:5.6.1" dependencies: "@babel/runtime": ^7.17.2 "@types/prop-types": ^15.7.4 @@ -482,35 +482,35 @@ __metadata: prop-types: ^15.7.2 react-is: ^17.0.2 peerDependencies: - react: ^17.0.0 - checksum: 7f5cbf71f01750e6449769e3a6878c05e5488d85dcdacf14362ac1f5047ae1dc061416de740075482764602a029a313a1c6378297d89ec2091ef86d00d6b4e55 + react: ^17.0.0 || ^18.0.0 + checksum: b05c57263e63d4f518ee416760114cfecfe3bdf23491cf277a69fedc47d00db52e799d90a384854a81d936bbaa7ea9907e4978ebd1c181305c5c2d19818d0b7c languageName: node linkType: hard -"@npmcli/fs@npm:^1.0.0": - version: 1.1.0 - resolution: "@npmcli/fs@npm:1.1.0" +"@npmcli/fs@npm:^2.1.0": + version: 2.1.0 + resolution: "@npmcli/fs@npm:2.1.0" dependencies: - "@gar/promisify": ^1.0.1 + "@gar/promisify": ^1.1.3 semver: ^7.3.5 - checksum: e435b883b4f8da8c95a820f458cabb7d86582406eed5ad79fc689000d3e2df17e1f475c4903627272c001357cabc70d8b4c62520cbdae8cfab1dfdd51949f408 + checksum: 6ec6d678af6da49f9dac50cd882d7f661934dd278972ffbaacde40d9eaa2871292d634000a0cca9510f6fc29855fbd4af433e1adbff90a524ec3eaf140f1219b languageName: node linkType: hard -"@npmcli/move-file@npm:^1.0.1": - version: 1.1.2 - resolution: "@npmcli/move-file@npm:1.1.2" +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.0 + resolution: "@npmcli/move-file@npm:2.0.0" dependencies: mkdirp: ^1.0.4 rimraf: ^3.0.2 - checksum: c96381d4a37448ea280951e46233f7e541058cf57a57d4094dd4bdcaae43fa5872b5f2eb6bfb004591a68e29c5877abe3cdc210cb3588cbf20ab2877f31a7de7 + checksum: 1388777b507b0c592d53f41b9d182e1a8de7763bc625fc07999b8edbc22325f074e5b3ec90af79c89d6987fdb2325bc66d59f483258543c14a43661621f841b0 languageName: node linkType: hard -"@popperjs/core@npm:^2.4.4": - version: 2.11.2 - resolution: "@popperjs/core@npm:2.11.2" - checksum: 5695bf020eda54636e16a62dc9b5fdd92beaf7b2d19f62fcef049d57c5cff92773562d80cbf760b217c3ec928da310eb24994ab6a00fd39dffa0af9b5dfc01a6 +"@popperjs/core@npm:^2.11.5": + version: 2.11.5 + resolution: "@popperjs/core@npm:2.11.5" + checksum: fd7f9dca3fb716d7426332b6ee283f88d2724c0ab342fb678865a640bad403dfb9eeebd8204a406986162f7e2b33394f104320008b74d0e9066d7322f70ea35d languageName: node linkType: hard @@ -530,10 +530,10 @@ __metadata: languageName: node linkType: hard -"@tootallnate/once@npm:1": - version: 1.1.2 - resolution: "@tootallnate/once@npm:1.1.2" - checksum: e1fb1bbbc12089a0cb9433dc290f97bddd062deadb6178ce9bcb93bb7c1aecde5e60184bc7065aec42fe1663622a213493c48bbd4972d931aae48315f18e1be9 +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 languageName: node linkType: hard @@ -546,7 +546,7 @@ __metadata: languageName: node linkType: hard -"@types/eslint-scope@npm:^3.7.0": +"@types/eslint-scope@npm:^3.7.3": version: 3.7.3 resolution: "@types/eslint-scope@npm:3.7.3" dependencies: @@ -557,19 +557,19 @@ __metadata: linkType: hard "@types/eslint@npm:*": - version: 8.2.2 - resolution: "@types/eslint@npm:8.2.2" + version: 8.4.1 + resolution: "@types/eslint@npm:8.4.1" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: acbbaecea2675b63cc4b067df499bb15906a56379a3603a9f6afffe2eb688b30bb73b1f5a402e44de36c5dc76abf59027a9f557b171d0b544ad01fa333118b6b + checksum: b5790997ee9d3820d16350192d41849b0e2448c9e93650acac672ddf502e35c0a5a25547172a9eec840a96687cd94ba1cee672cbd86640f8f4ff1b65960d2ab9 languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^0.0.50": - version: 0.0.50 - resolution: "@types/estree@npm:0.0.50" - checksum: 9a2b6a4a8c117f34d08fbda5e8f69b1dfb109f7d149b60b00fd7a9fb6ac545c078bc590aa4ec2f0a256d680cf72c88b3b28b60c326ee38a7bc8ee1ee95624922 +"@types/estree@npm:*, @types/estree@npm:^0.0.51": + version: 0.0.51 + resolution: "@types/estree@npm:0.0.51" + checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189 languageName: node linkType: hard @@ -592,10 +592,10 @@ __metadata: languageName: node linkType: hard -"@types/history@npm:*": - version: 4.7.10 - resolution: "@types/history@npm:4.7.10" - checksum: 6cd70136a086cac4e1e7832769b1d3952ac3adb73a1b34d7adc0dce87ea7a2707a86b855fac5b74dfa02b17251a79320402c3e079f7a03c24d65e0460fdeba64 +"@types/history@npm:^4.7.11": + version: 4.7.11 + resolution: "@types/history@npm:4.7.11" + checksum: c92e2ba407dcab0581a9afdf98f533aa41b61a71133420a6d92b1ca9839f741ab1f9395b17454ba5b88cb86020b70b22d74a1950ccfbdfd9beeaa5459fdc3464 languageName: node linkType: hard @@ -607,18 +607,18 @@ __metadata: linkType: hard "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8": - version: 7.0.9 - resolution: "@types/json-schema@npm:7.0.9" - checksum: 259d0e25f11a21ba5c708f7ea47196bd396e379fddb79c76f9f4f62c945879dc21657904914313ec2754e443c5018ea8372362f323f30e0792897fdb2098a705 + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d languageName: node linkType: hard "@types/keyv@npm:^3.1.1": - version: 3.1.3 - resolution: "@types/keyv@npm:3.1.3" + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" dependencies: "@types/node": "*" - checksum: b5f8aa592cc21c16d99e69aec0976f12b893b055e4456d90148a610a6b6088e297b2ba5f38f8c8280cef006cfd8f9ec99e069905020882619dc5fc8aa46f5f27 + checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d languageName: node linkType: hard @@ -636,17 +636,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": - version: 17.0.8 - resolution: "@types/node@npm:17.0.8" - checksum: f4cadeb9e602027520abc88c77142697e33cf6ac98bb02f8b595a398603cbd33df1f94d01c055c9f13cde0c8eaafc5e396ca72645458d42b4318b845bc7f1d0f - languageName: node - linkType: hard - -"@types/node@npm:^14.6.2": - version: 14.18.12 - resolution: "@types/node@npm:14.18.12" - checksum: 8a0273caa0584020adb8802784fc7d4f18f05e6c205335b7f3818a91d6b0c22736b9f51da3428d5bc54076ad47f1a4d6d57990a3ce8489a520ac66b2b3ff24bc +"@types/node@npm:*, @types/node@npm:^14.6.2": + version: 14.18.16 + resolution: "@types/node@npm:14.18.16" + checksum: 1999799309dc8620a2adf9a5d5e48416af87321bae4c950b4aa8018fcef2c3b6c1fcf98c39eae06f6492c03a643a5a44e2bb3750cd2574d9cf7eac33bac50e24 languageName: node linkType: hard @@ -668,18 +661,18 @@ __metadata: linkType: hard "@types/prop-types@npm:*, @types/prop-types@npm:^15.7.4": - version: 15.7.4 - resolution: "@types/prop-types@npm:15.7.4" - checksum: ef6e1899e59b876c273811b1bd845022fc66d5a3d11cb38a25b6c566b30514ae38fe20a40f67622f362a4f4f7f9224e22d8da101cff3d6e97e11d7b4c307cfc1 + version: 15.7.5 + resolution: "@types/prop-types@npm:15.7.5" + checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 languageName: node linkType: hard "@types/react-dom@npm:^17.0.9": - version: 17.0.11 - resolution: "@types/react-dom@npm:17.0.11" + version: 17.0.16 + resolution: "@types/react-dom@npm:17.0.16" dependencies: - "@types/react": "*" - checksum: 4d5730dffbef86c887cecad7e3cecda424ce6a64d0b5441c63b5b015d48219868660a2bb1aa15e897e565ad8867fa6b885d4358b04e1c4e589ba4c07c3fda55c + "@types/react": ^17 + checksum: 2f41a45ef955c8f68a7bcd22343715f15e1560a5e5ba941568b3c970d9151f78fe0975ecf4df7f691339af546555e0f23fa423a0a5bcd7ea4dd4f9c245509936 languageName: node linkType: hard @@ -693,23 +686,23 @@ __metadata: linkType: hard "@types/react-router-dom@npm:^5.1.8": - version: 5.3.2 - resolution: "@types/react-router-dom@npm:5.3.2" + version: 5.3.3 + resolution: "@types/react-router-dom@npm:5.3.3" dependencies: - "@types/history": "*" + "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router": "*" - checksum: 90f052dc5a43a77edaf41d2afa781c8ed2164cd7922b3cdf5daae446b02a2f279382425e6efc338260782c0a24d25a6101e3658acb41c8a053695968a351ea96 + checksum: 28c4ea48909803c414bf5a08502acbb8ba414669b4b43bb51297c05fe5addc4df0b8fd00e0a9d1e3535ec4073ef38aaafac2c4a2b95b787167d113bc059beff3 languageName: node linkType: hard "@types/react-router@npm:*": - version: 5.1.17 - resolution: "@types/react-router@npm:5.1.17" + version: 5.1.18 + resolution: "@types/react-router@npm:5.1.18" dependencies: - "@types/history": "*" + "@types/history": ^4.7.11 "@types/react": "*" - checksum: b9d1c7b6ce073652c39712d2b02aeec7640036e369c04be2e57e4b0eb049b64ec9f34fb91cad680ab3f794e89576f77aacadb015b61eb21500a1779e5c955b86 + checksum: f08b37ee822f9f9ff904ffd0778fe2bb7c717ed3ee311610382ee024d02a35169bd3301ecde863cac21aae8fdee919501e8ea22bad0260c02c10cfbdba5c71be languageName: node linkType: hard @@ -722,14 +715,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^17.0.14": - version: 17.0.38 - resolution: "@types/react@npm:17.0.38" +"@types/react@npm:*, @types/react@npm:^17, @types/react@npm:^17.0.14": + version: 17.0.44 + resolution: "@types/react@npm:17.0.44" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: 4079f4f959cd4a4bfaeda8b89fe8a1b1f8bdc9d87acfdc5f74a0b39cec9ec6a470724357c62778c0f063180b360c250e920c5a142f1dbcda67d9cc25a6d43a85 + checksum: ebee02778ca08f954c316dc907802264e0121c87b8fa2e7e0156ab0ef2a1b0a09d968c016a3600ec4c9a17dc09b4274f292d9b15a1a5369bb7e4072def82808f languageName: node linkType: hard @@ -757,18 +750,18 @@ __metadata: linkType: hard "@types/yargs-parser@npm:*": - version: 20.2.1 - resolution: "@types/yargs-parser@npm:20.2.1" - checksum: 1d039e64494a7a61ddd278349a3dc60b19f99ff0517425696e796f794e4252452b9d62178e69755ad03f439f9dc0c8c3d7b3a1201b3a24e134bac1a09fa11eaa + version: 21.0.0 + resolution: "@types/yargs-parser@npm:21.0.0" + checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 languageName: node linkType: hard "@types/yargs@npm:^17.0.1": - version: 17.0.8 - resolution: "@types/yargs@npm:17.0.8" + version: 17.0.10 + resolution: "@types/yargs@npm:17.0.10" dependencies: "@types/yargs-parser": "*" - checksum: 63d06700ffbed745f00d7994eb92416649c8a3ead22f26446979d383f3af52fa9400bb185268f3a44a2348749098ffe33a8185ca676b77bc3206c63b8b73fd01 + checksum: f0673cbfc08e17239dc58952a88350d6c4db04a027a28a06fbad27d87b670e909f9cd9e66f9c64cebdd5071d1096261e33454a55868395f125297e5c50992ca8 languageName: node linkType: hard @@ -923,36 +916,36 @@ __metadata: languageName: node linkType: hard -"@webpack-cli/configtest@npm:^1.1.0": - version: 1.1.0 - resolution: "@webpack-cli/configtest@npm:1.1.0" +"@webpack-cli/configtest@npm:^1.1.1": + version: 1.1.1 + resolution: "@webpack-cli/configtest@npm:1.1.1" peerDependencies: webpack: 4.x.x || 5.x.x webpack-cli: 4.x.x - checksum: 69e7816b5b5d8589d5fc14af591d63831ff6ea2ca2d498c2d8bc354faaef9aeb282f70ad13df2fc5c3726be0f88c3dbc7facc37f3ab5a8cad44f562081792b28 + checksum: c4e7fca21315e487655fbdc7d079092c3f88b274a720d245ca2e13dce7553009fb3f9d82218c33f5c9b208832d72bb4114a9cca97d53b66212eff5da1d3ad44b languageName: node linkType: hard -"@webpack-cli/info@npm:^1.4.0": - version: 1.4.0 - resolution: "@webpack-cli/info@npm:1.4.0" +"@webpack-cli/info@npm:^1.4.1": + version: 1.4.1 + resolution: "@webpack-cli/info@npm:1.4.1" dependencies: envinfo: ^7.7.3 peerDependencies: webpack-cli: 4.x.x - checksum: 6385b1e2c511d0136fa53fcff5ecdc00ce7590d01648b437089e6d9c7b1866da8c6e850c41a7c52d3eb3ae23a31f3f40e1cead77ea2046ee6eb6b23a4124f4a9 + checksum: 7a7cac2ba4f2528caa329311599da1685b1bc099bfc5b7210932b7c86024c1277fd7857b08557902b187ea01247a8e8f72f7f5719af72b0c8d97f22087aa0c14 languageName: node linkType: hard -"@webpack-cli/serve@npm:^1.6.0": - version: 1.6.0 - resolution: "@webpack-cli/serve@npm:1.6.0" +"@webpack-cli/serve@npm:^1.6.1": + version: 1.6.1 + resolution: "@webpack-cli/serve@npm:1.6.1" peerDependencies: webpack-cli: 4.x.x peerDependenciesMeta: webpack-dev-server: optional: true - checksum: 050a930b63653ae0002e135cc9b0810483dd0857acd8e7ae2f41011f48f8856a150dd60c787105597ef8814541031779be1dc015ef637d70a7524d373cbbf346 + checksum: 8b273f906aeffa60c7d5700ae25f98d4b66b7e922cad38acb9575d55ff83872cd20b9894aacfa81c4d54e5b51b16253ae0e70c5e9e0608dc8768276e15c74536 languageName: node linkType: hard @@ -986,12 +979,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1": - version: 8.7.0 - resolution: "acorn@npm:8.7.0" +"acorn@npm:^8.4.1, acorn@npm:^8.5.0": + version: 8.7.1 + resolution: "acorn@npm:8.7.1" bin: acorn: bin/acorn - checksum: e0f79409d68923fbf1aa6d4166f3eedc47955320d25c89a20cc822e6ba7c48c5963d5bc657bc242d68f7a4ac9faf96eef033e8f73656da6c640d4219935fdfd0 + checksum: aca0aabf98826717920ac2583fdcad0a6fbe4e583fdb6e843af2594e907455aeafe30b1e14f1757cd83ce1776773cf8296ffc3a4acf13f0bd3dfebcf1db6ae80 languageName: node linkType: hard @@ -1004,14 +997,14 @@ __metadata: languageName: node linkType: hard -"agentkeepalive@npm:^4.1.3": - version: 4.2.0 - resolution: "agentkeepalive@npm:4.2.0" +"agentkeepalive@npm:^4.2.1": + version: 4.2.1 + resolution: "agentkeepalive@npm:4.2.1" dependencies: debug: ^4.1.0 depd: ^1.1.2 humanize-ms: ^1.2.1 - checksum: 89806f83ceebbcaabf6bd581a8dce4870910fd2a11f66df8f505b4cd4ce4ca5ab9e6eec8d11ce8531a6b60f6748b75b0775e0e2fa33871503ef00d535418a19a + checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 languageName: node linkType: hard @@ -1087,9 +1080,9 @@ __metadata: languageName: node linkType: hard -"app-builder-lib@npm:22.14.5": - version: 22.14.5 - resolution: "app-builder-lib@npm:22.14.5" +"app-builder-lib@npm:22.14.13": + version: 22.14.13 + resolution: "app-builder-lib@npm:22.14.13" dependencies: 7zip-bin: ~5.1.1 "@develar/schema-utils": ~2.6.5 @@ -1097,13 +1090,13 @@ __metadata: "@malept/flatpak-bundler": ^0.4.0 async-exit-hook: ^2.0.1 bluebird-lst: ^1.0.9 - builder-util: 22.14.5 - builder-util-runtime: 8.9.1 + builder-util: 22.14.13 + builder-util-runtime: 8.9.2 chromium-pickle-js: ^0.2.0 debug: ^4.3.2 ejs: ^3.1.6 electron-osx-sign: ^0.5.0 - electron-publish: 22.14.5 + electron-publish: 22.14.13 form-data: ^4.0.0 fs-extra: ^10.0.0 hosted-git-info: ^4.0.2 @@ -1116,7 +1109,7 @@ __metadata: sanitize-filename: ^1.6.3 semver: ^7.3.5 temp-file: ^3.4.0 - checksum: 50aaea3979970d59137e50d1a6da650801e5d4d6119a57a94355697fd90c4fc956b37758dbd6ba284aa2a829cf4c6c19a46514e4b0046cf9b644847866875714 + checksum: a32a5ef25b3f70ddcd9b6ba0691221b9e66b0b0a4e1c28e9dc90854d7dcd0183445af55132587458963202afe40b1860b705558b990622d9e5953931b0de2572 languageName: node linkType: hard @@ -1127,13 +1120,13 @@ __metadata: languageName: node linkType: hard -"are-we-there-yet@npm:^2.0.0": - version: 2.0.0 - resolution: "are-we-there-yet@npm:2.0.0" +"are-we-there-yet@npm:^3.0.0": + version: 3.0.0 + resolution: "are-we-there-yet@npm:3.0.0" dependencies: delegates: ^1.0.0 readable-stream: ^3.6.0 - checksum: 6c80b4fd04ecee6ba6e737e0b72a4b41bdc64b7d279edfc998678567ff583c8df27e27523bc789f2c99be603ffa9eaa612803da1d886962d2086e7ff6fa90c7c + checksum: 348edfdd931b0b50868b55402c01c3f64df1d4c229ab6f063539a5025fd6c5f5bb8a0cab409bbed8d75d34762d22aa91b7c20b4204eb8177063158d9ba792981 languageName: node linkType: hard @@ -1183,10 +1176,10 @@ __metadata: languageName: node linkType: hard -"async@npm:0.9.x": - version: 0.9.2 - resolution: "async@npm:0.9.2" - checksum: 87dbf129292b8a6c32a4e07f43f462498162aa86f404a7e11f978dbfdf75cfb163c26833684bb07b9d436083cd604cbbf730a57bfcbe436c6ae1ed266cdc56bb +"async@npm:^3.2.3": + version: 3.2.3 + resolution: "async@npm:3.2.3" + checksum: c4bee57ab2249af3dc83ca3ef9acfa8e822c0d5e5aa41bae3eaf7f673648343cd64ecd7d26091ffd357f3f044428b17b5f00098494b6cf8b6b3e9681f0636ca1 languageName: node linkType: hard @@ -1285,7 +1278,16 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.1": +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" dependencies: @@ -1295,17 +1297,17 @@ __metadata: linkType: hard "browserslist@npm:^4.14.5": - version: 4.19.1 - resolution: "browserslist@npm:4.19.1" + version: 4.20.3 + resolution: "browserslist@npm:4.20.3" dependencies: - caniuse-lite: ^1.0.30001286 - electron-to-chromium: ^1.4.17 + caniuse-lite: ^1.0.30001332 + electron-to-chromium: ^1.4.118 escalade: ^3.1.1 - node-releases: ^2.0.1 + node-releases: ^2.0.3 picocolors: ^1.0.0 bin: browserslist: cli.js - checksum: c0777fd483691638fd6801e16c9d809e1d65f6d2b06db2e806654be51045cbab1452a89841a2c5caea2cbe19d621b4f1d391cffbb24512aa33280039ab345875 + checksum: 1e4b719ac2ca0fe235218a606e8b8ef16b8809e0973b924158c39fbc435a0b0fe43437ea52dd6ef5ad2efcb83fcb07431244e472270177814217f7c563651f7d languageName: node linkType: hard @@ -1364,62 +1366,64 @@ __metadata: languageName: node linkType: hard -"builder-util-runtime@npm:8.9.1": - version: 8.9.1 - resolution: "builder-util-runtime@npm:8.9.1" +"builder-util-runtime@npm:8.9.2": + version: 8.9.2 + resolution: "builder-util-runtime@npm:8.9.2" dependencies: debug: ^4.3.2 sax: ^1.2.4 - checksum: c319a9bce54b08ac93ad34d5d6ac4c4d0400435f9bddee247a67f54e637a4fc1b262b9709c58fed861c7b05243f0c232b6a8c7c3b92863530d544e6e3c15e5ec + checksum: 35adcd6162e2ed16635ff7b7ecc353e400dcbbb3e7cd01823bfefc7256cefca8c820f62d15a0f7dbee1c7495a5f1fba4e0e238857a79b48d5f6bd35064f27208 languageName: node linkType: hard -"builder-util@npm:22.14.5": - version: 22.14.5 - resolution: "builder-util@npm:22.14.5" +"builder-util@npm:22.14.13": + version: 22.14.13 + resolution: "builder-util@npm:22.14.13" dependencies: 7zip-bin: ~5.1.1 "@types/debug": ^4.1.6 "@types/fs-extra": ^9.0.11 app-builder-bin: 3.7.1 bluebird-lst: ^1.0.9 - builder-util-runtime: 8.9.1 + builder-util-runtime: 8.9.2 chalk: ^4.1.1 cross-spawn: ^7.0.3 debug: ^4.3.2 fs-extra: ^10.0.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 is-ci: ^3.0.0 js-yaml: ^4.1.0 source-map-support: ^0.5.19 stat-mode: ^1.0.0 temp-file: ^3.4.0 - checksum: ead70484827ad8ccb67fc5be728759a8dee7bf14c120f4d4a8aa126b3850fa2de9301e00ec8310de2e918b8574650f2c261d7fc32a1b098378a99b08dfcbb738 + checksum: 6d72cc1f0bf7e72debe70049dede2a5eac302fb98b87eb7e60b7feed8631dc66877821367d5e7a87aea881f937a565c25e4e24042b421ef12c1d2afa8b7cc02d languageName: node linkType: hard -"cacache@npm:^15.2.0": - version: 15.3.0 - resolution: "cacache@npm:15.3.0" +"cacache@npm:^16.0.2": + version: 16.0.7 + resolution: "cacache@npm:16.0.7" dependencies: - "@npmcli/fs": ^1.0.0 - "@npmcli/move-file": ^1.0.1 + "@npmcli/fs": ^2.1.0 + "@npmcli/move-file": ^2.0.0 chownr: ^2.0.0 - fs-minipass: ^2.0.0 - glob: ^7.1.4 + fs-minipass: ^2.1.0 + glob: ^8.0.1 infer-owner: ^1.0.4 - lru-cache: ^6.0.0 - minipass: ^3.1.1 + lru-cache: ^7.7.1 + minipass: ^3.1.6 minipass-collect: ^1.0.2 minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.2 - mkdirp: ^1.0.3 + minipass-pipeline: ^1.2.4 + mkdirp: ^1.0.4 p-map: ^4.0.0 promise-inflight: ^1.0.1 rimraf: ^3.0.2 - ssri: ^8.0.1 - tar: ^6.0.2 + ssri: ^9.0.0 + tar: ^6.1.11 unique-filename: ^1.1.1 - checksum: a07327c27a4152c04eb0a831c63c00390d90f94d51bb80624a66f4e14a6b6360bbf02a84421267bd4d00ca73ac9773287d8d7169e8d2eafe378d2ce140579db8 + checksum: 2155b099b7e0f0369fb1155ca4673532ca7efe2ebdbec63acca8743580b8446b5d4fd7184626b1cb059001af77b981cdc67035c7855544d365d4f048eafca2ca languageName: node linkType: hard @@ -1462,14 +1466,14 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001286": - version: 1.0.30001299 - resolution: "caniuse-lite@npm:1.0.30001299" - checksum: c770f60ebf3e0cc8043ba4db0ebec12d7a595a6b50cb4437c3c5c55b04de9d2413f711f2828be761e8c37bb46b927a8abe6b199b8f0ffc1a34af0ebdee84be27 +"caniuse-lite@npm:^1.0.30001332": + version: 1.0.30001334 + resolution: "caniuse-lite@npm:1.0.30001334" + checksum: 1a1c783942d53ca37dc3dbdd7c4a6f7994996d0bfd178d4f4cdd714c6b09d9d9f48a3a2452e009e8203aba4b7a2da43f3d9d88060668a46fc237dbe0d39358a3 languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.4.2": +"chalk@npm:^2.0.0": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -1480,7 +1484,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.1.0, chalk@npm:^4.1.1": +"chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -1526,11 +1530,11 @@ __metadata: linkType: hard "clean-css@npm:^5.2.2": - version: 5.2.2 - resolution: "clean-css@npm:5.2.2" + version: 5.3.0 + resolution: "clean-css@npm:5.3.0" dependencies: source-map: ~0.6.0 - checksum: 10855820829b8b6ea94e462313fdc177b297aca5c7870a969591549d6a766824f912b5e58773bd345b2a7effae863ab492258b5a77a40029fba6d11d861cbee3 + checksum: 29e15ef4678e1eb571546128cb7a922c5301c1bd12ee30a6e8141c72789b8130739a9a5b335435a6ee108400336a561ebd9faabe1a7d8808eb48d39cff390cd7 languageName: node linkType: hard @@ -1628,7 +1632,7 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.2": +"color-support@npm:^1.1.3": version: 1.1.3 resolution: "color-support@npm:1.1.3" bin: @@ -1756,7 +1760,7 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": +"console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed @@ -1827,8 +1831,8 @@ __metadata: linkType: hard "css-loader@npm:^6.7.0": - version: 6.7.0 - resolution: "css-loader@npm:6.7.0" + version: 6.7.1 + resolution: "css-loader@npm:6.7.1" dependencies: icss-utils: ^5.1.0 postcss: ^8.4.7 @@ -1840,27 +1844,27 @@ __metadata: semver: ^7.3.5 peerDependencies: webpack: ^5.0.0 - checksum: 222bbde35315f4cf723fb1dd3a7c5a21e073de2018e8a9475f89631a090f6fd829ef756972a0f15ed6298f6c852d0f45e46ee729625256397ee17638c0b4ae9d + checksum: 170fdbc630a05a43679ef60fa97694766b568dbde37adccc0faafa964fc675f08b976bc68837bb73b61d60240e8d2cbcbf51540fe94ebc9dafc56e7c46ba5527 languageName: node linkType: hard "css-select@npm:^4.1.3": - version: 4.2.1 - resolution: "css-select@npm:4.2.1" + version: 4.3.0 + resolution: "css-select@npm:4.3.0" dependencies: boolbase: ^1.0.0 - css-what: ^5.1.0 - domhandler: ^4.3.0 + css-what: ^6.0.1 + domhandler: ^4.3.1 domutils: ^2.8.0 nth-check: ^2.0.1 - checksum: 6617193ec7c332217204c4ea371d332c6845603fda415e36032e7e9e18206d7c368a14e3c57532082314d2689955b01122aa1097c1c52b6c1cab7ad90970d3c6 + checksum: d6202736839194dd7f910320032e7cfc40372f025e4bf21ca5bf6eb0a33264f322f50ba9c0adc35dadd342d3d6fae5ca244779a4873afbfa76561e343f2058e0 languageName: node linkType: hard -"css-what@npm:^5.1.0": - version: 5.1.0 - resolution: "css-what@npm:5.1.0" - checksum: 0b75d1bac95c885c168573c85744a6c6843d8c33345f54f717218b37ea6296b0e99bb12105930ea170fd4a921990392a7c790c16c585c1d8960c49e2b7ec39f7 +"css-what@npm:^6.0.1": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe languageName: node linkType: hard @@ -1873,29 +1877,22 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.10": +"csstype@npm:^3.0.11, csstype@npm:^3.0.2": version: 3.0.11 resolution: "csstype@npm:3.0.11" checksum: 95e56abfe9ca219ae065acb4e43f61771a03170eed919127f558dfa168240867aba7629c8d98a201a0dd06d9a5ce82686f0570031c928516c61816adbc7c877f languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.0.10 - resolution: "csstype@npm:3.0.10" - checksum: 20a8fa324f2b33ddf94aa7507d1b6ab3daa6f3cc308888dc50126585d7952f2471de69b2dbe0635d1fdc31223fef8e070842691877e725caf456e2378685a631 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2": - version: 4.3.3 - resolution: "debug@npm:4.3.3" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3": + version: 4.3.4 + resolution: "debug@npm:4.3.4" dependencies: ms: 2.1.2 peerDependenciesMeta: supports-color: optional: true - checksum: 14472d56fe4a94dbcfaa6dbed2dd3849f1d72ba78104a1a328047bb564643ca49df0224c3a17fa63533fd11dd3d4c8636cd861191232a2c6735af00cc2d4de16 + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 languageName: node linkType: hard @@ -1932,11 +1929,12 @@ __metadata: linkType: hard "define-properties@npm:^1.1.3": - version: 1.1.3 - resolution: "define-properties@npm:1.1.3" + version: 1.1.4 + resolution: "define-properties@npm:1.1.4" dependencies: - object-keys: ^1.0.12 - checksum: da80dba55d0cd76a5a7ab71ef6ea0ebcb7b941f803793e4e0257b384cb772038faa0c31659d244e82c4342edef841c1a1212580006a05a5068ee48223d787317 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b languageName: node linkType: hard @@ -1982,13 +1980,13 @@ __metadata: languageName: node linkType: hard -"dmg-builder@npm:22.14.5": - version: 22.14.5 - resolution: "dmg-builder@npm:22.14.5" +"dmg-builder@npm:22.14.13": + version: 22.14.13 + resolution: "dmg-builder@npm:22.14.13" dependencies: - app-builder-lib: 22.14.5 - builder-util: 22.14.5 - builder-util-runtime: 8.9.1 + app-builder-lib: 22.14.13 + builder-util: 22.14.13 + builder-util-runtime: 8.9.2 dmg-license: ^1.0.9 fs-extra: ^10.0.0 iconv-lite: ^0.6.2 @@ -1996,13 +1994,13 @@ __metadata: dependenciesMeta: dmg-license: optional: true - checksum: 8b707da83a59c800b45391c5e8097dc702c162a30e1a5a46b59a4f19b8080ec2901f99a789d76fd448fa859e746731de1136e8b297355673112a93fa2a367380 + checksum: 01be77f99b9309e356e3ae4fbccc294c4f1dcb65b9b21c434807cbaa9d0c22b2338a5b688bba1b277e0110ac33dd1eb126f4267d09382b1fa12d0878162ac648 languageName: node linkType: hard "dmg-license@npm:^1.0.9": - version: 1.0.10 - resolution: "dmg-license@npm:1.0.10" + version: 1.0.11 + resolution: "dmg-license@npm:1.0.11" dependencies: "@types/plist": ^3.0.1 "@types/verror": ^1.10.3 @@ -2038,29 +2036,29 @@ __metadata: linkType: hard "dom-serializer@npm:^1.0.1": - version: 1.3.2 - resolution: "dom-serializer@npm:1.3.2" + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" dependencies: domelementtype: ^2.0.1 domhandler: ^4.2.0 entities: ^2.0.0 - checksum: bff48714944d67b160db71ba244fb0f3fe72e77ef2ec8414e2eeb56f2d926e404a13456b8b83a5392e217ba47dec2ec0c368801b31481813e94d185276c3e964 + checksum: fbb0b01f87a8a2d18e6e5a388ad0f7ec4a5c05c06d219377da1abc7bb0f674d804f4a8a94e3f71ff15f6cb7dcfc75704a54b261db672b9b3ab03da6b758b0b22 languageName: node linkType: hard "domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": - version: 2.2.0 - resolution: "domelementtype@npm:2.2.0" - checksum: 24cb386198640cd58aa36f8c987f2ea61859929106d06ffcc8f547e70cb2ed82a6dc56dcb8252b21fba1f1ea07df6e4356d60bfe57f77114ca1aed6828362629 + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 languageName: node linkType: hard -"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.0": - version: 4.3.0 - resolution: "domhandler@npm:4.3.0" +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" dependencies: domelementtype: ^2.2.0 - checksum: d2a2dbf40dd99abf936b65ad83c6b530afdb3605a87cad37a11b5d9220e68423ebef1b86c89e0f6d93ffaf315cc327cf1a988652e7a9a95cce539e3984f4c64d + checksum: 4c665ceed016e1911bf7d1dadc09dc888090b64dee7851cccd2fcf5442747ec39c647bb1cb8c8919f8bbdd0f0c625a6bafeeed4b2d656bbecdbae893f43ffaaa languageName: node linkType: hard @@ -2116,26 +2114,26 @@ __metadata: linkType: hard "ejs@npm:^3.1.6": - version: 3.1.6 - resolution: "ejs@npm:3.1.6" + version: 3.1.7 + resolution: "ejs@npm:3.1.7" dependencies: - jake: ^10.6.1 + jake: ^10.8.5 bin: - ejs: ./bin/cli.js - checksum: 81a9cdea0b4ded3b5a4b212b7c17e20bb07468f08394e2d519708d367957a70aef3d282a6d5d38bf6ad313ba25802b9193d4227f29b084d2ee0f28d115141d48 + ejs: bin/cli.js + checksum: fe40764af39955ce8f8b116716fc8b911959946698edb49ecab85df597746c07aa65d5b74ead28a1e2ffa75b0f92d9bedd752f1c29437da6137b3518271e988c languageName: node linkType: hard "electron-builder@npm:^22.14.5": - version: 22.14.5 - resolution: "electron-builder@npm:22.14.5" + version: 22.14.13 + resolution: "electron-builder@npm:22.14.13" dependencies: "@types/yargs": ^17.0.1 - app-builder-lib: 22.14.5 - builder-util: 22.14.5 - builder-util-runtime: 8.9.1 + app-builder-lib: 22.14.13 + builder-util: 22.14.13 + builder-util-runtime: 8.9.2 chalk: ^4.1.1 - dmg-builder: 22.14.5 + dmg-builder: 22.14.13 fs-extra: ^10.0.0 is-ci: ^3.0.0 lazy-val: ^1.0.5 @@ -2145,7 +2143,7 @@ __metadata: bin: electron-builder: cli.js install-app-deps: install-app-deps.js - checksum: b33929c9676c34192012cd056cfb06950ee785adeb2c2f8f749e241bae9534c1c7461a4e8b594c764dbdc7cc381568d9812d936a2475684745e8cbb1300c4713 + checksum: 1c5179ca9c4db3886377f86b6aa00db703180358134fefbf4c32daa54ed2620c47bf5495d0e4ee12bd3694dd7d3553a6561f088d2e5ab571b9e9b2f07ff594f2 languageName: node linkType: hard @@ -2166,38 +2164,38 @@ __metadata: languageName: node linkType: hard -"electron-publish@npm:22.14.5": - version: 22.14.5 - resolution: "electron-publish@npm:22.14.5" +"electron-publish@npm:22.14.13": + version: 22.14.13 + resolution: "electron-publish@npm:22.14.13" dependencies: "@types/fs-extra": ^9.0.11 - builder-util: 22.14.5 - builder-util-runtime: 8.9.1 + builder-util: 22.14.13 + builder-util-runtime: 8.9.2 chalk: ^4.1.1 fs-extra: ^10.0.0 lazy-val: ^1.0.5 mime: ^2.5.2 - checksum: 8b7b47879d0f870eff4eb78085d24a9813e0b52783717299149d31d2d5cef77ff376604e536b0bea8c37acdf0ccc929fed3d78ad2837f4746d89e0d5484f5f33 + checksum: 66cf15ad52c9dea67d744eb9080c20d43792a734f4e524b8ffc676e8ce9541a2fe4b11a25e4bd3f48e670160e72edfc7eeb77767e843232f4454075ee91d2475 languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.17": - version: 1.4.43 - resolution: "electron-to-chromium@npm:1.4.43" - checksum: c096a42ec6af0c22736f7151d1386e6597b125ad9a6379a747e67d33d03b3b2923336dbe17edad0037299e7aa1daa0f3feb726d797375e652b6918c1a467b39a +"electron-to-chromium@npm:^1.4.118": + version: 1.4.127 + resolution: "electron-to-chromium@npm:1.4.127" + checksum: 960333a1da1b29b58ba0daab9e9c7527c2d54f4fc74a82c65a7556cb4ade1e8a1710e5ccd2c3bbf610a164800c6a13bad5c8212a0cf6f07091f1384f6e557939 languageName: node linkType: hard "electron@npm:^17.1.0": - version: 17.1.0 - resolution: "electron@npm:17.1.0" + version: 17.4.1 + resolution: "electron@npm:17.4.1" dependencies: "@electron/get": ^1.13.0 "@types/node": ^14.6.2 extract-zip: ^1.0.3 bin: electron: cli.js - checksum: 3ebb0cee801aedf5efde7982f582e7829cb4f922b9c337d475978a127f8f4deb65349ca23b8b8596f5925a2a72e13192320eb9f9645d4a5cfa34e24e9088377e + checksum: 7f70989d52620beaeb4f83a5608f68e9381714718950e1cf5e0581e8ec1325ba0d15227228c0a25a4e68c466a1338d74f05ca47edd8909df708a1bd17db93eec languageName: node linkType: hard @@ -2215,7 +2213,7 @@ __metadata: languageName: node linkType: hard -"encoding@npm:^0.1.12": +"encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" dependencies: @@ -2233,13 +2231,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.8.3": - version: 5.8.3 - resolution: "enhanced-resolve@npm:5.8.3" +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.9.2": + version: 5.9.3 + resolution: "enhanced-resolve@npm:5.9.3" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: d79fbe531106448b768bb0673fb623ec0202d7ee70373ab7d4f4745d5dfe0806f38c9db7e7da8c941288fe475ab3d538db3791fce522056eeea40ca398c9e287 + checksum: 64c2dbbdd608d1a4df93b6e60786c603a1faf3b2e66dfd051d62cf4cfaeeb5e800166183685587208d62e9f7afff3f78f3d5978e32cd80125ba0c83b59a79d78 languageName: node linkType: hard @@ -2433,11 +2431,11 @@ __metadata: linkType: hard "filelist@npm:^1.0.1": - version: 1.0.2 - resolution: "filelist@npm:1.0.2" + version: 1.0.3 + resolution: "filelist@npm:1.0.3" dependencies: - minimatch: ^3.0.4 - checksum: 4d6953cb6f76c5345a52fc50222949e244946f485462ab6bae977176fff64fe5200cc1f44db175c27fc887f91cead401504c22eefcdcc064012ee44759947561 + minimatch: ^5.0.1 + checksum: c78048691a31b91d54908ce2eac4731bf108613c7b2e4d1a05a6cbe6739bd067e4c1a3baa4f7d07b7143b8c374c0c0d59864b5c8d9168ec8e2a85f84fb7170ad languageName: node linkType: hard @@ -2479,13 +2477,13 @@ __metadata: linkType: hard "fs-extra@npm:^10.0.0": - version: 10.0.0 - resolution: "fs-extra@npm:10.0.0" + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" dependencies: graceful-fs: ^4.2.0 jsonfile: ^6.0.1 universalify: ^2.0.0 - checksum: 5285a3d8f34b917cf2b66af8c231a40c1623626e9d701a20051d3337be16c6d7cac94441c8b3732d47a92a2a027886ca93c69b6a4ae6aee3c89650d2a8880c0a + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 languageName: node linkType: hard @@ -2512,7 +2510,7 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^2.0.0": +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" dependencies: @@ -2535,20 +2533,19 @@ __metadata: languageName: node linkType: hard -"gauge@npm:^4.0.0": - version: 4.0.0 - resolution: "gauge@npm:4.0.0" +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" dependencies: - ansi-regex: ^5.0.1 aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.2 - console-control-strings: ^1.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 has-unicode: ^2.0.1 - signal-exit: ^3.0.0 + signal-exit: ^3.0.7 string-width: ^4.2.3 strip-ansi: ^6.0.1 - wide-align: ^1.1.2 - checksum: 637b34c84f518defa89319dbef68211a24e9302182ad2a619e3be1be5b7dcf2a962c8359e889294af667440f4722e7e6e61671859e00bd8ec280a136ded89b25 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d languageName: node linkType: hard @@ -2566,6 +2563,17 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.1.1": + version: 1.1.1 + resolution: "get-intrinsic@npm:1.1.1" + dependencies: + function-bind: ^1.1.1 + has: ^1.0.3 + has-symbols: ^1.0.1 + checksum: a9fe2ca8fa3f07f9b0d30fb202bcd01f3d9b9b6b732452e79c48e79f7d6d8d003af3f9e38514250e3553fdc83c61650851cb6870832ac89deaaceb08e3721a17 + languageName: node + linkType: hard + "get-stream@npm:^4.1.0": version: 4.1.0 resolution: "get-stream@npm:4.1.0" @@ -2621,6 +2629,20 @@ __metadata: languageName: node linkType: hard +"glob@npm:^8.0.1": + version: 8.0.1 + resolution: "glob@npm:8.0.1" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 7ac782f3ef1c08005884447479e68ceb0ad56997eb2003e1e9aefae71bad3cb48eb7c49190d3d6736f2ffcd8af4985d53a46831b3d5e0052cc5756822a38b61a + languageName: node + linkType: hard + "global-agent@npm:^3.0.0": version: 3.0.0 resolution: "global-agent@npm:3.0.0" @@ -2685,9 +2707,9 @@ __metadata: linkType: hard "graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": - version: 4.2.9 - resolution: "graceful-fs@npm:4.2.9" - checksum: 68ea4e07ff2c041ada184f9278b830375f8e0b75154e3f080af6b70f66172fabb4108d19b3863a96b53fc068a310b9b6493d86d1291acc5f3861eb4b79d26ad6 + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da languageName: node linkType: hard @@ -2712,6 +2734,22 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.1": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" @@ -2822,24 +2860,24 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^4.0.1": - version: 4.0.1 - resolution: "http-proxy-agent@npm:4.0.1" +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" dependencies: - "@tootallnate/once": 1 + "@tootallnate/once": 2 agent-base: 6 debug: 4 - checksum: c6a5da5a1929416b6bbdf77b1aca13888013fe7eb9d59fc292e25d18e041bb154a8dfada58e223fc7b76b9b2d155a87e92e608235201f77d34aa258707963a82 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 languageName: node linkType: hard "https-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "https-proxy-agent@npm:5.0.0" + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" dependencies: agent-base: 6 debug: 4 - checksum: 165bfb090bd26d47693597661298006841ab733d0c7383a8cb2f17373387a94c903a3ac687090aa739de05e379ab6f868bae84ab4eac288ad85c328cd1ec9e53 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 languageName: node linkType: hard @@ -3018,12 +3056,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.8.0, is-core-module@npm:^2.8.1": - version: 2.8.1 - resolution: "is-core-module@npm:2.8.1" +"is-core-module@npm:^2.8.1": + version: 2.9.0 + resolution: "is-core-module@npm:2.9.0" dependencies: has: ^1.0.3 - checksum: 418b7bc10768a73c41c7ef497e293719604007f88934a6ffc5f7c78702791b8528102fb4c9e56d006d69361549b3d9519440214a74aefc7e0b79e5e4411d377f + checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce languageName: node linkType: hard @@ -3126,9 +3164,9 @@ __metadata: linkType: hard "isbinaryfile@npm:^4.0.8": - version: 4.0.8 - resolution: "isbinaryfile@npm:4.0.8" - checksum: 606e3bb648d1a0dee23459d1d937bb2560e66a5281ec7c9ff50e585402d73321ac268d0f34cb7393125b3ebc4c7962d39e50a01cdb8904b52fce08b7ccd2bf9f + version: 4.0.10 + resolution: "isbinaryfile@npm:4.0.10" + checksum: a6b28db7e23ac7a77d3707567cac81356ea18bd602a4f21f424f862a31d0e7ab4f250759c98a559ece35ffe4d99f0d339f1ab884ffa9795172f632ab8f88e686 languageName: node linkType: hard @@ -3146,28 +3184,28 @@ __metadata: languageName: node linkType: hard -"jake@npm:^10.6.1": - version: 10.8.2 - resolution: "jake@npm:10.8.2" +"jake@npm:^10.8.5": + version: 10.8.5 + resolution: "jake@npm:10.8.5" dependencies: - async: 0.9.x - chalk: ^2.4.2 + async: ^3.2.3 + chalk: ^4.0.2 filelist: ^1.0.1 minimatch: ^3.0.4 bin: jake: ./bin/cli.js - checksum: b604c51863260e374ccd62cd0cfe0b659f72cb71beb7d5fb5137dd65b04cf9d5603abd01f9f6eaaac8f4182f396d6cfae01e0b0844c2215c9c1e200572307cf9 + checksum: 56c913ecf5a8d74325d0af9bc17a233bad50977438d44864d925bb6c45c946e0fee8c4c1f5fe2225471ef40df5222e943047982717ebff0d624770564d3c46ba languageName: node linkType: hard -"jest-worker@npm:^27.4.1": - version: 27.4.6 - resolution: "jest-worker@npm:27.4.6" +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" dependencies: "@types/node": "*" merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 105bcdf5c66700bbfe352bc09476629ca0858cfa819fcc1a37ea76660f0168d586c6e77aee8ea91eded5a20f40f331a0a81e503b5ba19f7b566204406b239466 + checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 languageName: node linkType: hard @@ -3225,13 +3263,11 @@ __metadata: linkType: hard "json5@npm:^2.2.0": - version: 2.2.0 - resolution: "json5@npm:2.2.0" - dependencies: - minimist: ^1.2.5 + version: 2.2.1 + resolution: "json5@npm:2.2.1" bin: json5: lib/cli.js - checksum: e88fc5274bb58fc99547baa777886b069d2dd96d9cfc4490b305fd16d711dabd5979e35a4f90873cefbeb552e216b041a304fe56702bedba76e19bc7845f208d + checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b languageName: node linkType: hard @@ -3300,9 +3336,9 @@ __metadata: linkType: hard "loader-runner@npm:^4.2.0": - version: 4.2.0 - resolution: "loader-runner@npm:4.2.0" - checksum: e61aea8b6904b8af53d9de6f0484da86c462c0001f4511bedc837cec63deb9475cea813db62f702cd7930420ccb0e75c78112270ca5c8b61b374294f53c0cb3a + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 languageName: node linkType: hard @@ -3315,6 +3351,13 @@ __metadata: languageName: node linkType: hard +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c + languageName: node + linkType: hard + "lodash@npm:^4.17.10, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -3365,6 +3408,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^7.7.1": + version: 7.9.0 + resolution: "lru-cache@npm:7.9.0" + checksum: c91a293a103d11ea4f07de4122ba4f73d8203d0de51852fb612b1764296aebf623a3e11dddef1b3aefdc8d71af97d52b222dad5459dcb967713bbab9a19fed7d + languageName: node + linkType: hard + "make-dir@npm:^3.0.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -3374,27 +3424,27 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^9.1.0": - version: 9.1.0 - resolution: "make-fetch-happen@npm:9.1.0" +"make-fetch-happen@npm:^10.0.3": + version: 10.1.2 + resolution: "make-fetch-happen@npm:10.1.2" dependencies: - agentkeepalive: ^4.1.3 - cacache: ^15.2.0 + agentkeepalive: ^4.2.1 + cacache: ^16.0.2 http-cache-semantics: ^4.1.0 - http-proxy-agent: ^4.0.1 + http-proxy-agent: ^5.0.0 https-proxy-agent: ^5.0.0 is-lambda: ^1.0.1 - lru-cache: ^6.0.0 - minipass: ^3.1.3 + lru-cache: ^7.7.1 + minipass: ^3.1.6 minipass-collect: ^1.0.2 - minipass-fetch: ^1.3.2 + minipass-fetch: ^2.0.3 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 - negotiator: ^0.6.2 + negotiator: ^0.6.3 promise-retry: ^2.0.1 - socks-proxy-agent: ^6.0.0 - ssri: ^8.0.0 - checksum: 0eb371c85fdd0b1584fcfdf3dc3c62395761b3c14658be02620c310305a9a7ecf1617a5e6fb30c1d081c5c8aaf177fa133ee225024313afabb7aa6a10f1e3d04 + socks-proxy-agent: ^6.1.1 + ssri: ^9.0.0 + checksum: 42825d119a7e4f5b1a8e7048a86d328cd36bb1ff875d155ce7079d9a0afdd310c198fb310096af358cfa9ecdf643cecf960380686792457dccb36e17efe89eb0 languageName: node linkType: hard @@ -3415,28 +3465,28 @@ __metadata: linkType: hard "micromatch@npm:^4.0.0": - version: 4.0.4 - resolution: "micromatch@npm:4.0.4" + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" dependencies: - braces: ^3.0.1 - picomatch: ^2.2.3 - checksum: ef3d1c88e79e0a68b0e94a03137676f3324ac18a908c245a9e5936f838079fcc108ac7170a5fadc265a9c2596963462e402841406bda1a4bb7b68805601d631c + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc languageName: node linkType: hard -"mime-db@npm:1.51.0": - version: 1.51.0 - resolution: "mime-db@npm:1.51.0" - checksum: 613b1ac9d6e725cc24444600b124a7f1ce6c60b1baa654f39a3e260d0995a6dffc5693190217e271af7e2a5612dae19f2a73f3e316707d797a7391165f7ef423 +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f languageName: node linkType: hard "mime-types@npm:^2.1.12, mime-types@npm:^2.1.27": - version: 2.1.34 - resolution: "mime-types@npm:2.1.34" + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" dependencies: - mime-db: 1.51.0 - checksum: 67013de9e9d6799bde6d669d18785b7e18bcd212e710d3e04a4727f92f67a8ad4e74aee24be28b685adb794944814bde649119b58ee3282ffdbee58f9278d9f3 + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 languageName: node linkType: hard @@ -3463,7 +3513,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.0.4, minimatch@npm:^3.0.4": +"minimatch@npm:3.0.4": version: 3.0.4 resolution: "minimatch@npm:3.0.4" dependencies: @@ -3472,10 +3522,28 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5": - version: 1.2.5 - resolution: "minimist@npm:1.2.5" - checksum: 86706ce5b36c16bfc35c5fe3dbb01d5acdc9a22f2b6cc810b6680656a1d2c0e44a0159c9a3ba51fb072bb5c203e49e10b51dcd0eec39c481f4c42086719bae52 +"minimatch@npm:^3.0.4": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.0.1 + resolution: "minimatch@npm:5.0.1" + dependencies: + brace-expansion: ^2.0.1 + checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": + version: 1.2.6 + resolution: "minimist@npm:1.2.6" + checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb languageName: node linkType: hard @@ -3488,18 +3556,18 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^1.3.2": - version: 1.4.1 - resolution: "minipass-fetch@npm:1.4.1" +"minipass-fetch@npm:^2.0.3": + version: 2.1.0 + resolution: "minipass-fetch@npm:2.1.0" dependencies: - encoding: ^0.1.12 - minipass: ^3.1.0 + encoding: ^0.1.13 + minipass: ^3.1.6 minipass-sized: ^1.0.3 - minizlib: ^2.0.0 + minizlib: ^2.1.2 dependenciesMeta: encoding: optional: true - checksum: ec93697bdb62129c4e6c0104138e681e30efef8c15d9429dd172f776f83898471bc76521b539ff913248cc2aa6d2b37b652c993504a51cc53282563640f29216 + checksum: 1334732859a3f7959ed22589bafd9c40384b885aebb5932328071c33f86b3eb181d54c86919675d1825ab5f1c8e4f328878c863873258d113c29d79a4b0c9c9f languageName: node linkType: hard @@ -3512,7 +3580,7 @@ __metadata: languageName: node linkType: hard -"minipass-pipeline@npm:^1.2.2, minipass-pipeline@npm:^1.2.4": +"minipass-pipeline@npm:^1.2.4": version: 1.2.4 resolution: "minipass-pipeline@npm:1.2.4" dependencies: @@ -3530,7 +3598,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^3.0.0, minipass@npm:^3.1.0, minipass@npm:^3.1.1, minipass@npm:^3.1.3": +"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": version: 3.1.6 resolution: "minipass@npm:3.1.6" dependencies: @@ -3539,7 +3607,7 @@ __metadata: languageName: node linkType: hard -"minizlib@npm:^2.0.0, minizlib@npm:^2.1.1": +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": version: 2.1.2 resolution: "minizlib@npm:2.1.2" dependencies: @@ -3550,13 +3618,13 @@ __metadata: linkType: hard "mkdirp@npm:^0.5.4": - version: 0.5.5 - resolution: "mkdirp@npm:0.5.5" + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" dependencies: - minimist: ^1.2.5 + minimist: ^1.2.6 bin: mkdirp: bin/cmd.js - checksum: 3bce20ea525f9477befe458ab85284b0b66c8dc3812f94155af07c827175948cdd8114852ac6c6d82009b13c1048c37f6d98743eb019651ee25c39acc8aabe7d + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 languageName: node linkType: hard @@ -3591,18 +3659,18 @@ __metadata: linkType: hard "nanoid@npm:^3.3.1": - version: 3.3.1 - resolution: "nanoid@npm:3.3.1" + version: 3.3.3 + resolution: "nanoid@npm:3.3.3" bin: nanoid: bin/nanoid.cjs - checksum: 4ef0969e1bbe866fc223eb32276cbccb0961900bfe79104fa5abe34361979dead8d0e061410a5c03bc3d47455685adf32c09d6f27790f4a6898fb51f7df7ec86 + checksum: ada019402a07464a694553c61d2dca8a4353645a7d92f2830f0d487fedff403678a0bee5323a46522752b2eab95a0bc3da98b6cccaa7c0c55cd9975130e6d6f0 languageName: node linkType: hard -"negotiator@npm:^0.6.2": - version: 0.6.2 - resolution: "negotiator@npm:0.6.2" - checksum: dfddaff6c06792f1c4c3809e29a427b8daef8cd437c83b08dd51d7ee11bbd1c29d9512d66b801144d6c98e910ffd8723f2432e0cbf8b18d41d2a09599c975ab3 +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 languageName: node linkType: hard @@ -3633,13 +3701,13 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 8.4.1 - resolution: "node-gyp@npm:8.4.1" + version: 9.0.0 + resolution: "node-gyp@npm:9.0.0" dependencies: env-paths: ^2.2.0 glob: ^7.1.4 graceful-fs: ^4.2.6 - make-fetch-happen: ^9.1.0 + make-fetch-happen: ^10.0.3 nopt: ^5.0.0 npmlog: ^6.0.0 rimraf: ^3.0.2 @@ -3648,14 +3716,14 @@ __metadata: which: ^2.0.2 bin: node-gyp: bin/node-gyp.js - checksum: 341710b5da39d3660e6a886b37e210d33f8282047405c2e62c277bcc744c7552c5b8b972ebc3a7d5c2813794e60cc48c3ebd142c46d6e0321db4db6c92dd0355 + checksum: 4d8ef8860f7e4f4d86c91db3f519d26ed5cc23b48fe54543e2afd86162b4acbd14f21de42a5db344525efb69a991e021b96a68c70c6e2d5f4a5cb770793da6d3 languageName: node linkType: hard -"node-releases@npm:^2.0.1": - version: 2.0.1 - resolution: "node-releases@npm:2.0.1" - checksum: b20dd8d4bced11f75060f0387e05e76b9dc4a0451f7bb3516eade6f50499ea7768ba95d8a60d520c193402df1e58cb3fe301510cc1c1ad68949c3d57b5149866 +"node-releases@npm:^2.0.3": + version: 2.0.4 + resolution: "node-releases@npm:2.0.4" + checksum: b32d6c2032c7b169ae3938b416fc50f123f5bd577d54a79b2ae201febf27b22846b01c803dd35ac8689afe840f8ba4e5f7154723db629b80f359836b6707b92f languageName: node linkType: hard @@ -3697,14 +3765,14 @@ __metadata: linkType: hard "npmlog@npm:^6.0.0": - version: 6.0.0 - resolution: "npmlog@npm:6.0.0" + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" dependencies: - are-we-there-yet: ^2.0.0 + are-we-there-yet: ^3.0.0 console-control-strings: ^1.1.0 - gauge: ^4.0.0 + gauge: ^4.0.3 set-blocking: ^2.0.0 - checksum: 33d8a7fe3d63bf83b16655b6588ae7ba10b5f37b067a661e7cab6508660d7c3204ae716ee2c5ce4eb9626fd1489cf2fa7645d789bc3b704f8c3ccb04a532a50b + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a languageName: node linkType: hard @@ -3724,7 +3792,7 @@ __metadata: languageName: node linkType: hard -"object-keys@npm:^1.0.12": +"object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a @@ -3892,7 +3960,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.2.3": +"picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf @@ -3916,12 +3984,12 @@ __metadata: linkType: hard "plist@npm:^3.0.1, plist@npm:^3.0.4": - version: 3.0.4 - resolution: "plist@npm:3.0.4" + version: 3.0.5 + resolution: "plist@npm:3.0.5" dependencies: base64-js: ^1.5.1 xmlbuilder: ^9.0.7 - checksum: cb5883ed1b1aa227ddc5f99003750d312a8ac5cfd6f58d3ce0b24939255b175b54f25ebc6adcbd4266105ffd54f6831acb6cb06f529652bb3344215c10f5601b + checksum: f8b82816f66559965a4dabf139bd8dd95cdec7e51f32742bb353af276ea8228b9807113743b860eda3e867f6ed70d2bcbc1e135b3204d92b5c37ac765f68444e languageName: node linkType: hard @@ -3970,12 +4038,12 @@ __metadata: linkType: hard "postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.0.9 - resolution: "postcss-selector-parser@npm:6.0.9" + version: 6.0.10 + resolution: "postcss-selector-parser@npm:6.0.10" dependencies: cssesc: ^3.0.0 util-deprecate: ^1.0.2 - checksum: f8161ab4d3e5c76b8467189c6d164ba0f6b6e74677435f29e34caa1df01e052b582b4ae4f7468b2243c4befdd8bdcdb7685542d1b2fca8deae21b3e849c78802 + checksum: 46afaa60e3d1998bd7adf6caa374baf857cc58d3ff944e29459c9a9e4680a7fe41597bd5b755fc81d7c388357e9bf67c0251d047c640a09f148e13606b8a8608 languageName: node linkType: hard @@ -3987,13 +4055,13 @@ __metadata: linkType: hard "postcss@npm:^8.4.7": - version: 8.4.7 - resolution: "postcss@npm:8.4.7" + version: 8.4.12 + resolution: "postcss@npm:8.4.12" dependencies: nanoid: ^3.3.1 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: a515ed36622edbee1d3ba153298d3b62ae9826dfa6de19204c2a6f975c8d3ad36808423b5119a9d82b78efd486de3ce35a1faf882a36ac8aa09492be4fbb7fe1 + checksum: 248e3d0f9bbb8efaafcfda7f91627a29bdc9a19f456896886330beb28c5abea0e14c7901b35191928602e2eccbed496b1e94097d27a0b2a980854cd00c7a835f languageName: node linkType: hard @@ -4140,26 +4208,26 @@ __metadata: linkType: hard "react-router-dom@npm:^6.2.2": - version: 6.2.2 - resolution: "react-router-dom@npm:6.2.2" + version: 6.3.0 + resolution: "react-router-dom@npm:6.3.0" dependencies: history: ^5.2.0 - react-router: 6.2.2 + react-router: 6.3.0 peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 83c5105af923c4f8af65a6de98283a95f46ffa643fd0c1a5005647c2c3deb946dae52dda32dc00cfcc3659517b08be806ff02ff03173361dba3d824850053e99 + checksum: 77603a654f8a8dc7f65535a2e5917a65f8d9ffcb06546d28dd297e52adcc4b8a84377e0115f48dca330b080af2da3e78f29d590c89307094d36927d2b1751ec3 languageName: node linkType: hard -"react-router@npm:6.2.2": - version: 6.2.2 - resolution: "react-router@npm:6.2.2" +"react-router@npm:6.3.0": + version: 6.3.0 + resolution: "react-router@npm:6.3.0" dependencies: history: ^5.2.0 peerDependencies: react: ">=16.8" - checksum: 1a2e7006d4d56bfae8ff11dd5ec15e8049578864dfb2764652510eb0ce4af26a8949790a3732c4f7beb14bcb6500469ea18841b8cfc953e09828e4e4113922f0 + checksum: 7be673f5e72104be01e6ab274516bdb932efd93305243170690f6560e3bd1035dd1df3d3c9ce1e0f452638a2529f43a1e77dcf0934fc8031c4783da657be13ca languageName: node linkType: hard @@ -4311,7 +4379,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.12.0": +"resolve@npm:^1.12.0, resolve@npm:^1.9.0": version: 1.22.0 resolution: "resolve@npm:1.22.0" dependencies: @@ -4324,20 +4392,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.9.0": - version: 1.21.0 - resolution: "resolve@npm:1.21.0" - dependencies: - is-core-module: ^2.8.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: d7d9092a5c04a048bea16c7e5a2eb605ac3e8363a0cc5644de1fde17d5028e8d5f4343aab1d99bd327b98e91a66ea83e242718150c64dfedcb96e5e7aad6c4f5 - languageName: node - linkType: hard - -"resolve@patch:resolve@^1.12.0#~builtin": +"resolve@patch:resolve@^1.12.0#~builtin, resolve@patch:resolve@^1.9.0#~builtin": version: 1.22.0 resolution: "resolve@patch:resolve@npm%3A1.22.0#~builtin::version=1.22.0&hash=07638b" dependencies: @@ -4350,19 +4405,6 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.9.0#~builtin": - version: 1.21.0 - resolution: "resolve@patch:resolve@npm%3A1.21.0#~builtin::version=1.21.0&hash=07638b" - dependencies: - is-core-module: ^2.8.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: a0a4d1f7409e73190f31f901f8a619960bb3bd4ae38ba3a54c7ea7e1c87758d28a73256bb8d6a35996a903d1bf14f53883f0dcac6c571c063cb8162d813ad26e - languageName: node - linkType: hard - "responselike@npm:^1.0.2": version: 1.0.2 resolution: "responselike@npm:1.0.2" @@ -4404,20 +4446,20 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": +"safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c languageName: node linkType: hard +"safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -4488,13 +4530,13 @@ __metadata: linkType: hard "semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5": - version: 7.3.5 - resolution: "semver@npm:7.3.5" + version: 7.3.7 + resolution: "semver@npm:7.3.7" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: 5eafe6102bea2a7439897c1856362e31cc348ccf96efd455c8b5bc2c61e6f7e7b8250dc26b8828c1d76a56f818a7ee907a36ae9fb37a599d3d24609207001d60 + checksum: 2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232 languageName: node linkType: hard @@ -4555,10 +4597,10 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": - version: 3.0.6 - resolution: "signal-exit@npm:3.0.6" - checksum: b819ac81ba757af559dad0804233ae31bf6f054591cd8a671e9cbcf09f21c72ec3076fe87d1e04861f5b33b47d63f0694b568de99c99cd733ee2060515beb6d5 +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 languageName: node linkType: hard @@ -4573,31 +4615,31 @@ __metadata: languageName: node linkType: hard -"smart-buffer@npm:^4.0.2, smart-buffer@npm:^4.1.0": +"smart-buffer@npm:^4.0.2, smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b languageName: node linkType: hard -"socks-proxy-agent@npm:^6.0.0": - version: 6.1.1 - resolution: "socks-proxy-agent@npm:6.1.1" +"socks-proxy-agent@npm:^6.1.1": + version: 6.2.0 + resolution: "socks-proxy-agent@npm:6.2.0" dependencies: agent-base: ^6.0.2 - debug: ^4.3.1 - socks: ^2.6.1 - checksum: 9a8a4f791bba0060315cf7291ca6f9db37d6fc280fd0860d73d8887d3efe4c22e823aa25a8d5375f6079279f8dc91b50c075345179bf832bfe3c7c26d3582e3c + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 6723fd64fb50334e2b340fd0a80fd8488ffc5bc43d85b7cf1d25612044f814dd7d6ea417fd47602159941236f7f4bd15669fa5d7e1f852598a31288e1a43967b languageName: node linkType: hard -"socks@npm:^2.6.1": - version: 2.6.1 - resolution: "socks@npm:2.6.1" +"socks@npm:^2.6.2": + version: 2.6.2 + resolution: "socks@npm:2.6.2" dependencies: ip: ^1.1.5 - smart-buffer: ^4.1.0 - checksum: 2ca9d616e424f645838ebaabb04f85d94ea999e0f8393dc07f86c435af22ed88cb83958feeabd1bb7bc537c635ed47454255635502c6808a6df61af1f41af750 + smart-buffer: ^4.2.0 + checksum: dd9194293059d737759d5c69273850ad4149f448426249325c4bea0e340d1cf3d266c3b022694b0dcf5d31f759de23657244c481fc1e8322add80b7985c36b5e languageName: node linkType: hard @@ -4632,10 +4674,12 @@ __metadata: languageName: node linkType: hard -"source-map@npm:~0.7.2": - version: 0.7.3 - resolution: "source-map@npm:0.7.3" - checksum: cd24efb3b8fa69b64bf28e3c1b1a500de77e84260c5b7f2b873f88284df17974157cc88d386ee9b6d081f08fdd8242f3fc05c953685a6ad81aad94c7393dedea +"source-map@npm:~0.8.0-beta.0": + version: 0.8.0-beta.0 + resolution: "source-map@npm:0.8.0-beta.0" + dependencies: + whatwg-url: ^7.0.0 + checksum: e94169be6461ab0ac0913313ad1719a14c60d402bd22b0ad96f4a6cffd79130d91ab5df0a5336a326b04d2df131c1409f563c9dc0d21a6ca6239a44b6c8dbd92 languageName: node linkType: hard @@ -4646,12 +4690,12 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^8.0.0, ssri@npm:^8.0.1": - version: 8.0.1 - resolution: "ssri@npm:8.0.1" +"ssri@npm:^9.0.0": + version: 9.0.0 + resolution: "ssri@npm:9.0.0" dependencies: minipass: ^3.1.1 - checksum: bc447f5af814fa9713aa201ec2522208ae0f4d8f3bda7a1f445a797c7b929a02720436ff7c478fb5edc4045adb02b1b88d2341b436a80798734e2494f1067b36 + checksum: bf33174232d07cc64e77ab1c51b55d28352273380c503d35642a19627e88a2c5f160039bb0a28608a353485075dda084dbf0390c7070f9f284559eb71d01b84b languageName: node linkType: hard @@ -4787,7 +4831,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.0.2, tar@npm:^6.1.2": +"tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.11 resolution: "tar@npm:6.1.11" dependencies: @@ -4812,10 +4856,10 @@ __metadata: linkType: hard "terser-webpack-plugin@npm:^5.1.3": - version: 5.3.0 - resolution: "terser-webpack-plugin@npm:5.3.0" + version: 5.3.1 + resolution: "terser-webpack-plugin@npm:5.3.1" dependencies: - jest-worker: ^27.4.1 + jest-worker: ^27.4.5 schema-utils: ^3.1.1 serialize-javascript: ^6.0.0 source-map: ^0.6.1 @@ -4829,25 +4873,21 @@ __metadata: optional: true uglify-js: optional: true - checksum: f6735b8bb2604e8ca8b78d21f610fb2488866db72bb38e8d7c32aab97ea81fa0a19cabed074a431ff3dd9510d6efd505fc6930cdd8c1d3faa71c1bf7da4c7469 + checksum: 1b808fd4f58ce0b532baacc50b9a850fc69ce0077a0e9e5076d4156c52fab3d40b02d5d9148a3eba64630cf7f40057de54f6a5a87fac1849b1f11d6bfdb42072 languageName: node linkType: hard "terser@npm:^5.10.0, terser@npm:^5.7.2": - version: 5.10.0 - resolution: "terser@npm:5.10.0" + version: 5.13.1 + resolution: "terser@npm:5.13.1" dependencies: + acorn: ^8.5.0 commander: ^2.20.0 - source-map: ~0.7.2 + source-map: ~0.8.0-beta.0 source-map-support: ~0.5.20 - peerDependencies: - acorn: ^8.5.0 - peerDependenciesMeta: - acorn: - optional: true bin: terser: bin/terser - checksum: 1080faeb6d5cd155bb39d9cc41d20a590eafc9869560d5285f255f6858604dcd135311e344188a106f87fedb12d096ad3799cfc2e65acd470b85d468b1c7bd4c + checksum: 0b1f5043cf5c3973005fe2ae4ff3be82511c336a6430599dacd4e2acf77c974d4474b0f1eec4823977c1f33823147e736ff712ca8e098bee3db25946480fa29d languageName: node linkType: hard @@ -4892,6 +4932,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^1.0.1": + version: 1.0.1 + resolution: "tr46@npm:1.0.1" + dependencies: + punycode: ^2.1.0 + checksum: 96d4ed46bc161db75dbf9247a236ea0bfcaf5758baae6749e92afab0bc5a09cb59af21788ede7e55080f2bf02dce3e4a8f2a484cc45164e29f4b5e68f7cbcc1a + languageName: node + linkType: hard + "truncate-utf8-bytes@npm:^1.0.0": version: 1.0.2 resolution: "truncate-utf8-bytes@npm:1.0.2" @@ -4902,8 +4951,8 @@ __metadata: linkType: hard "ts-loader@npm:^9.2.3": - version: 9.2.6 - resolution: "ts-loader@npm:9.2.6" + version: 9.2.9 + resolution: "ts-loader@npm:9.2.9" dependencies: chalk: ^4.1.0 enhanced-resolve: ^5.0.0 @@ -4912,14 +4961,14 @@ __metadata: peerDependencies: typescript: "*" webpack: ^5.0.0 - checksum: 309d8fb6348c0c3a7166d42c1238c585ede00f816155b24217dbca489406a72409395d7954bc5801ddb9ca71c71e7e0b2375dbc342337e0ab1a461944598a7fe + checksum: de817d4b7073bb029ca3e0742b5ef9432fdebb9f80707249b2121c09bb6ae6332ec755ab8e572f475ebfe5525a380a78b4e78a32b4d1c207a8fb1a2a0a490bac languageName: node linkType: hard "tslib@npm:^2.0.3": - version: 2.3.1 - resolution: "tslib@npm:2.3.1" - checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9 + version: 2.4.0 + resolution: "tslib@npm:2.4.0" + checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 languageName: node linkType: hard @@ -4961,22 +5010,22 @@ __metadata: linkType: hard "typescript@npm:^4.3.5": - version: 4.5.4 - resolution: "typescript@npm:4.5.4" + version: 4.6.4 + resolution: "typescript@npm:4.6.4" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 59f3243f9cd6fe3161e6150ff6bf795fc843b4234a655dbd938a310515e0d61afd1ac942799e7415e4334255e41c2c49b7dd5d9fd38a17acd25a6779ca7e0961 + checksum: e7bfcc39cd4571a63a54e5ea21f16b8445268b9900bf55aee0e02ad981be576acc140eba24f1af5e3c1457767c96cea6d12861768fb386cf3ffb34013718631a languageName: node linkType: hard "typescript@patch:typescript@^4.3.5#~builtin": - version: 4.5.4 - resolution: "typescript@patch:typescript@npm%3A4.5.4#~builtin::version=4.5.4&hash=493e53" + version: 4.6.4 + resolution: "typescript@patch:typescript@npm%3A4.6.4#~builtin::version=4.6.4&hash=493e53" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 2e488dde7d2c4a2fa2e79cf2470600f8ce81bc0563c276b72df8ff412d74456ae532ba824650ae936ce207440c79720ddcfaa25e3cb4477572b8534fa4e34d49 + checksum: 8cff08bf66d9ecfbf9fcc5edde04a5a7923e6cac3b21d99b4e9a06973bf5bd7f9a83ec7eed24129c1b9e13fd861de8c1070110d4b9ce9f18ab57c6999e9c9a6f languageName: node linkType: hard @@ -5136,14 +5185,21 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^4.0.2": + version: 4.0.2 + resolution: "webidl-conversions@npm:4.0.2" + checksum: c93d8dfe908a0140a4ae9c0ebc87a33805b416a33ee638a605b551523eec94a9632165e54632f6d57a39c5f948c4bab10e0e066525e9a4b87a79f0d04fbca374 + languageName: node + linkType: hard + "webpack-cli@npm:^4.9.1": - version: 4.9.1 - resolution: "webpack-cli@npm:4.9.1" + version: 4.9.2 + resolution: "webpack-cli@npm:4.9.2" dependencies: "@discoveryjs/json-ext": ^0.5.0 - "@webpack-cli/configtest": ^1.1.0 - "@webpack-cli/info": ^1.4.0 - "@webpack-cli/serve": ^1.6.0 + "@webpack-cli/configtest": ^1.1.1 + "@webpack-cli/info": ^1.4.1 + "@webpack-cli/serve": ^1.6.1 colorette: ^2.0.14 commander: ^7.0.0 execa: ^5.0.0 @@ -5165,7 +5221,7 @@ __metadata: optional: true bin: webpack-cli: bin/cli.js - checksum: 2aff0349c15e54d616e1fd6dc1f59be16ec1a630f652f948c0b4b108776d1889446e3498e83d9d514bf1b28c5125a8b87c4aeb5dceb41b593ba90765af673c4f + checksum: ffb4c5d53ab65ce9f1e8efd34fca4cb858ec6afc91ece0d9375094edff2e7615708c8a586991057fd9cc8d37aab0eb0511913b178daac534e51bcf7d3583e61c languageName: node linkType: hard @@ -5179,7 +5235,7 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^3.2.2": +"webpack-sources@npm:^3.2.3": version: 3.2.3 resolution: "webpack-sources@npm:3.2.3" checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 @@ -5187,11 +5243,11 @@ __metadata: linkType: hard "webpack@npm:^5.64.3": - version: 5.66.0 - resolution: "webpack@npm:5.66.0" + version: 5.72.0 + resolution: "webpack@npm:5.72.0" dependencies: - "@types/eslint-scope": ^3.7.0 - "@types/estree": ^0.0.50 + "@types/eslint-scope": ^3.7.3 + "@types/estree": ^0.0.51 "@webassemblyjs/ast": 1.11.1 "@webassemblyjs/wasm-edit": 1.11.1 "@webassemblyjs/wasm-parser": 1.11.1 @@ -5199,7 +5255,7 @@ __metadata: acorn-import-assertions: ^1.7.6 browserslist: ^4.14.5 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.8.3 + enhanced-resolve: ^5.9.2 es-module-lexer: ^0.9.0 eslint-scope: 5.1.1 events: ^3.2.0 @@ -5213,13 +5269,24 @@ __metadata: tapable: ^2.1.1 terser-webpack-plugin: ^5.1.3 watchpack: ^2.3.1 - webpack-sources: ^3.2.2 + webpack-sources: ^3.2.3 peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 5a44664a840fd64c5383aa78847b205ae0b42b607f85ee1d6a568617a210c1b9caab1822bce40a89a3b5eb0f626a83fb5fe2055c638aa230897bf224030d28e8 + checksum: 8365f1466d0f7adbf80ebc9b780f263a28eeeabcd5fb515249bfd9a56ab7fe8d29ea53df3d9364d0732ab39ae774445eb28abce694ed375b13882a6b2fe93ffc + languageName: node + linkType: hard + +"whatwg-url@npm:^7.0.0": + version: 7.1.0 + resolution: "whatwg-url@npm:7.1.0" + dependencies: + lodash.sortby: ^4.7.0 + tr46: ^1.0.1 + webidl-conversions: ^4.0.2 + checksum: fecb07c87290b47d2ec2fb6d6ca26daad3c9e211e0e531dd7566e7ff95b5b3525a57d4f32640ad4adf057717e0c215731db842ad761e61d947e81010e05cf5fd languageName: node linkType: hard @@ -5234,7 +5301,7 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.2": +"wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: @@ -5332,15 +5399,15 @@ __metadata: linkType: hard "yargs-parser@npm:^21.0.0": - version: 21.0.0 - resolution: "yargs-parser@npm:21.0.0" - checksum: 1e205fca1cb7a36a1585e2b94a64e641c12741b53627d338e12747f4dca3c3610cdd9bb235040621120548dd74c3ef03a8168d52a1eabfedccbe4a62462b6731 + version: 21.0.1 + resolution: "yargs-parser@npm:21.0.1" + checksum: c3ea2ed12cad0377ce3096b3f138df8267edf7b1aa7d710cd502fe16af417bafe4443dd71b28158c22fcd1be5dfd0e86319597e47badf42ff83815485887323a languageName: node linkType: hard "yargs@npm:^17.0.1": - version: 17.3.1 - resolution: "yargs@npm:17.3.1" + version: 17.4.1 + resolution: "yargs@npm:17.4.1" dependencies: cliui: ^7.0.2 escalade: ^3.1.1 @@ -5349,7 +5416,7 @@ __metadata: string-width: ^4.2.3 y18n: ^5.0.5 yargs-parser: ^21.0.0 - checksum: 64fc2e32c56739f1d14d2d24acd17a6944c3c8e3e3558f09fc1953ac112e868cc16013d282886b9d5be22187f8b9ed4f60741a6b1011f595ce2718805a656852 + checksum: e9012322870d7e4e912a6ae1f63b203e365f911c0cf158be92c36edefddfb3bd38ce17eb9ef0d18858a4777f047c50589ea22dacb44bd949169ba37dc6d34bee languageName: node linkType: hard From d522adb69743fa5c7ec33f7e80777559f78ba672 Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 31 May 2022 20:23:01 +0200 Subject: [PATCH 08/17] add dockerfile for testing --- Dockerfile | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d57abb2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +# credit https://trigodev.com/blog/develop-electron-in-docker +FROM node:16.15.0 + + +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install \ + build-essential clang \ + git libx11-xcb1 libxcb-dri3-0 libcups2-dev libxtst-dev libatk-bridge2.0-0 libdbus-1-dev libgtk-3-dev libxss1 libnotify-dev libasound2-dev libcap-dev libdrm2 libice6 libsm6 \ + xorg openbox libatk-adaptor \ + gperf bison python3-dbusmock \ + libnss3-dev gcc-multilib g++-multilib curl sudo \ + -yq --no-install-suggests --no-install-recommends \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +WORKDIR /app +COPY . . +RUN chown -R node /app + +# install node modules and perform an electron rebuild +USER node +RUN npm install +RUN npx electron-rebuild + +USER root +RUN chown root /app/node_modules/electron/dist/chrome-sandbox +RUN chmod 4755 /app/node_modules/electron/dist/chrome-sandbox + +USER node +CMD bash + +# docker run --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -v `pwd`/src:/app/src --rm -it electron-wrapper bash \ No newline at end of file From 66a547af8fea157ffbf9f4b8af794fe9ea64f0ea Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 31 May 2022 22:26:47 +0200 Subject: [PATCH 09/17] keystore modal --- src/react/components/ImportKeystore.tsx | 150 ++++++++++++++++++ .../InstallFlow/1-Configuration.tsx | 5 +- .../components/InstallFlow/2-Install.tsx | 111 ++++++++++--- 3 files changed, 238 insertions(+), 28 deletions(-) create mode 100644 src/react/components/ImportKeystore.tsx diff --git a/src/react/components/ImportKeystore.tsx b/src/react/components/ImportKeystore.tsx new file mode 100644 index 0000000..fd9bfc3 --- /dev/null +++ b/src/react/components/ImportKeystore.tsx @@ -0,0 +1,150 @@ +import { BackgroundLight, } from '../colors'; +import { Button, FormControl, FormControlLabel, Radio, RadioGroup, Typography, Box, Grid, Modal, InputAdornment, TextField, styled, OutlinedInputProps, TextFieldProps } from '@mui/material'; +import React, { FC, ChangeEvent, Dispatch, ReactElement, SetStateAction, useState } from 'react'; + +import { FileCopy, LockOpen } from '@mui/icons-material' +import { Network } from '../types'; +import { InstallDetails } from '../../electron/IMultiClientInstaller'; + + +const ModalStyle = { + position: 'absolute' as 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 600, + padding: '20px', + borderRadius: '20px', + background: BackgroundLight, + // border: '2px solid #000', + boxShadow: 24, + p: 4, + }; + + const FileUploadField = styled(TextField)({ + '& label.Mui-focused': { + }, + '& .MuiInput-underline:after': { + }, + '& .MuiOutlinedInput-root': { + paddingLeft: '0', + cursor: 'pointer', + '&:hover': { + cursor: 'pointer' + }, + '&:hover fieldset': { + cursor: 'pointer', + }, + '&.Mui-focused fieldset': { + cursor: 'pointer' + }, + }, + }); + +type ImportKeystoreProps = { + setModalOpen: Dispatch> + isModalOpen : boolean + keyStorePath: string + keystorePassword: string + setKeystorePath: Dispatch> + setKeystorePassword: Dispatch> + resolve: () => void + + +// setInstallationDetails: Dispatch>, +// installationDetails: InstallDetails, +} + +// console.log(dialog.showOpenDialog({ properties: ['openFile'] })) + + +/** + * This is the network picker modal component where the user selects the desired network. + * + * @param props.handleCloseNetworkModal function to handle closing the network modal + * @param props.setInstallationDetails the currently set installation details + * @param props.installationDetails the current installation details + * @returns the network picker element to render + */ +export const ImportKeystore: FC = (props): ReactElement => { + + const handleKeystorePathChange = (ev: ChangeEvent) => { + props.setKeystorePath(ev.target.value) + } + const handlePasswordChange = (ev: ChangeEvent) => { + props.setKeystorePassword(ev.target.value) + } + + return ( + props.setModalOpen(false)} + aria-labelledby="modal-modal-title" + aria-describedby="modal-modal-description" + > + + + Import Validator Keys + +
+ + + + + Keystore File + + + { + ev.preventDefault() + console.log('clicking keystore') + window.electronAPI.invokeShowOpenDialog({ + properties: ['openFile'] + }).then(DialogResponse => { + if (DialogResponse.filePaths && DialogResponse.filePaths.length) { + props.setKeystorePath(DialogResponse.filePaths[0]) + } + }) + }} position="start">, + }} + /> + + + + + Keystore Password + + + , + }} + onChange={handlePasswordChange} + /> + + + + + + + +
+
+ ) +} \ No newline at end of file diff --git a/src/react/components/InstallFlow/1-Configuration.tsx b/src/react/components/InstallFlow/1-Configuration.tsx index 0835d7e..c75bf03 100644 --- a/src/react/components/InstallFlow/1-Configuration.tsx +++ b/src/react/components/InstallFlow/1-Configuration.tsx @@ -6,6 +6,7 @@ import styled from '@emotion/styled'; import { ConsensusClients, ExecutionClients, IConsensusClient, IExecutionClient } from '../../constants' import { ConsensusClient, ExecutionClient, InstallDetails } from '../../../electron/IMultiClientInstaller'; import { BackgroundLight, } from '../../colors'; +import { ImportKeystore } from '../ImportKeystore'; type ConfigurationProps = { onStepBack: () => void, @@ -94,7 +95,7 @@ const Configuration: FC = (props): ReactElement => { > {ConsensusClients.map((c: IConsensusClient) => { return ( - {c.label} + {c.label} ) })} @@ -120,7 +121,7 @@ const Configuration: FC = (props): ReactElement => { > {ExecutionClients.map((c: IExecutionClient) => { return ( - {c.label} + {c.label} ) })} diff --git a/src/react/components/InstallFlow/2-Install.tsx b/src/react/components/InstallFlow/2-Install.tsx index 083a202..677eff9 100644 --- a/src/react/components/InstallFlow/2-Install.tsx +++ b/src/react/components/InstallFlow/2-Install.tsx @@ -1,11 +1,13 @@ import React, { Dispatch, FC, ReactElement, SetStateAction, useState, useRef, useEffect, MouseEventHandler } from 'react'; -import { Grid, Typography, Fab, CircularProgress, Box } from '@mui/material'; +import { Grid, Typography, Fab, CircularProgress, Box, InputAdornment, Link, Modal, TextField } from '@mui/material'; import StepNavigation from '../StepNavigation'; -import { DoneOutline, DownloadingOutlined, ComputerOutlined, RocketLaunchOutlined } from '@mui/icons-material'; +import { DoneOutline, DownloadingOutlined, ComputerOutlined, RocketLaunchOutlined, Folder } from '@mui/icons-material'; import styled from '@emotion/styled'; import { green } from '@mui/material/colors'; import { InstallDetails } from '../../../electron/IMultiClientInstaller'; +import { BackgroundLight } from '../../colors'; +import { ImportKeystore } from '../ImportKeystore' type InstallProps = { onStepBack: () => void, @@ -35,10 +37,10 @@ const Install: FC = (props): ReactElement => { const [successPreInstall, setSuccessPreInstall] = useState(false); const [successInstall, setSuccessInstall] = useState(false); const [successPostInstall, setSuccessPostInstall] = useState(false); - const timerPreInstall = useRef(); - const timerInstall = useRef(); - const timerPostInstall = useRef(); - const timerWaitBeforeStart = useRef(); + // const timerPreInstall = useRef(); + // const timerInstall = useRef(); + // const timerPostInstall = useRef(); + // const timerWaitBeforeStart = useRef(); const [disableBack, setDisableBack] = useState(true) const [disableForward, setDisableForward] = useState(true) @@ -70,14 +72,33 @@ const Install: FC = (props): ReactElement => { }), }; - useEffect(() => { - return () => { - clearTimeout(timerPostInstall.current); - clearTimeout(timerPreInstall.current); - clearTimeout(timerInstall.current); - clearTimeout(timerWaitBeforeStart.current) - }; - }, []); + const ModalStyle = { + position: 'absolute' as 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 600, + padding: '20px', + borderRadius: '20px', + background: BackgroundLight, + // border: '2px solid #000', + boxShadow: 24, + p: 4, +}; + +const [isModalOpen, setModalOpen] = useState(false) +const [keyStorePath, setKeystorePath] = useState('') +const [keystorePassword, setKeystorePassword] = useState('') +const [resolveModal, setResolveModal] = useState<() => void>(() => {}) + + // useEffect(() => { + // return () => { + // clearTimeout(timerPostInstall.current); + // clearTimeout(timerPreInstall.current); + // clearTimeout(timerInstall.current); + // clearTimeout(timerWaitBeforeStart.current) + // }; + // }, []); const handlePreInstall: () => Promise = () => { @@ -91,8 +112,9 @@ const Install: FC = (props): ReactElement => { setSuccessPreInstall(true); setLoadingPreInstall(false); resolve(preInstallResult) + }).catch(err => { + console.error('preinstall failed', err) }) - } }) }; @@ -108,50 +130,78 @@ const Install: FC = (props): ReactElement => { setSuccessInstall(true); setLoadingInstall(false); resolve(res) - }) + }) } }) }; + const handleKeyImportModal: () => Promise = () => { + return new Promise((resolve) => { + setModalOpen(true) + setResolveModal(() => resolve(null)) + }).then(() => { + return new Promise((resolve) => { + window.ethDocker.importKeys(props.installationDetails.network, keyStorePath, keystorePassword) + .then((importKeyResult) => { + resolve(importKeyResult) + }) + }) + }) + } + const handlePostInstall: () => Promise = () => { return new Promise((resolve) => { if (!loadingPostInstall) { setSuccessPostInstall(false); setLoadingPostInstall(true); - window.ethDocker.importKeys(props.installationDetails.network, '/home/remy/keys', 'password') - .then((importKeyResult) => { - if(importKeyResult) { - window.ethDocker.postInstall(props.installationDetails.network) - .then((res) => { - resolve(res) - } - ) + window.ethDocker.postInstall(props.installationDetails.network) + .then((res) => { + resolve(res) } - }) + ) } }) }; const install = async () => { + console.log('pre install') let preInstallResult = await handlePreInstall() + console.log('preinstall result', preInstallResult) if (!preInstallResult) { + props.onStepBack() return } + console.log('install') let installResult = await handleInstall() + console.log('install result', preInstallResult) if (!installResult) { + props.onStepBack() + return + } + console.log('key import') + let keyImportResult = await handleKeyImportModal() + console.log('key import', keyImportResult) + if (!keyImportResult) { + props.onStepBack() return } + console.log('post install') let postInstallResult = await handlePostInstall() + console.log('post install result', preInstallResult) if (!postInstallResult) { - setDisableForward(false) + props.onStepBack() + return } + setDisableForward(false) } useEffect(() => { install() }, []) + + return ( @@ -274,6 +324,15 @@ const Install: FC = (props): ReactElement => { disableBack={disableBack} disableNext={disableForward} /> + ); } From c11f801bba6e87fb5de68e37cc646c04d0d9adf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Roy?= Date: Tue, 31 May 2022 16:27:59 -0400 Subject: [PATCH 10/17] Initial backend streaming for error and messages --- package.json | 2 +- src/electron/EthDockerInstaller.ts | 88 +++++++++++++++++++++------ src/electron/IMultiClientInstaller.ts | 29 +++++---- src/electron/preload.ts | 8 ++- src/electron/renderer.d.ts | 4 +- src/react/pages/Home.tsx | 18 +++--- 6 files changed, 106 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index a79f91c..8098104 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "wagyuinstaller", "productName": "Wagyu Installer", - "version": "0.5.0", + "version": "0.5.3", "description": "Application aimed at lowering the technical bar to staking on Ethereum", "main": "./build/electron/index.js", "author": "Colfax Selby ", diff --git a/src/electron/EthDockerInstaller.ts b/src/electron/EthDockerInstaller.ts index ac58fb1..31c68aa 100644 --- a/src/electron/EthDockerInstaller.ts +++ b/src/electron/EthDockerInstaller.ts @@ -5,7 +5,7 @@ import { generate as generate_password } from "generate-password"; import { exec, execFile } from 'child_process'; import { promisify } from 'util'; -import { withDir } from 'tmp-promise' +import { withDir } from 'tmp-promise'; import { open, rm, mkdir } from 'fs/promises'; @@ -18,7 +18,8 @@ import { IMultiClientInstaller, NodeStatus, ValidatorStatus, - InstallDetails + InstallDetails, + OutputLogs } from "./IMultiClientInstaller"; import { Network, networkToExecution } from '../react/types'; import { doesFileExist, doesDirectoryExist } from './BashUtils'; @@ -40,20 +41,30 @@ type SystemdServiceDetails = { unitFileState: string | undefined; } +const writeOutput = (message: string, outputLogs?: OutputLogs): void => { + if (outputLogs) { + outputLogs(message); + } +}; + export class EthDockerInstaller implements IMultiClientInstaller { title = 'Electron'; - async preInstall(): Promise { + async preInstall(outputLogs?: OutputLogs): Promise { let packagesToInstall = new Array(); // We need git installed const gitPackageName = 'git'; + writeOutput(`Checking if ${gitPackageName} is installed.`, outputLogs); const gitInstalled = await this.checkForInstalledUbuntuPackage(gitPackageName); if (!gitInstalled) { + writeOutput(`${gitPackageName} is not installed. We will install it.`, outputLogs); packagesToInstall.push(gitPackageName); + } else { + writeOutput(`${gitPackageName} is already installed. We will not install it.`, outputLogs); } // We need docker installed, enabled and running @@ -61,26 +72,43 @@ export class EthDockerInstaller implements IMultiClientInstaller { let needToEnableDockerService = true; let needToStartDockerService = false; + writeOutput(`Checking if ${dockerPackageName} is installed.`, outputLogs); const dockerInstalled = await this.checkForInstalledUbuntuPackage(dockerPackageName); if (!dockerInstalled) { + writeOutput(`${dockerPackageName} is not installed. We will install it.`, outputLogs); packagesToInstall.push(dockerPackageName); } else { + writeOutput(`${dockerPackageName} is already installed. We will not install it.`, outputLogs); + + writeOutput(`Checking if we need to enable or start the ${dockerServiceName} service.`, outputLogs); const dockerServiceDetails = await this.getSystemdServiceDetails(dockerServiceName); needToEnableDockerService = dockerServiceDetails.unitFileState != 'enabled'; + if (needToEnableDockerService) { + writeOutput(`The ${dockerServiceName} service is not enabled. We will enable it.`, outputLogs); + } needToStartDockerService = dockerServiceDetails.subState != 'running'; + if (needToStartDockerService) { + writeOutput(`The ${dockerServiceName} service is not started. We will start it.`, outputLogs); + } } // We need our user to be in docker group + writeOutput(`Checking if current user is in ${dockerGroupName} group.`, outputLogs); const needUserInDockerGroup = !await this.isUserInGroup(dockerGroupName); + if (needUserInDockerGroup) { + writeOutput(`Current user is not in ${dockerGroupName} group. We will add it.`, outputLogs); + } // We need our installPath directory + writeOutput(`Creating install directory in ${installPath}.`, outputLogs); await mkdir(installPath, { recursive: true }); return await this.preInstallAdminScript( packagesToInstall, needUserInDockerGroup, needToEnableDockerService, - needToStartDockerService); + needToStartDockerService, + outputLogs); } async getSystemdServiceDetails(serviceName: string): Promise { @@ -132,7 +160,8 @@ export class EthDockerInstaller implements IMultiClientInstaller { packagesToInstall: Array, needUserInDockerGroup: boolean, needToEnableDockerService: boolean, - needToStartDockerService: boolean): Promise { + needToStartDockerService: boolean, + outputLogs?: OutputLogs): Promise { if ( packagesToInstall.length > 0 || @@ -148,36 +177,55 @@ export class EthDockerInstaller implements IMultiClientInstaller { await withDir(async dirResult => { const scriptPath = path.join(dirResult.path, 'commands.sh'); + let scriptContent = ''; const scriptFile = await open(scriptPath, 'w'); await scriptFile.write('#!/bin/bash\n'); // Install APT packages if (packagesToInstall.length > 0) { - await scriptFile.write('apt -y update\n'); - await scriptFile.write('apt -y install ' + commandJoin(packagesToInstall) + '\n'); + const aptUpdate = 'apt -y update\n'; + const aptInstall = 'apt -y install ' + commandJoin(packagesToInstall) + '\n'; + + scriptContent += aptUpdate + aptInstall; + + await scriptFile.write(aptUpdate); + await scriptFile.write(aptInstall); } // Enable docker service if (needToEnableDockerService) { - await scriptFile.write('systemctl enable --now ' + commandJoin([dockerServiceName]) + '\n'); + const systemctlEnable = 'systemctl enable --now ' + commandJoin([dockerServiceName]) + '\n'; + + scriptContent += systemctlEnable; + + await scriptFile.write(systemctlEnable); } // Start docker service if (needToStartDockerService) { - await scriptFile.write('systemctl start ' + commandJoin([dockerServiceName]) + '\n'); + const systemctlStart = 'systemctl start ' + commandJoin([dockerServiceName]) + '\n'; + + scriptContent += systemctlStart; + + await scriptFile.write(systemctlStart); } // Add user in docker group if (needUserInDockerGroup) { const userName = await this.getUsername(); + const usermodUser = `usermod -aG ${dockerGroupName} ${userName}\n`; + + scriptContent += usermodUser; - await scriptFile.write(`usermod -aG ${dockerGroupName} ${userName}\n`); + await scriptFile.write(usermodUser); } await scriptFile.chmod(0o500); await scriptFile.close(); + writeOutput(`Running script ${scriptPath} with the following content as root:\n${scriptContent}`, outputLogs); + const promise = new Promise(async (resolve, reject) => { const options = { name: this.title @@ -186,6 +234,9 @@ export class EthDockerInstaller implements IMultiClientInstaller { sudo.exec(scriptPath, options, function (error, stdout, stderr) { if (error) reject(error); + if (stdout) { + writeOutput(stdout.toString(), outputLogs); + } resolve(true); } ); @@ -230,7 +281,7 @@ export class EthDockerInstaller implements IMultiClientInstaller { return stdout.indexOf('[installed]') > 0 } - async install(details: InstallDetails): Promise { + async install(details: InstallDetails, outputLogs?: OutputLogs): Promise { // Install and update eth-docker if (!await this.installUpdateEthDockerCode(details.network)) { return false; @@ -422,11 +473,11 @@ EONG return true; } - async postInstall(network: Network): Promise { - return this.startNodes(network); + async postInstall(network: Network, outputLogs?: OutputLogs): Promise { + return this.startNodes(network, outputLogs); } - async stopNodes(network: Network): Promise { + async stopNodes(network: Network, outputLogs?: OutputLogs): Promise { const networkPath = path.join(installPath, network.toLowerCase()); const ethDockerPath = path.join(networkPath, 'eth-docker'); @@ -448,7 +499,7 @@ EONG return true; } - async startNodes(network: Network): Promise { + async startNodes(network: Network, outputLogs?: OutputLogs): Promise { const networkPath = path.join(installPath, network.toLowerCase()); const ethDockerPath = path.join(networkPath, 'eth-docker'); @@ -470,13 +521,13 @@ EONG return true; } - async updateExecutionClient(): Promise { + async updateExecutionClient(outputLogs?: OutputLogs): Promise { // TODO: implement console.log("Executing updateExecutionClient"); return; } - async updateConsensusClient(): Promise { + async updateConsensusClient(outputLogs?: OutputLogs): Promise { // TODO: implement console.log("Executing updateConsensusClient"); return; @@ -485,7 +536,8 @@ EONG async importKeys( network: Network, keyStoreDirectoryPath: string, - keyStorePassword: string): Promise { + keyStorePassword: string, + outputLogs?: OutputLogs): Promise { const networkPath = path.join(installPath, network.toLowerCase()); const ethDockerPath = path.join(networkPath, 'eth-docker'); diff --git a/src/electron/IMultiClientInstaller.ts b/src/electron/IMultiClientInstaller.ts index f213cb4..b3dbe52 100644 --- a/src/electron/IMultiClientInstaller.ts +++ b/src/electron/IMultiClientInstaller.ts @@ -1,28 +1,29 @@ -import { Network } from "../react/types" +import { Network } from "../react/types"; export interface IMultiClientInstaller { // Functionality - preInstall: () => Promise, - install: (details: InstallDetails) => Promise, - postInstall: (network: Network) => Promise, + preInstall: (outputLogs?: OutputLogs) => Promise, + install: (details: InstallDetails, outputLogs?: OutputLogs) => Promise, + postInstall: (network: Network, outputLogs?: OutputLogs) => Promise, - stopNodes: (network: Network) => Promise, - startNodes: (network: Network) => Promise, + stopNodes: (network: Network, outputLogs?: OutputLogs) => Promise, + startNodes: (network: Network, outputLogs?: OutputLogs) => Promise, - updateExecutionClient: () => Promise, - updateConsensusClient: () => Promise, + updateExecutionClient: (outputLogs?: OutputLogs) => Promise, + updateConsensusClient: (outputLogs?: OutputLogs) => Promise, importKeys: ( network: Network, keyStoreDirectoryPath: string, - keyStorePassword: string) => Promise, + keyStorePassword: string, + outputLogs?: OutputLogs) => Promise, exportKeys: () => Promise, - switchExecutionClient: (targetClient: ExecutionClient) => Promise, - switchConsensusClient: (targetClient: ConsensusClient) => Promise, + switchExecutionClient: (targetClient: ExecutionClient, outputLogs?: OutputLogs) => Promise, + switchConsensusClient: (targetClient: ConsensusClient, outputLogs?: OutputLogs) => Promise, - uninstall: () => Promise, + uninstall: (outputLogs?: OutputLogs) => Promise, // Data @@ -50,6 +51,10 @@ export interface IMultiClientInstaller { // TODO: logs stream } +export interface OutputLogs { + (message: string): void; +} + export type InstallDetails = { network: Network, executionClient: ExecutionClient, diff --git a/src/electron/preload.ts b/src/electron/preload.ts index 611de54..1ca5883 100644 --- a/src/electron/preload.ts +++ b/src/electron/preload.ts @@ -16,11 +16,13 @@ import { Network } from "../react/types"; import { doesDirectoryExist, findFirstFile } from './BashUtils'; import { EthDockerInstaller } from './EthDockerInstaller'; -import { InstallDetails } from "./IMultiClientInstaller"; +import { InstallDetails, OutputLogs } from "./IMultiClientInstaller"; + +import { Writable } from 'stream'; const ethDockerInstaller = new EthDockerInstaller(); -const ethDockerPreInstall = async (): Promise => { - return ethDockerInstaller.preInstall(); +const ethDockerPreInstall = async (outputLogs?: OutputLogs): Promise => { + return ethDockerInstaller.preInstall(outputLogs); }; const ethDockerInstall = async (details: InstallDetails): Promise => { return ethDockerInstaller.install(details); diff --git a/src/electron/renderer.d.ts b/src/electron/renderer.d.ts index efe17f2..b0674ef 100644 --- a/src/electron/renderer.d.ts +++ b/src/electron/renderer.d.ts @@ -26,7 +26,7 @@ import { import { EthDockerInstaller } from './EthDockerInstaller' -import { InstallDetails } from "./IMultiClientInstaller"; +import { InstallDetails, OutputLogs } from "./IMultiClientInstaller"; export interface IElectronAPI { shellOpenExternal: (url: string, options?: Electron.OpenExternalOptions | undefined) => Promise, @@ -44,7 +44,7 @@ export interface IBashUtilsAPI { export interface IEthDockerAPI { - preInstall: () => Promise, + preInstall: (outputLogs?: OutputLogs) => Promise, install: (details: InstallDetails) => Promise, importKeys: ( network: Network, diff --git a/src/react/pages/Home.tsx b/src/react/pages/Home.tsx index f44acb0..5104ac7 100644 --- a/src/react/pages/Home.tsx +++ b/src/react/pages/Home.tsx @@ -7,7 +7,7 @@ import { HomeIcon } from "../components/icons/HomeIcon"; import { NetworkPicker } from "../components/NetworkPicker"; import { Network, StepSequenceKey } from '../types' import VersionFooter from "../components/VersionFooter"; -import { ConsensusClient, ExecutionClient, InstallDetails } from "../../electron/IMultiClientInstaller"; +import { ConsensusClient, ExecutionClient, InstallDetails, OutputLogs } from "../../electron/IMultiClientInstaller"; const StyledMuiContainer = styled(Container)` display: flex; @@ -102,9 +102,13 @@ const Home: FC = (props): ReactElement => { const handleEnter = () => { // Backend usage example - /*window.ethDocker.preInstall().then(preInstallResult => { + const consoleWrite: OutputLogs = (message: string): void => { + console.log(message); + }; + + window.ethDocker.preInstall(consoleWrite).then(preInstallResult => { console.log(`preInstall ${preInstallResult}`); - if (preInstallResult) { + /*if (preInstallResult) { const installationDetails: InstallDetails = { network: props.network, executionClient: ExecutionClient.GETH, @@ -130,10 +134,10 @@ const Home: FC = (props): ReactElement => { } }); - } - });*/ + }*/ + }); - setEnterSelected(true); + /*setEnterSelected(true); if (!networkModalWasOpened) { handleOpenNetworkModal(); @@ -143,7 +147,7 @@ const Home: FC = (props): ReactElement => { } navigate(location); - } + }*/ } const tabIndex = (priority: number) => showNetworkModal ? -1 : priority; From d512bd7d398586998ff04d44e3ca68c033cb75ec Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 4 Jun 2022 00:51:52 +0200 Subject: [PATCH 11/17] add buffer and failed state --- Dockerfile | 27 +++- src/react/components/ImportKeystore.tsx | 18 ++- .../components/InstallFlow/2-Install.tsx | 145 +++++++++++++----- src/react/pages/Home.tsx | 16 +- 4 files changed, 151 insertions(+), 55 deletions(-) diff --git a/Dockerfile b/Dockerfile index d57abb2..6ed9cb4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,13 +3,27 @@ FROM node:16.15.0 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install \ - build-essential clang \ + build-essential clang policykit-1 \ git libx11-xcb1 libxcb-dri3-0 libcups2-dev libxtst-dev libatk-bridge2.0-0 libdbus-1-dev libgtk-3-dev libxss1 libnotify-dev libasound2-dev libcap-dev libdrm2 libice6 libsm6 \ xorg openbox libatk-adaptor \ gperf bison python3-dbusmock \ libnss3-dev gcc-multilib g++-multilib curl sudo \ -yq --no-install-suggests --no-install-recommends \ - && apt-get clean && rm -rf /var/lib/apt/lists/* + && apt-get clean && rm -rf /var/lib/apt/lists/* \ + ca-certificates \ + curl \ + gnupg \ + lsb-release +# RUN mkdir -p /etc/apt/keyrings +# RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +# RUN echo \ +# "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ +# $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +RUN curl -fsSL https://get.docker.com | sh +RUN curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +RUN chmod +x /usr/local/bin/docker-compose +# RUN sudo groupadd docker WORKDIR /app COPY . . @@ -23,8 +37,11 @@ RUN npx electron-rebuild USER root RUN chown root /app/node_modules/electron/dist/chrome-sandbox RUN chmod 4755 /app/node_modules/electron/dist/chrome-sandbox +RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers +RUN usermod -aG sudo node +RUN usermod -aG docker node -USER node -CMD bash -# docker run --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -v `pwd`/src:/app/src --rm -it electron-wrapper bash \ No newline at end of file +USER node +ENTRYPOINT [ "bash" ] +# docker run --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -v `pwd`/src:/app/src --rm -it electron-wrapper bash \ No newline at end of file diff --git a/src/react/components/ImportKeystore.tsx b/src/react/components/ImportKeystore.tsx index fd9bfc3..ab15d6b 100644 --- a/src/react/components/ImportKeystore.tsx +++ b/src/react/components/ImportKeystore.tsx @@ -1,6 +1,6 @@ import { BackgroundLight, } from '../colors'; -import { Button, FormControl, FormControlLabel, Radio, RadioGroup, Typography, Box, Grid, Modal, InputAdornment, TextField, styled, OutlinedInputProps, TextFieldProps } from '@mui/material'; -import React, { FC, ChangeEvent, Dispatch, ReactElement, SetStateAction, useState } from 'react'; +import { Button, FormControl, FormControlLabel, Radio, RadioGroup, Typography, Box, Grid, Modal, InputAdornment, TextField, styled, OutlinedInputProps, TextFieldProps } from '@mui/material'; +import React, { FC, ChangeEvent, Dispatch, ReactElement, SetStateAction, useState, MutableRefObject } from 'react'; import { FileCopy, LockOpen } from '@mui/icons-material' import { Network } from '../types'; @@ -48,7 +48,8 @@ type ImportKeystoreProps = { keystorePassword: string setKeystorePath: Dispatch> setKeystorePassword: Dispatch> - resolve: () => void + closing: MutableRefObject<((arg: () => Promise) => void) | undefined> + installationDetails: InstallDetails // setInstallationDetails: Dispatch>, @@ -75,6 +76,9 @@ export const ImportKeystore: FC = (props): ReactElement => props.setKeystorePassword(ev.target.value) } + // console.log('IMPORT resolve: ', props.closing, props.closing.current) + + return ( = (props): ReactElement => ev.preventDefault() console.log('clicking keystore') window.electronAPI.invokeShowOpenDialog({ - properties: ['openFile'] + + properties: ['openDirectory'] }).then(DialogResponse => { if (DialogResponse.filePaths && DialogResponse.filePaths.length) { props.setKeystorePath(DialogResponse.filePaths[0]) @@ -138,8 +143,11 @@ export const ImportKeystore: FC = (props): ReactElement => diff --git a/src/react/components/InstallFlow/2-Install.tsx b/src/react/components/InstallFlow/2-Install.tsx index 677eff9..c239ee3 100644 --- a/src/react/components/InstallFlow/2-Install.tsx +++ b/src/react/components/InstallFlow/2-Install.tsx @@ -1,10 +1,10 @@ import React, { Dispatch, FC, ReactElement, SetStateAction, useState, useRef, useEffect, MouseEventHandler } from 'react'; import { Grid, Typography, Fab, CircularProgress, Box, InputAdornment, Link, Modal, TextField } from '@mui/material'; import StepNavigation from '../StepNavigation'; -import { DoneOutline, DownloadingOutlined, ComputerOutlined, RocketLaunchOutlined, Folder } from '@mui/icons-material'; +import { DoneOutline, DownloadingOutlined, ComputerOutlined, RocketLaunchOutlined, Folder, KeyOutlined, ErrorOutline } from '@mui/icons-material'; import styled from '@emotion/styled'; -import { green } from '@mui/material/colors'; +import { green, red } from '@mui/material/colors'; import { InstallDetails } from '../../../electron/IMultiClientInstaller'; import { BackgroundLight } from '../../colors'; import { ImportKeystore } from '../ImportKeystore' @@ -33,14 +33,23 @@ const Install: FC = (props): ReactElement => { const [loadingPreInstall, setLoadingPreInstall] = useState(false); const [loadingInstall, setLoadingInstall] = useState(false); + const [loadingKeyImport, setLoadingKeyImport] = useState(false); const [loadingPostInstall, setLoadingPostInstall] = useState(false); + + const [failedPreInstall, setFailedPreInstall] = useState(false); + const [failedInstall, setFailedInstall] = useState(false); + const [failedKeyImport, setFailedKeyImport] = useState(false); + const [failedPostInstall, setFailedPostInstall] = useState(false); + const [successPreInstall, setSuccessPreInstall] = useState(false); const [successInstall, setSuccessInstall] = useState(false); + const [successKeyImport, setSuccessKeyImport] = useState(false); const [successPostInstall, setSuccessPostInstall] = useState(false); // const timerPreInstall = useRef(); // const timerInstall = useRef(); // const timerPostInstall = useRef(); // const timerWaitBeforeStart = useRef(); + const resolveModal = useRef<(arg: () => Promise) => void>(); const [disableBack, setDisableBack] = useState(true) const [disableForward, setDisableForward] = useState(true) @@ -89,7 +98,7 @@ const Install: FC = (props): ReactElement => { const [isModalOpen, setModalOpen] = useState(false) const [keyStorePath, setKeystorePath] = useState('') const [keystorePassword, setKeystorePassword] = useState('') -const [resolveModal, setResolveModal] = useState<() => void>(() => {}) +// const [resolveModal, setResolveModal] = useState<() => void>(() => {}) // useEffect(() => { // return () => { @@ -100,20 +109,32 @@ const [resolveModal, setResolveModal] = useState<() => void>(() => {}) // }; // }, []); + const bufferLoad:() => Promise = () => { + return new Promise((resolve) => { + setTimeout(() => resolve(true), 1500) + }) + } + + const empty: () => Promise = () => { + return new Promise((resolve) => { + resolve(true) + }) + } const handlePreInstall: () => Promise = () => { return new Promise((resolve) => { if (!loadingPreInstall) { setSuccessPreInstall(false); setLoadingPreInstall(true); - - window.ethDocker.preInstall() - .then((preInstallResult) => { + + function consoleWrite(info: string) { + console.log(info) + } + + Promise.all([window.ethDocker.preInstall(consoleWrite), bufferLoad()]).then((res) => { setSuccessPreInstall(true); setLoadingPreInstall(false); - resolve(preInstallResult) - }).catch(err => { - console.error('preinstall failed', err) + resolve(res[0]) }) } }) @@ -125,26 +146,29 @@ const [resolveModal, setResolveModal] = useState<() => void>(() => {}) setSuccessInstall(false); setLoadingInstall(true); - window.ethDocker.install(props.installationDetails) - .then(res => { + Promise.all([window.ethDocker.install(props.installationDetails), bufferLoad()]).then((res) => { setSuccessInstall(true); setLoadingInstall(false); - resolve(res) + resolve(res[0]) }) } }) }; const handleKeyImportModal: () => Promise = () => { - return new Promise((resolve) => { + return new Promise((resolve: (arg: () => Promise) => void) => { + setSuccessKeyImport(false) + setLoadingKeyImport(true); setModalOpen(true) - setResolveModal(() => resolve(null)) - }).then(() => { + resolveModal.current = resolve + + }).then((keyImp: () => Promise) => { return new Promise((resolve) => { - window.ethDocker.importKeys(props.installationDetails.network, keyStorePath, keystorePassword) - .then((importKeyResult) => { - resolve(importKeyResult) - }) + Promise.all([keyImp(), bufferLoad()]).then(res => { + setSuccessKeyImport(true) + setLoadingKeyImport(false); + resolve(res[0]) + }) }) }) } @@ -155,11 +179,11 @@ const [resolveModal, setResolveModal] = useState<() => void>(() => {}) setSuccessPostInstall(false); setLoadingPostInstall(true); - window.ethDocker.postInstall(props.installationDetails.network) - .then((res) => { - resolve(res) - } - ) + Promise.all([ window.ethDocker.postInstall(props.installationDetails.network), bufferLoad()]).then((res) => { + setSuccessPostInstall(true); + setLoadingPostInstall(false); + resolve(res[0]) + }) } }) }; @@ -169,28 +193,32 @@ const [resolveModal, setResolveModal] = useState<() => void>(() => {}) let preInstallResult = await handlePreInstall() console.log('preinstall result', preInstallResult) if (!preInstallResult) { - props.onStepBack() + setFailedPreInstall(true) + setDisableBack(false) return } console.log('install') let installResult = await handleInstall() - console.log('install result', preInstallResult) + console.log('install result', installResult) if (!installResult) { - props.onStepBack() + setFailedInstall(true) + setDisableBack(false) return } console.log('key import') let keyImportResult = await handleKeyImportModal() console.log('key import', keyImportResult) if (!keyImportResult) { - props.onStepBack() + setFailedKeyImport(true) + setDisableBack(false) return } console.log('post install') let postInstallResult = await handlePostInstall() - console.log('post install result', preInstallResult) + console.log('post install result', postInstallResult) if (!postInstallResult) { - props.onStepBack() + setFailedPostInstall(true) + setDisableBack(false) return } setDisableForward(false) @@ -220,9 +248,11 @@ const [resolveModal, setResolveModal] = useState<() => void>(() => {}) sx={buttonPreInstallSx} disabled > - {successPreInstall ? : } + }}/> : : + } {loadingPreInstall && ( void>(() => {}) sx={buttonInstallSx} disabled > - {successInstall ? : } + }} /> : : + } {loadingInstall && ( void>(() => {}) + + + + + + { + !failedKeyImport ? successKeyImport ? : : + } + + {loadingKeyImport && ( + + )} + + + + + Key Import + + + @@ -288,10 +356,12 @@ const [resolveModal, setResolveModal] = useState<() => void>(() => {}) sx={buttonPostInstallSx} disabled > - {successPostInstall ? + { + !failedPostInstall ? successPostInstall ? : } + }} /> : : + } {loadingPostInstall && ( void>(() => {}) setKeystorePath={setKeystorePath} keyStorePath={keyStorePath} keystorePassword={keystorePassword} - resolve={resolveModal} + closing={resolveModal} + installationDetails={props.installationDetails} /> ); diff --git a/src/react/pages/Home.tsx b/src/react/pages/Home.tsx index 6ea44cf..8447a01 100644 --- a/src/react/pages/Home.tsx +++ b/src/react/pages/Home.tsx @@ -102,12 +102,12 @@ const Home: FC = (props): ReactElement => { const handleEnter = () => { // Backend usage example - const consoleWrite: OutputLogs = (message: string): void => { - console.log(message); - }; + // const consoleWrite: OutputLogs = (message: string): void => { + // console.log(message); + // }; - window.ethDocker.preInstall(consoleWrite).then(preInstallResult => { - console.log(`preInstall ${preInstallResult}`); + // window.ethDocker.preInstall(consoleWrite).then(preInstallResult => { + // console.log(`preInstall ${preInstallResult}`); /*if (preInstallResult) { const installationDetails: InstallDetails = { network: props.network, @@ -135,9 +135,9 @@ const Home: FC = (props): ReactElement => { }); }*/ - }); + // }); - /*setEnterSelected(true); + setEnterSelected(true); if (!networkModalWasOpened) { handleOpenNetworkModal(); @@ -147,7 +147,7 @@ const Home: FC = (props): ReactElement => { } navigate(location); - }*/ + } } const tabIndex = (priority: number) => showNetworkModal ? -1 : priority; From b391000f50644d7593b4be005b372d7b505df11c Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 7 Jun 2022 20:14:45 +0200 Subject: [PATCH 12/17] import directroy & improve error handling ui --- Dockerfile | 11 +- src/react/components/ImportKeystore.tsx | 4 +- .../components/InstallFlow/2-Install.tsx | 165 ++++++++++++------ 3 files changed, 112 insertions(+), 68 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6ed9cb4..9f25db6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,16 +14,11 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install \ curl \ gnupg \ lsb-release -# RUN mkdir -p /etc/apt/keyrings -# RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg -# RUN echo \ -# "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ -# $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null RUN curl -fsSL https://get.docker.com | sh -RUN curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -RUN chmod +x /usr/local/bin/docker-compose -# RUN sudo groupadd docker +# RUN echo 'alias docker-compose="docker compose"' >> /home/node/.bashrc +RUN apt-get install docker-compose + WORKDIR /app COPY . . diff --git a/src/react/components/ImportKeystore.tsx b/src/react/components/ImportKeystore.tsx index ab15d6b..55ea15d 100644 --- a/src/react/components/ImportKeystore.tsx +++ b/src/react/components/ImportKeystore.tsx @@ -95,11 +95,11 @@ export const ImportKeystore: FC = (props): ReactElement => - Keystore File + Keystore Directory = (props): ReactElement => { const [disableBack, setDisableBack] = useState(true) const [disableForward, setDisableForward] = useState(true) - + const buttonPreInstallSx = { - ...(successPreInstall && { + ...(failedPreInstall ? { + bgcolor: '#ffc107', + '&:hover': { + bgcolor: '#ffc107', + }, + } : successPreInstall && { bgcolor: green[500], '&:hover': { bgcolor: green[700], @@ -64,7 +69,26 @@ const Install: FC = (props): ReactElement => { }; const buttonInstallSx = { - ...(successInstall && { + ...(failedInstall ? { + bgcolor: '#ffc107', + '&:hover': { + bgcolor: '#ffc107', + }, + } :successInstall && { + bgcolor: green[500], + '&:hover': { + bgcolor: green[700], + }, + }), + }; + + const buttonKeyImportSx = { + ...(failedKeyImport ? { + bgcolor: '#ffc107', + '&:hover': { + bgcolor: '#ffc107', + }, + } : successKeyImport && { bgcolor: green[500], '&:hover': { bgcolor: green[700], @@ -73,7 +97,12 @@ const Install: FC = (props): ReactElement => { }; const buttonPostInstallSx = { - ...(successPostInstall && { + ...(failedPostInstall ? { + bgcolor: '#ffc107', + '&:hover': { + bgcolor: '#ffc107', + }, + } : successPostInstall && { bgcolor: green[500], '&:hover': { bgcolor: green[700], @@ -81,19 +110,6 @@ const Install: FC = (props): ReactElement => { }), }; - const ModalStyle = { - position: 'absolute' as 'absolute', - top: '50%', - left: '50%', - transform: 'translate(-50%, -50%)', - width: 600, - padding: '20px', - borderRadius: '20px', - background: BackgroundLight, - // border: '2px solid #000', - boxShadow: 24, - p: 4, -}; const [isModalOpen, setModalOpen] = useState(false) const [keyStorePath, setKeystorePath] = useState('') @@ -161,15 +177,22 @@ const [keystorePassword, setKeystorePassword] = useState('') setLoadingKeyImport(true); setModalOpen(true) resolveModal.current = resolve - }).then((keyImp: () => Promise) => { - return new Promise((resolve) => { + return new Promise((resolve: (arg: boolean) => void ) => { Promise.all([keyImp(), bufferLoad()]).then(res => { setSuccessKeyImport(true) setLoadingKeyImport(false); resolve(res[0]) + }).catch(err => { + console.error('error importing key: ',err) + setLoadingKeyImport(false); + resolve(false) }) }) + }).catch(err => { + console.error('error filling out key import modal: ',err) + setLoadingKeyImport(false); + return false }) } @@ -188,44 +211,66 @@ const [keystorePassword, setKeystorePassword] = useState('') }) }; - const install = async () => { - console.log('pre install') - let preInstallResult = await handlePreInstall() - console.log('preinstall result', preInstallResult) - if (!preInstallResult) { - setFailedPreInstall(true) - setDisableBack(false) - return - } - console.log('install') - let installResult = await handleInstall() - console.log('install result', installResult) - if (!installResult) { - setFailedInstall(true) - setDisableBack(false) - return - } - console.log('key import') - let keyImportResult = await handleKeyImportModal() - console.log('key import', keyImportResult) - if (!keyImportResult) { - setFailedKeyImport(true) - setDisableBack(false) - return + const install = async (step: number) => { + console.log('step:', step) + if (!step) { + step = 0 } - console.log('post install') - let postInstallResult = await handlePostInstall() - console.log('post install result', postInstallResult) - if (!postInstallResult) { - setFailedPostInstall(true) - setDisableBack(false) - return + + switch (step) { + case 0: + setFailedPreInstall(false) + console.log('pre-install') + let preInstallResult = await handlePreInstall() + console.log('preinstall result', preInstallResult) + if (!preInstallResult) { + setFailedPreInstall(true) + setDisableBack(false) + return + } + step = 1 + case 1: + setFailedInstall(false) + console.log('install') + let installResult = await handleInstall() + console.log('install result', installResult) + if (!installResult) { + setFailedInstall(true) + setDisableBack(false) + return + } + step += 1 + + case 2: + setFailedKeyImport(false) + console.log('key import') + let keyImportResult = await handleKeyImportModal() + console.log('key import', keyImportResult) + if (!keyImportResult) { + setFailedKeyImport(true) + setDisableBack(false) + return + } + step += 1 + + case 3: + setFailedPostInstall(false) + console.log('post install') + let postInstallResult = await handlePostInstall() + console.log('post install result', postInstallResult) + if (!postInstallResult) { + setFailedPostInstall(true) + setDisableBack(false) + return + } } - setDisableForward(false) + + setDisableForward(false) + setDisableBack(true) } useEffect(() => { - install() + install(0) }, []) @@ -234,7 +279,7 @@ const [keystorePassword, setKeystorePassword] = useState('') - Installing + Installing @@ -246,7 +291,8 @@ const [keystorePassword, setKeystorePassword] = useState('') aria-label="save" color="primary" sx={buttonPreInstallSx} - disabled + disabled={!failedPreInstall} + onClick={failedPreInstall ? () => install(0) : () => {}} > { !failedPreInstall ? successPreInstall ? ('') aria-label="save" color="primary" sx={buttonInstallSx} - disabled + disabled={!failedInstall} + onClick={failedInstall ? () => install(1) : () => {}} > { !failedInstall ? successInstall ? ('') install(2) : () => {}} > { !failedKeyImport ? successKeyImport ? ('') aria-label="save" color="primary" sx={buttonPostInstallSx} - disabled + disabled={!failedPostInstall} + onClick={failedPostInstall ? () => install(3) : () => {}} > { !failedPostInstall ? successPostInstall ? From e1c50a6f05389d13392c3b60c6f8fd66527cef23 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 10 Jun 2022 21:24:40 +0200 Subject: [PATCH 13/17] remote unused imports and dangling comments --- src/react/components/ImportKeystore.tsx | 24 +++++++---------- .../InstallFlow/1-Configuration.tsx | 15 +++-------- .../components/InstallFlow/2-Install.tsx | 27 +++---------------- src/react/pages/Home.tsx | 6 ++--- src/react/pages/MainWizard.tsx | 2 +- src/react/pages/SystemOverview.tsx | 1 - 6 files changed, 20 insertions(+), 55 deletions(-) diff --git a/src/react/components/ImportKeystore.tsx b/src/react/components/ImportKeystore.tsx index 55ea15d..c5a8b3e 100644 --- a/src/react/components/ImportKeystore.tsx +++ b/src/react/components/ImportKeystore.tsx @@ -1,9 +1,8 @@ import { BackgroundLight, } from '../colors'; -import { Button, FormControl, FormControlLabel, Radio, RadioGroup, Typography, Box, Grid, Modal, InputAdornment, TextField, styled, OutlinedInputProps, TextFieldProps } from '@mui/material'; -import React, { FC, ChangeEvent, Dispatch, ReactElement, SetStateAction, useState, MutableRefObject } from 'react'; +import { Button, Typography, Box, Grid, Modal, InputAdornment, TextField, styled } from '@mui/material'; +import React, { FC, ChangeEvent, Dispatch, ReactElement, SetStateAction, MutableRefObject } from 'react'; import { FileCopy, LockOpen } from '@mui/icons-material' -import { Network } from '../types'; import { InstallDetails } from '../../electron/IMultiClientInstaller'; @@ -16,7 +15,6 @@ const ModalStyle = { padding: '20px', borderRadius: '20px', background: BackgroundLight, - // border: '2px solid #000', boxShadow: 24, p: 4, }; @@ -50,22 +48,20 @@ type ImportKeystoreProps = { setKeystorePassword: Dispatch> closing: MutableRefObject<((arg: () => Promise) => void) | undefined> installationDetails: InstallDetails - - -// setInstallationDetails: Dispatch>, -// installationDetails: InstallDetails, } -// console.log(dialog.showOpenDialog({ properties: ['openFile'] })) - - /** * This is the network picker modal component where the user selects the desired network. * - * @param props.handleCloseNetworkModal function to handle closing the network modal - * @param props.setInstallationDetails the currently set installation details + * @param props.isModalOpen the current open state of the modal + * @param props.setModalOpen a function to set the modal open state + * @param props.keyStorePath the path to the directory where the validator keys are stored + * @param props.setKeystorePath set the path to the directory where the validator keys are stored + * @param props.keystorePassword the password to unlock the validator key + * @param props.setKeystorePassword sets the password used to unlock the validator keys + * @param props.closing sets the function that will be called after the modal is closed * @param props.installationDetails the current installation details - * @returns the network picker element to render + * @returns the import validator key modal */ export const ImportKeystore: FC = (props): ReactElement => { diff --git a/src/react/components/InstallFlow/1-Configuration.tsx b/src/react/components/InstallFlow/1-Configuration.tsx index c75bf03..e701189 100644 --- a/src/react/components/InstallFlow/1-Configuration.tsx +++ b/src/react/components/InstallFlow/1-Configuration.tsx @@ -1,12 +1,11 @@ -import React, { ChangeEvent, Dispatch, FC, FormEvent, ReactElement, SetStateAction, useState } from 'react'; -import { Grid, Typography, FormControl, Select, MenuItem, InputLabel, SelectChangeEvent, Modal, Box, Button, TextField, InputAdornment } from '@mui/material'; +import React, { ChangeEvent, Dispatch, FC, ReactElement, SetStateAction, useState } from 'react'; +import { Grid, Typography, FormControl, Select, MenuItem, SelectChangeEvent, Modal, Box, Button, TextField, InputAdornment } from '@mui/material'; import { Folder, Link } from '@mui/icons-material' import StepNavigation from '../StepNavigation'; import styled from '@emotion/styled'; import { ConsensusClients, ExecutionClients, IConsensusClient, IExecutionClient } from '../../constants' import { ConsensusClient, ExecutionClient, InstallDetails } from '../../../electron/IMultiClientInstaller'; import { BackgroundLight, } from '../../colors'; -import { ImportKeystore } from '../ImportKeystore'; type ConfigurationProps = { onStepBack: () => void, @@ -31,7 +30,6 @@ const ModalStyle = { padding: '20px', borderRadius: '20px', background: BackgroundLight, - // border: '2px solid #000', boxShadow: 24, p: 4, }; @@ -85,12 +83,9 @@ const Configuration: FC = (props): ReactElement => { - {/* Consensus Client */} {ExecutionClients.map((c: IExecutionClient) => { @@ -130,7 +122,7 @@ const Configuration: FC = (props): ReactElement => { - + setModalOpen(false)} @@ -205,7 +197,6 @@ const Configuration: FC = (props): ReactElement => { - {/* props.children is the stepper */} {props.children} = (props): ReactElement => { const [successInstall, setSuccessInstall] = useState(false); const [successKeyImport, setSuccessKeyImport] = useState(false); const [successPostInstall, setSuccessPostInstall] = useState(false); - // const timerPreInstall = useRef(); - // const timerInstall = useRef(); - // const timerPostInstall = useRef(); - // const timerWaitBeforeStart = useRef(); const resolveModal = useRef<(arg: () => Promise) => void>(); const [disableBack, setDisableBack] = useState(true) @@ -114,16 +109,6 @@ const Install: FC = (props): ReactElement => { const [isModalOpen, setModalOpen] = useState(false) const [keyStorePath, setKeystorePath] = useState('') const [keystorePassword, setKeystorePassword] = useState('') -// const [resolveModal, setResolveModal] = useState<() => void>(() => {}) - - // useEffect(() => { - // return () => { - // clearTimeout(timerPostInstall.current); - // clearTimeout(timerPreInstall.current); - // clearTimeout(timerInstall.current); - // clearTimeout(timerWaitBeforeStart.current) - // }; - // }, []); const bufferLoad:() => Promise = () => { return new Promise((resolve) => { @@ -131,12 +116,6 @@ const [keystorePassword, setKeystorePassword] = useState('') }) } - const empty: () => Promise = () => { - return new Promise((resolve) => { - resolve(true) - }) - } - const handlePreInstall: () => Promise = () => { return new Promise((resolve) => { if (!loadingPreInstall) { diff --git a/src/react/pages/Home.tsx b/src/react/pages/Home.tsx index 8447a01..6b7f498 100644 --- a/src/react/pages/Home.tsx +++ b/src/react/pages/Home.tsx @@ -1,13 +1,13 @@ import { useNavigate } from "react-router-dom"; import React, { FC, ReactElement, useState, Dispatch, SetStateAction } from "react"; import styled from '@emotion/styled'; -import { Container, Divider, Grid, Modal, Tooltip, Typography } from '@mui/material'; +import { Container, Grid, Modal, Typography } from '@mui/material'; import { Button } from '@mui/material'; import { HomeIcon } from "../components/icons/HomeIcon"; import { NetworkPicker } from "../components/NetworkPicker"; -import { Network, StepSequenceKey } from '../types' +import { StepSequenceKey } from '../types' import VersionFooter from "../components/VersionFooter"; -import { ConsensusClient, ExecutionClient, InstallDetails, OutputLogs } from "../../electron/IMultiClientInstaller"; +import { InstallDetails } from "../../electron/IMultiClientInstaller"; const StyledMuiContainer = styled(Container)` display: flex; diff --git a/src/react/pages/MainWizard.tsx b/src/react/pages/MainWizard.tsx index 5b53cfc..f8b197d 100644 --- a/src/react/pages/MainWizard.tsx +++ b/src/react/pages/MainWizard.tsx @@ -4,7 +4,7 @@ import { Stepper, Step, StepLabel, Grid, Typography } from '@mui/material'; import styled from '@emotion/styled'; import { StepKey } from '../types'; import { stepLabels } from '../constants'; -import { Network, StepSequenceKey } from '../types'; +import { StepSequenceKey } from '../types'; import VersionFooter from '../components/VersionFooter'; import Install from '../components/InstallFlow/2-Install'; import Configuration from '../components/InstallFlow/1-Configuration'; diff --git a/src/react/pages/SystemOverview.tsx b/src/react/pages/SystemOverview.tsx index 6b9ffe9..1b4261f 100644 --- a/src/react/pages/SystemOverview.tsx +++ b/src/react/pages/SystemOverview.tsx @@ -1,6 +1,5 @@ import React, { FC, ReactElement } from "react"; import { Grid, Typography } from '@mui/material'; -import { Network } from "../types"; import styled from '@emotion/styled'; import VersionFooter from "../components/VersionFooter"; import { InstallDetails } from "../../electron/IMultiClientInstaller"; From 98cd2751e4a2f2908efb796c6208fac7bb707db1 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 10 Jun 2022 21:33:25 +0200 Subject: [PATCH 14/17] remove unnecessary logging --- src/react/components/ImportKeystore.tsx | 4 ---- .../components/InstallFlow/1-Configuration.tsx | 2 +- src/react/components/InstallFlow/2-Install.tsx | 15 +-------------- 3 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/react/components/ImportKeystore.tsx b/src/react/components/ImportKeystore.tsx index c5a8b3e..12060ad 100644 --- a/src/react/components/ImportKeystore.tsx +++ b/src/react/components/ImportKeystore.tsx @@ -72,8 +72,6 @@ export const ImportKeystore: FC = (props): ReactElement => props.setKeystorePassword(ev.target.value) } - // console.log('IMPORT resolve: ', props.closing, props.closing.current) - return ( = (props): ReactElement => InputProps={{ startAdornment: { ev.preventDefault() - console.log('clicking keystore') window.electronAPI.invokeShowOpenDialog({ properties: ['openDirectory'] @@ -139,7 +136,6 @@ export const ImportKeystore: FC = (props): ReactElement =>