From fdd97b773b71e1c902aebabb0522fd367b7c2eb5 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Fri, 19 Apr 2024 14:58:43 -0400 Subject: [PATCH 001/455] Editor store + make Zen smarter about errors (stricter error checking, show more errors, human readable) Signed-off-by: Leanid Astrakou --- src/actions/ConnectionActions.ts | 4 +- src/actions/ConnectionHandler.ts | 2 +- src/actions/InstallActions.ts | 12 ++-- src/actions/InstallationHandler.ts | 25 ++++--- src/actions/PlanningActions.ts | 6 +- src/main/index.ts | 41 +++++++++-- src/renderer/components/Home.tsx | 2 +- .../components/common/EditorDialog.tsx | 12 +++- src/renderer/components/common/Stepper.tsx | 9 ++- src/renderer/components/common/Utils.tsx | 20 ++++++ .../configuration-wizard/wizardSlice.ts | 8 ++- .../components/stages/Certificates.tsx | 8 +-- .../components/stages/InitApfAuth.tsx | 62 ++++++++++++----- .../components/stages/LaunchConfig.tsx | 7 +- src/renderer/components/stages/Networking.tsx | 4 +- src/renderer/components/stages/Planning.tsx | 45 +++++++----- .../components/stages/ReviewInstallation.tsx | 7 +- src/renderer/components/stages/Security.tsx | 53 +++++++++++---- .../stages/connection/Connection.tsx | 4 +- .../stages/installation/Installation.tsx | 64 ++++++++++------- src/renderer/preload.ts | 20 +++++- src/services/CheckENV.ts | 17 +++-- src/services/CheckJava.ts | 7 +- src/services/CheckNode.ts | 7 +- src/services/CheckSpace.ts | 9 +-- src/services/FileTransfer.ts | 2 +- src/services/RunScript.ts | 8 +-- src/services/{utils.ts => ServiceUtils.ts} | 3 + src/services/SubmitJcl.ts | 2 +- src/{utils => services}/eventDispatcher.js | 0 src/storage/ConfigurationStore.ts | 64 +++++++---------- src/storage/ConnectionStore.ts | 53 +++++---------- src/storage/DefaultStore.ts | 68 +++++++++++++++++++ src/storage/EditorStore.ts | 55 +++++++++++++++ src/storage/ProgressStore.ts | 21 +++--- 35 files changed, 485 insertions(+), 246 deletions(-) create mode 100644 src/renderer/components/common/Utils.tsx rename src/services/{utils.ts => ServiceUtils.ts} (97%) rename src/{utils => services}/eventDispatcher.js (100%) create mode 100644 src/storage/DefaultStore.ts create mode 100644 src/storage/EditorStore.ts diff --git a/src/actions/ConnectionActions.ts b/src/actions/ConnectionActions.ts index 8b6b601d..b5dfcf1b 100644 --- a/src/actions/ConnectionActions.ts +++ b/src/actions/ConnectionActions.ts @@ -17,14 +17,14 @@ export class ConnectionActions { constructor() { this.mode = 'ftp'; // REVIEW: get from storage when picking strategy? - this.strategy = this.getStartegy(); + this.strategy = this.getStrategy(); } setMode(mode: IIpcConnectionArgs["connectionType"]) { this.mode = mode; } - getStartegy(): FTPConnection | CLIConnection { + getStrategy(): FTPConnection | CLIConnection { switch (this.mode) { case 'ftp': return new FTPConnection(); diff --git a/src/actions/ConnectionHandler.ts b/src/actions/ConnectionHandler.ts index 54eecb9c..df669587 100644 --- a/src/actions/ConnectionHandler.ts +++ b/src/actions/ConnectionHandler.ts @@ -9,7 +9,7 @@ */ import { ConnectionStore } from "../storage/ConnectionStore"; -import { connectFTPServer } from "../services/utils"; +import { connectFTPServer } from "../services/ServiceUtils"; import { IIpcConnectionArgs, IResponse } from '../types/interfaces'; class Connection { diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index 0501181b..3a712716 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -17,14 +17,14 @@ export class InstallActions { constructor() { this.mode = 'ftp'; // REVIEW: get from storage when picking strategy? - this.strategy = this.getStartegy(); + this.strategy = this.getStrategy(); } setMode(mode: IIpcConnectionArgs["connectionType"]) { this.mode = mode; } - getStartegy(): FTPInstallation | CLIInstallation { + getStrategy(): FTPInstallation | CLIInstallation { switch (this.mode) { case 'ftp': return new FTPInstallation(); @@ -47,14 +47,14 @@ export class InstallActions { return this.strategy.runInstallation(connectionArgs, installationArgs, version, zoweConfig, skipDownload); } - initSecurity(connectionArgs: IIpcConnectionArgs, + runInitSecurity(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { - return this.strategy.initSecurity(connectionArgs, installationArgs, zoweConfig); + return this.strategy.runInitSecurity(connectionArgs, installationArgs, zoweConfig); } - apfAuth(connectionArgs: IIpcConnectionArgs, + runApfAuth(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { - return this.strategy.apfAuth(connectionArgs, installationArgs, zoweConfig); + return this.strategy.runApfAuth(connectionArgs, installationArgs, zoweConfig); } } \ No newline at end of file diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 131a4dce..9d2c58cd 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -33,7 +33,9 @@ class Installation { } try { - console.log("uploading yaml..."); + console.log("uploading yaml..." + SMPE_INSTALL ? installationArgs.installationDir : installationArgs.installationDir + '/runtime'); + console.log(SMPE_INSTALL); + console.log(installationArgs) const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? installationArgs.installationDir : installationArgs.installationDir + '/runtime'); ProgressStore.set('installation.uploadYaml', uploadYaml.status); @@ -150,7 +152,7 @@ class Installation { } } - public async apfAuth(connectionArgs: IIpcConnectionArgs, + public async runApfAuth(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise{ console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') @@ -169,13 +171,14 @@ class Installation { } ProgressStore.set('apfAuth.uploadYaml', uploadYaml.status); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + console.log("Check out this install arg! " + installationArgs.installationDir); + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'} && ./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('apfAuth.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} } - public async initSecurity(connectionArgs: IIpcConnectionArgs, + public async runInitSecurity(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise{ console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') @@ -193,7 +196,8 @@ class Installation { return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } ProgressStore.set('initSecurity.uploadYaml', uploadYaml.status); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + console.log("Check out this install arg! " + installationArgs.installationDir); + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'} && ./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('initSecurity.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} @@ -215,6 +219,7 @@ class Installation { return ProgressStore.set('certificate.uploadYaml', false);; } ProgressStore.set('certificate.uploadYaml', uploadYaml.status); + console.log("Check out this install arg! " + installationArgs.installationDir); const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'} && ./zwe init certificate --update-config -c ${installationArgs.installationDir}/zowe.yaml`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); @@ -236,6 +241,7 @@ class Installation { const tempPath = path.join(app.getPath("temp"), "zowe.yaml"); const filePath = path.join(installDir, "zowe.yaml"); await new FileTransfer().upload(connectionArgs, tempPath, filePath, DataType.BINARY) + console.log("Check out this install arg! " + installDir); const script = `chtag -t -c ISO8859-1 ${installDir}/zowe.yaml`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} @@ -269,6 +275,7 @@ export class FTPInstallation extends Installation { const tempPath = path.join(app.getPath("temp"), "zowe.yaml"); const filePath = path.join(installDir, "zowe.yaml"); await new FileTransfer().upload(connectionArgs, tempPath, filePath, DataType.BINARY) + console.log("Check out this install arg! " + installDir); const script = `chtag -t -c ISO8859-1 ${installDir}/zowe.yaml`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} @@ -300,19 +307,21 @@ export class FTPInstallation extends Installation { // TODO: Is this necessary adding "/runtime" ? User already specifies /runtime directory - removes 8 chars from max limit. See Planning.tsx async unpax(connectionArgs: IIpcConnectionArgs, installDir: string) { - const script = `mkdir ${installDir}/runtime;cd ${installDir}/runtime;pax -ppx -rf ../zowe.pax;rm ../zowe.pax`; + const script = `mkdir ${installDir}/runtime;cd ${installDir}/runtime && pax -ppx -rf ../zowe.pax;rm ../zowe.pax`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } async install(connectionArgs: IIpcConnectionArgs, installDir: string) { - const script = `cd ${installDir}/runtime/bin;./zwe install -c ${installDir}/zowe.yaml --allow-overwritten`; + console.log("Check out this install arg! " + installDir); + const script = `cd ${installDir}/runtime/bin && ./zwe install -c ${installDir}/zowe.yaml --allow-overwritten`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } async initMVS(connectionArgs: IIpcConnectionArgs, installDir: string) { - const script = `cd ${installDir}/runtime/bin;./zwe init mvs -c ${installDir}/zowe.yaml --allow-overwritten`; + console.log("Check out this install arg! " + installDir); + const script = `cd ${installDir}/runtime/bin && ./zwe init mvs -c ${installDir}/zowe.yaml --allow-overwritten`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } diff --git a/src/actions/PlanningActions.ts b/src/actions/PlanningActions.ts index 216919ea..e64a7fc1 100644 --- a/src/actions/PlanningActions.ts +++ b/src/actions/PlanningActions.ts @@ -16,7 +16,7 @@ import { IIpcConnectionArgs, IResponse } from '../types/interfaces'; import { ConfigurationStore } from "../storage/ConfigurationStore"; import { parse } from 'yaml'; import * as https from 'https'; -import { checkDirExists, makeDir } from '../services/utils' +import { checkDirExists, makeDir } from '../services/ServiceUtils' export class PlanningActions { @@ -132,8 +132,8 @@ export class PlanningActions { }); } -public static async setConfigByKey(key: string, value: string | Array): Promise { - const status = ConfigurationStore.setConfigByKey(key, value); + public static async setConfigByKeyAndValidate(key: string, value: string | Array): Promise { + const status = ConfigurationStore.setConfigByKeyAndValidate(key, value); return {status, details: ''}; } diff --git a/src/main/index.ts b/src/main/index.ts index 9e76bfee..61c83fd2 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -16,8 +16,9 @@ import { InstallActions } from "../actions/InstallActions"; import { PlanningActions } from "../actions/PlanningActions"; import { IIpcConnectionArgs } from '../types/interfaces'; import { ProgressStore } from "../storage/ProgressStore"; -import { checkDirExists } from '../services/utils'; +import { checkDirExists } from '../services/ServiceUtils'; import { ConfigurationStore } from '../storage/ConfigurationStore'; +import { EditorStore } from '../storage/EditorStore'; declare const MAIN_WINDOW_WEBPACK_ENTRY: string; declare const MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY: string; @@ -34,7 +35,7 @@ const installActions = new InstallActions(); // TODO: Add inline help for inputs, components, etc // TODO: Make separate component for validation button - button / icon / error details // REVIEW: services/FileTransfer.ts SubmitJcl.ts CheckHLQ.ts -// REVIEW: merge all services to utils.ts file? +// REVIEW: merge all services to ServiceUtils.ts file? const createWindow = (): void => { @@ -108,7 +109,37 @@ const createWindow = (): void => { }); ipcMain.handle('set-config-by-key', async (_event, key: string, value) => { - const res = await ConfigurationStore.setConfigByKey(key, value); + const res = await PlanningActions.setConfigByKeyAndValidate(key, value); + return res; + }); + + ipcMain.handle('get-jcl-output', async (event) => { + const res: any = await EditorStore.getJCLOutput(); + return res; + }); + + ipcMain.handle('set-jcl-output', async (event, value) => { + const res: any = await EditorStore.setJCLOutput(value); + return res; + }); + + ipcMain.handle('get-standard-output', async (event) => { + const res: any = await EditorStore.getStandardOutput(); + return res; + }); + + ipcMain.handle('set-standard-output', async (event, value) => { + const res: any = await EditorStore.setStandardOutput(value); + return res; + }); + + ipcMain.handle('get-yaml-output', async (event) => { + const res: any = await EditorStore.getYAMLOutput(); + return res; + }); + + ipcMain.handle('set-yaml-output', async (event, value) => { + const res: any = await EditorStore.setYAMLOutput(value); return res; }); @@ -158,7 +189,7 @@ const createWindow = (): void => { }); ipcMain.handle('init-apf', async (_event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.apfAuth(connectionArgs, installationArgs, zoweConfig); + const res = await installActions.runApfAuth(connectionArgs, installationArgs, zoweConfig); return res; }); @@ -180,7 +211,7 @@ const createWindow = (): void => { }); ipcMain.handle('init-security', async (event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.initSecurity(connectionArgs, installationArgs, zoweConfig); + const res = await installActions.runInitSecurity(connectionArgs, installationArgs, zoweConfig); return res; }); diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index f4d62636..51762d12 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -22,7 +22,7 @@ import { Tooltip } from '@mui/material'; import ArrowCircleRightIcon from '@mui/icons-material/ArrowCircleRight'; import installationImg from '../assets/installation.png' import installationDryImg from '../assets/installation-dry-run.png' -import eventDispatcher from "../../utils/eventDispatcher"; +import eventDispatcher from "../../services/eventDispatcher"; import { selectActiveStepIndex, selectIsSubstep, selectActiveSubStepIndex} from './stages/progress/activeStepSlice'; import { selectConnectionStatus} from './stages/progress/progressSlice'; import { selectActiveStepDate} from './stages/progress/activeStepSlice'; diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index 09b9b5d9..932d8ed9 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -11,11 +11,12 @@ import { useState, useEffect, useRef } from "react"; import { useAppSelector, useAppDispatch } from '../../hooks'; import { Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectYaml, selectOutput, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import Ajv2019 from "ajv/dist/2019" import MonacoEditorComponent from "../common/MonacoEditor"; import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json"; import { parse, stringify } from "yaml"; +import { IResponse } from "../../../types/interfaces"; const test_jcl = ` //MYJOB JOB (ACCT), 'My Job Description', @@ -34,6 +35,7 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC const dispatch = useAppDispatch(); const schema = useAppSelector(selectSchema); const [setupYaml, setSetupYaml] = useState(useAppSelector(selectYaml)); + const [setupOutput, setSetupOutput] = useState(useAppSelector(selectOutput)); const [editorVisible, setEditorVisible] = useState(false); const [editorContent, setEditorContent] = useState(content ? content : ''); const [isSchemaValid, setIsSchemaValid] = useState(true); @@ -42,7 +44,9 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC useEffect(() => { setEditorVisible(isEditorVisible); - if(isEditorVisible) { + /* TODO: 1. All of these should use the Editor store (from ipcRenderer) + 2. Should use an array for the Store to house separate outputs (Security vs Certificates for example) */ + if(isEditorVisible) { if(contentType == 'yaml') { setEditorContent(stringify(setupYaml)); } @@ -50,7 +54,9 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC setEditorContent(test_jcl); } if(contentType == 'output') { - setEditorContent(test_op); + window.electron.ipcRenderer.getStandardOutput().then((res: IResponse) => { + setEditorContent(res) + }); } } }, [isEditorVisible]) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index e128b854..d5a31544 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -26,10 +26,11 @@ import { selectActiveStepIndex, selectActiveSubStepIndex } from '../stages/progr import { alertEmitter } from '../Header'; import EditorDialog from "./EditorDialog"; import savedInstall from '../../assets/saved-install-green.png'; -import eventDispatcher from '../../../utils/eventDispatcher'; +import eventDispatcher from '../../../services/eventDispatcher'; import Warning from '@mui/icons-material/Warning'; import CheckCircle from '@mui/icons-material/CheckCircle'; import Home from '../Home'; +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL } from '../common/Utils'; import '../../styles/Stepper.css'; import { StepIcon } from '@mui/material'; @@ -60,9 +61,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages useSelector(selectLaunchConfigStatus), ] - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; + const [activeStep, setActiveStep] = initialization ? useState(0) : useState(useAppSelector(selectActiveStepIndex)); const [activeSubStep, setActiveSubStep] = initialization ? useState(0) : useState(useAppSelector(selectActiveSubStepIndex)); @@ -231,7 +230,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages {backgroundColor: '#E0E0E0', padding: '10px 20px 25px', position: 'relative', - marginBottom: '-27px', + marginBottom: '-30px', borderTopRightRadius: '7px', borderTopLeftRadius: '7px', boxShadow: 'rgb(0 0 0 / 15%) 0px 6px 4px -1px inset'} : {}}> diff --git a/src/renderer/components/common/Utils.tsx b/src/renderer/components/common/Utils.tsx new file mode 100644 index 00000000..d5407641 --- /dev/null +++ b/src/renderer/components/common/Utils.tsx @@ -0,0 +1,20 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + + +// Note: This doesn't gaurantee command did what it was supposed to do, but rather z/OS Unix (and zwe) didn't throw an error +export const JCL_UNIX_SCRIPT_OK = "Script finished."; + +export const TYPE_YAML = "yaml"; +export const TYPE_JCL = "jcl"; +export const TYPE_OUTPUT = "output"; + +export const DEF_JOB_STATEMENT = `//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A, +// MSGLEVEL=(1,1),MSGCLASS=A`; \ No newline at end of file diff --git a/src/renderer/components/configuration-wizard/wizardSlice.ts b/src/renderer/components/configuration-wizard/wizardSlice.ts index c4af69b3..d325699f 100644 --- a/src/renderer/components/configuration-wizard/wizardSlice.ts +++ b/src/renderer/components/configuration-wizard/wizardSlice.ts @@ -15,6 +15,7 @@ interface WizardState { loading: boolean; nextStepEnabled: boolean; yaml: any; + output: string | undefined; schema: any; zoweCLIVersion: string; } @@ -25,6 +26,7 @@ const initialState: WizardState = { yaml: {}, schema: {}, zoweCLIVersion: '', + output: '', }; export const wizardSlice = createSlice({ @@ -46,11 +48,15 @@ export const wizardSlice = createSlice({ setZoweCLIVersion: (state, action: PayloadAction) => { state.zoweCLIVersion = action.payload; }, + setOutput: (state, action: PayloadAction) => { + state.output = action.payload + } }, }); -export const { setLoading, setYaml, setSchema, setNextStepEnabled, setZoweCLIVersion } = wizardSlice.actions; +export const { setLoading, setYaml, setOutput, setSchema, setNextStepEnabled, setZoweCLIVersion } = wizardSlice.actions; export const selectLoading = (state: RootState) => state.wizard.loading; export const selectYaml = (state: RootState) => state.wizard.yaml; +export const selectOutput = (state: RootState) => state.wizard.output; export const selectSchema = (state: RootState) => state.wizard.schema; export const selectNextStepEnabled = (state: RootState) => state.wizard.nextStepEnabled; export const selectZoweCLIVersion = (state: RootState) => state.wizard.zoweCLIVersion; diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 9263078a..2b607826 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -12,7 +12,7 @@ import { useState, useEffect } from "react"; import { Box, Button } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; import { setSecurityStatus, setInitializationStatus, selectCertificateStatus, setCertificateStatus, selectInitializationStatus } from './progress/progressSlice'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectYaml, selectOutput, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; @@ -55,17 +55,13 @@ const Certificates = () => { const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); - const section = 'certificate'; - const [certificateProgress, setCertificateProgress] = useState({ writeYaml: false, uploadYaml: false, zweInitCertificate: false, }); let timer: any; - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; + const ajv = new Ajv(); ajv.addKeyword("$anchor"); diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 28d7d3d5..7731fbaa 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -11,7 +11,7 @@ import React, {useEffect, useState} from "react"; import { Box, Button, FormControl, TextField, Typography } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, selectSchema, setNextStepEnabled, setLoading } from '../configuration-wizard/wizardSlice'; +import { selectYaml, selectOutput, selectSchema, setNextStepEnabled } from '../configuration-wizard/wizardSlice'; import { selectConnectionArgs } from './connection/connectionSlice'; import { setApfAuthStatus, setInitializationStatus, selectApfAuthStatus, selectInitializationStatus } from './progress/progressSlice'; import { IResponse } from '../../../types/interfaces'; @@ -21,9 +21,11 @@ import EditorDialog from "../common/EditorDialog"; import Ajv from "ajv"; import { selectInstallationArgs } from "./installation/installationSlice"; import { createTheme } from '@mui/material/styles'; +import { alertEmitter } from "../Header"; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; -import { getStageDetails, getSubStageDetails } from "./progress/progressStore"; +import { getStageDetails, getSubStageDetails } from "./progress/progressStore"; +import { JCL_UNIX_SCRIPT_OK } from "../common/Utils"; const InitApfAuth = () => { @@ -41,15 +43,18 @@ const InitApfAuth = () => { const dispatch = useAppDispatch(); const schema = useAppSelector(selectSchema); const yaml = useAppSelector(selectYaml); + const output = useAppSelector(selectOutput); const connectionArgs = useAppSelector(selectConnectionArgs); const setupSchema = schema?.properties?.zowe?.properties?.setup?.properties?.dataset; const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset); + const [setupOutput, setSetupOutput] = useState(''); const [showProgress, toggleProgress] = useState(false); const [init, setInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); const [isFormValid, setIsFormValid] = useState(false); const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); + const [editorContent, setEditorContent] = useState(''); const [apfProgress, setApfProgress] = useState({ writeYaml: false, uploadYaml: false, @@ -59,8 +64,6 @@ const InitApfAuth = () => { const installationArgs = useAppSelector(selectInstallationArgs); let timer: any; - const section = 'dataset'; - const ajv = new Ajv(); ajv.addKeyword("$anchor"); let datasetSchema; @@ -107,23 +110,48 @@ const InitApfAuth = () => { event.preventDefault(); toggleProgress(true); window.electron.ipcRenderer.apfAuthButtonOnClick(connectionArgs, installationArgs, yaml).then((res: IResponse) => { - dispatch(setNextStepEnabled(res.status)); - dispatch(setApfAuthStatus(res.status)); - dispatch(setInitializationStatus(res.status)); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; - clearInterval(timer); - }).catch(() => { + // Some parts of Zen pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { + res.details = { 3: res.details }; + } + if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe init apfAuth + alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); + window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { + toggleEditorVisibility("output"); + }) + toggleProgress(false); + apfAuthProceedActions(false); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; + clearInterval(timer); + } else { + apfAuthProceedActions(res.status); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; + clearInterval(timer); + } + }).catch((err: any) => { clearInterval(timer); - dispatch(setNextStepEnabled(false)); - dispatch(setInitializationStatus(false)); - dispatch(setApfAuthStatus(false)); + apfAuthProceedActions(false); + toggleProgress(false); + // TODO: Test this + //alertEmitter.emit('showAlert', err.toString(), 'error'); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; stages[STAGE_ID].isSkipped = true; - console.warn('zwe init apfauth failed'); + if (typeof err === "string") { + console.warn('zwe init apfauth failed', err); + } else { + console.warn('zwe init apfauth failed', err?.toString()); // toString() throws run-time error on undefined or null + } }); } - const editHLQ = (data: any, isYamlUpdated?: boolean) => { + // True - a proceed, False - blocked + const apfAuthProceedActions = (status: boolean) => { + dispatch(setNextStepEnabled(status)); + dispatch(setApfAuthStatus(status)); + dispatch(setInitializationStatus(status)); + } + + const editHLQ = (data: any, isYamlUpdated?: boolean) => { // TODO: datasetg --> dataset ? let updatedData = init ? (Object.keys(yaml?.zowe.setup.dataset).length > 0 ? yaml?.zowe.setup.dataset : data) : (data ? data : yaml?.zowe.setup.datasetg); setInit(false); @@ -169,7 +197,7 @@ const InitApfAuth = () => { - {`Please review the following dataset setup configuration values before pressing run.\n`} + {`Please review the following dataset setup configuration values before pressing run. If you need to make changes, go back to the previous step.\n`} { {!showProgress ? null : - + {/* we do || false to prevent run-time issue with not filled out data */} diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 1c502ce3..a5a3a116 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -11,7 +11,7 @@ import { useState, useEffect } from "react"; import { Box, Button } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectYaml, selectOutput, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; @@ -436,11 +436,6 @@ const LaunchConfig = () => { const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); -// const section = 'setup'; - - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; const ajv = new Ajv(); ajv.addKeyword("$anchor"); diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index fc0eebf0..b4fcec86 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -653,9 +653,7 @@ const Networking = () => { const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; + const ajv = new Ajv(); ajv.addKeyword("$anchor"); diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index f9fff767..2b630ced 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -30,6 +30,7 @@ import { Checkbox, FormControlLabel } from "@mui/material"; import { setActiveStep } from './progress/activeStepSlice'; import EditorDialog from "../common/EditorDialog"; import { getStageDetails } from "../stages/progress/progressStore"; +import { DEF_JOB_STATEMENT } from "../common/Utils"; // TODO: Our current theoretical cap is 72 (possibly minus a couple for "\n", 70?) But we force more chars in InstallationHandler.tsx // This is all I want to manually test for now. Future work can min/max this harder @@ -1284,6 +1285,12 @@ const Planning = () => { }) useEffect(() => { + if (jobStatementValue === undefined || jobStatementValue === null) { + const initValue = DEF_JOB_STATEMENT; + dispatch(setConnectionArgs({...connectionArgs, jobStatement: initValue})); + onJobStatementChange(initValue); + } + dispatch(setNextStepEnabled(false)); // FIXME: Add a popup warning in case failed to get config files // FIXME: Save yaml and schema on disk to not to pull it each time? @@ -1388,8 +1395,9 @@ const Planning = () => { setContentType('output'); if (!res.status) { // Failure case dispatch(setJobStatementValidMsg(res.details)); - console.warn('Failed to verify job statement'); - alertEmitter.emit('showAlert', 'Failed to verify job statement', 'error'); + console.warn('Failed to verify job statement', res.details); + // TODO: This more detailed reason, for why Job submission failed, may be large and should be opened in an Editor + alertEmitter.emit('showAlert', 'Failed to verify job statement ' + res.details, 'error'); } else { // Success JCL case dispatch(setJobStatementValid(true)); alertEmitter.emit('hideAlert'); @@ -1501,6 +1509,7 @@ const Planning = () => { dispatch(setPlanningStatus(true)); setStep(2); } else { + dispatch(setPlanningStatus(false)); alertEmitter.emit('showAlert', details.error, 'error'); } }) @@ -1606,7 +1615,7 @@ Please customize the job statement below to match your system requirements. }} > - {`Now let's define some properties like z/OS Unix locations, identifiers, and z/OSMF details (optional).`} + {`Now let's define some properties like z/OS Unix locations, identifiers, and (optionally) z/OSMF details.`}
@@ -1622,7 +1631,7 @@ Please customize the job statement below to match your system requirements. inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.runtimeDirectory", e.target.value, "installationDir"); - window.electron.ipcRenderer.setConfigByKey('zowe.runtimeDirectory', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.runtimeDirectory', e.target.value).then((res: any) => { // console.log('updated zowe.runtimeDirectory') }) }} @@ -1642,7 +1651,7 @@ Please customize the job statement below to match your system requirements. inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.workspaceDirectory", e.target.value, "workspaceDir"); - window.electron.ipcRenderer.setConfigByKey('zowe.workspaceDirectory', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.workspaceDirectory', e.target.value).then((res: any) => { // console.log('updated zowe.workspaceDirectory') }) }} @@ -1662,7 +1671,7 @@ Please customize the job statement below to match your system requirements. inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.logDirectory", e.target.value, "logDir"); - window.electron.ipcRenderer.setConfigByKey('zowe.logDirectory', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.logDirectory', e.target.value).then((res: any) => { // console.log('updated zowe.logDirectory') }) }} @@ -1682,7 +1691,7 @@ Please customize the job statement below to match your system requirements. inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.extensionDirectory", e.target.value, "extensionDir"); - window.electron.ipcRenderer.setConfigByKey('zowe.extensionDirectory', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.extensionDirectory', e.target.value).then((res: any) => { // console.log('updated zowe.extensionDirectory') }) }} @@ -1701,7 +1710,7 @@ Please customize the job statement below to match your system requirements. value={localYaml?.zowe?.rbacProfileIdentifier || installationArgs.rbacProfile} onChange={(e) => { formChangeHandler("zowe.rbacProfileIdentifier", e.target.value, "rbacProfile" ); - window.electron.ipcRenderer.setConfigByKey('zowe.rbacProfileIdentifier', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.rbacProfileIdentifier', e.target.value).then((res: any) => { // console.log('updated zowe.rbacProfileIdentifier') }) }} @@ -1722,7 +1731,7 @@ Please customize the job statement below to match your system requirements. value={localYaml?.zowe?.job?.name || installationArgs.jobName} onChange={(e) => { formChangeHandler("zowe.job.name", e.target.value, "jobName"); - window.electron.ipcRenderer.setConfigByKey('zowe.job.name', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.job.name', e.target.value).then((res: any) => { // console.log('updated zowe.job.name') }) }} @@ -1741,7 +1750,7 @@ Please customize the job statement below to match your system requirements. value={localYaml?.zowe?.job?.prefix || installationArgs.jobPrefix} onChange={(e) => { formChangeHandler("zowe.job.prefix", e.target.value, "jobName"); - window.electron.ipcRenderer.setConfigByKey('zowe.job.prefix', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.job.prefix', e.target.value).then((res: any) => { // console.log('updated zowe.job.prefi') }) }} @@ -1760,7 +1769,7 @@ Please customize the job statement below to match your system requirements. value={localYaml?.zowe?.cookieIdentifier || installationArgs.cookieId} onChange={(e) => { formChangeHandler("zowe.cookieIdentifier", e.target.value, "cookieId"); - window.electron.ipcRenderer.setConfigByKey('zowe.cookieIdentifier', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.cookieIdentifier', e.target.value).then((res: any) => { // console.log('updated zowe.cookieIdentifier') }) }} @@ -1774,12 +1783,12 @@ Please customize the job statement below to match your system requirements. id="java-home-input" required style={{marginLeft: 0}} - label="Java location" + label="Java Location" variant="standard" value={localYaml?.java?.home || installationArgs.javaHome} onChange={(e) => { formChangeHandler("java.home", e.target.value, "javaHome"); - window.electron.ipcRenderer.setConfigByKey('java.home', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('java.home', e.target.value).then((res: any) => { // console.log('updated zowe.java.home') }) }} @@ -1793,12 +1802,12 @@ Please customize the job statement below to match your system requirements. id="node-home-input" required style={{marginLeft: 0}} - label="Node.js location" + label="Node.js Location" variant="standard" value={localYaml?.node?.home || installationArgs.nodeHome} onChange={(e) => { formChangeHandler("node.home", e.target.value, "nodeHome"); - window.electron.ipcRenderer.setConfigByKey('node.home', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('node.home', e.target.value).then((res: any) => { // console.log('updated zowe.node.home') }) }} @@ -1835,7 +1844,7 @@ Please customize the job statement below to match your system requirements. value={localYaml?.zOSMF?.host || installationArgs.zosmfHost} onChange={(e) => { formChangeHandler("zOSMF.host", e.target.value, "zosmfHost"); - window.electron.ipcRenderer.setConfigByKey('zOSMF.host', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zOSMF.host', e.target.value).then((res: any) => { // console.log('updated zowe.zOSMF.host') }) }} @@ -1855,7 +1864,7 @@ Please customize the job statement below to match your system requirements. value={localYaml?.zOSMF?.port || installationArgs.zosmfPort} onChange={(e) => { formChangeHandler("zOSMF.port", e.target.value, "zosmfPort"); - window.electron.ipcRenderer.setConfigByKey('zOSMF.port', Number(e.target.value)).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zOSMF.port', Number(e.target.value)).then((res: any) => { // console.log('updated zowe.zOSMF.port') }) }} @@ -1876,7 +1885,7 @@ Please customize the job statement below to match your system requirements. value={localYaml?.zOSMF?.applId || installationArgs.zosmfApplId} onChange={(e) => { formChangeHandler("zOSMF.applId", e.target.value, "zosmfApplId"); - window.electron.ipcRenderer.setConfigByKey('zOSMF.applId', e.target.value).then((res: any) => { + window.electron.ipcRenderer.setConfigByKeyAndValidate('zOSMF.applId', e.target.value).then((res: any) => { // console.log('updated zowe.zOSMF.applId') }) }} diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index 33417e13..96013f4c 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -17,13 +17,14 @@ import ContainerCard from '../common/ContainerCard'; import {stages} from "../configuration-wizard/Wizard"; import { selectConnectionArgs } from './connection/connectionSlice'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import eventDispatcher from '../../../utils/eventDispatcher'; +import eventDispatcher from '../../../services/eventDispatcher'; import EditorDialog from "../common/EditorDialog"; import { createTheme } from '@mui/material/styles'; import { selectConnectionStatus, selectPlanningStatus, selectInstallationTypeStatus, selectInitializationStatus, selectDatasetInstallationStatus, selectNetworkingStatus, selectApfAuthStatus, selectSecurityStatus, selectCertificateStatus, selectLaunchConfigStatus, setReviewStatus } from './progress/progressSlice'; import { setActiveStep } from './progress/activeStepSlice'; import { setNextStepEnabled } from '../configuration-wizard/wizardSlice'; import { getStageDetails, getSubStageDetails } from "./progress/progressStore"; +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL } from '../common/Utils'; import '../../styles/ReviewInstallation.css'; @@ -59,9 +60,7 @@ const ReviewInstallation = () => { useSelector(selectLaunchConfigStatus), ]; - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; + useEffect(() => { diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 014fdb50..ae0eb087 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -11,7 +11,7 @@ import { useState, useEffect } from "react"; import { Box, Button } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectYaml, selectOutput, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import { setSecurityStatus, setInitializationStatus, selectSecurityStatus, selectInitializationStatus } from './progress/progressSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; @@ -23,10 +23,12 @@ import { IResponse } from "../../../types/interfaces"; import ProgressCard from "../common/ProgressCard"; import React from "react"; import { createTheme } from '@mui/material/styles'; +import { alertEmitter } from "../Header"; import progressSlice from "./progress/progressSlice"; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "./progress/progressStore"; +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK } from '../common/Utils'; const Security = () => { const theme = createTheme(); @@ -60,9 +62,7 @@ const Security = () => { const installationArgs = useAppSelector(selectInstallationArgs); const connectionArgs = useAppSelector(selectConnectionArgs); - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; + const ajv = new Ajv(); let securitySchema; @@ -109,22 +109,47 @@ const Security = () => { event.preventDefault(); toggleProgress(true); window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details.config ?? yaml).then((res: IResponse) => { - dispatch(setNextStepEnabled(res.status)); - dispatch(setSecurityStatus(res.status)); - dispatch(setInitializationStatus(res.status)); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; - clearInterval(timer); - }).catch(() => { + // Some parts of Zen pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { + res.details = { 3: res.details }; + } + if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe init security + alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); + window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { + toggleEditorVisibility("output"); + }) + toggleProgress(false); + securityProceedActions(false); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; + clearInterval(timer); + } else { + securityProceedActions(res.status); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; + clearInterval(timer); + } + }).catch((err: any) => { + // TODO: Test this + //alertEmitter.emit('showAlert', err.toString(), 'error'); + toggleProgress(false); clearInterval(timer); - dispatch(setNextStepEnabled(false)); - dispatch(setSecurityStatus(false)); - dispatch(setInitializationStatus(false)); + securityProceedActions(false); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; stages[STAGE_ID].isSkipped = true; - console.warn('zwe init security failed'); + if (typeof err === "string") { + console.warn('zwe init security failed', err); + } else { + console.warn('zwe init security failed', err?.toString()); // toString() throws run-time error on undefined or null + } }); } + // True - a proceed, False - blocked + const securityProceedActions = (status: boolean) => { + dispatch(setNextStepEnabled(status)); + dispatch(setSecurityStatus(status)); + dispatch(setInitializationStatus(status)); + } + const handleFormChange = (data: any) => { if(!initializeForm) { return; diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index ea8453fd..c2710cab 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -227,7 +227,7 @@ const FTPConnectionForm = () => { setIsFtpConnection(e.target.checked); }} />} - label="(Recommended, optional) Use FTP with TLS." + label="(Recommended) Use FTP with TLS." labelPlacement="start" /> @@ -288,7 +288,7 @@ const FTPConnectionForm = () => { }} /> } - label="Accept all certificates." + label="(Not recommended) Accept all certificates." labelPlacement="start" /> diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index e191e08a..fcabfe5d 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -26,6 +26,7 @@ import { createTheme } from '@mui/material/styles'; import {stages} from "../../configuration-wizard/Wizard"; import { setActiveStep } from "../progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../progress/progressStore"; +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK } from '../../common/Utils'; const Installation = () => { @@ -40,6 +41,7 @@ const Installation = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command + // TODO: Why are there two sets of stageId/STAGE_ID's? const stageId = 3; const subStageId = 0; const dispatch = useAppDispatch(); @@ -67,13 +69,6 @@ const Installation = () => { const version = useAppSelector(selectZoweVersion); let timer: any; - const section = 'dataset'; - // const initConfig = getConfiguration(section); - - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; - const ajv = new Ajv(); ajv.addKeyword("$anchor"); let datasetSchema; @@ -122,40 +117,57 @@ const Installation = () => { // FIXME: runtime dir is hardcoded, fix there and in InstallActions.ts - Unpax and Install functions Promise.all([ - window.electron.ipcRenderer.setConfigByKey('zowe.setup.dataset', setupYaml), + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.setup.dataset', setupYaml), ]).then(async () => { + dispatch(setLoading(false)); if(installationType === 'smpe'){ - dispatch(setNextStepEnabled(true)); - dispatch(setDatasetInstallationStatus(true)); - dispatch(setInitializationStatus(true)); - dispatch(setLoading(false)); + installProceedActions(true); } else { setYaml(window.electron.ipcRenderer.getConfig()); toggleProgress(true); - dispatch(setLoading(false)); + const config = (await window.electron.ipcRenderer.getConfig()).details.config ?? yaml; window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml, skipDownload ?? false).then((res: IResponse) => { - if(!res.status){ //errors during runInstallation() - alertEmitter.emit('showAlert', res.details, 'error'); + // Some parts of Zen pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { + res.details = { 3: res.details }; } - dispatch(setNextStepEnabled(res.status)); - dispatch(setDatasetInstallationStatus(res.status)); - dispatch(setDatasetInstallationStatus(true)); - dispatch(setInitializationStatus(true)); - clearInterval(timer); - }).catch(() => { + if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe install + alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); + window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { + toggleEditorVisibility("output"); + }) + toggleProgress(false); + installProceedActions(false); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; + clearInterval(timer); + } else { + installProceedActions(res.status); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; + clearInterval(timer); + } + }).catch((err: any) => { clearInterval(timer); - dispatch(setNextStepEnabled(false)); - dispatch(setInitializationStatus(false)); - dispatch(setDatasetInstallationStatus(false)); + installProceedActions(false); stages[stageId].subStages[subStageId].isSkipped = true; stages[stageId].isSkipped = true; - console.warn('Installation failed'); + if (typeof err === "string") { + console.warn('Installation failed', err); + } else { + console.warn('Installation failed', err?.toString()); // toString() throws run-time error on undefined or null + } }); } }) } + // True - a proceed, False - blocked + const installProceedActions = (status: boolean) => { + dispatch(setNextStepEnabled(status)); + dispatch(setDatasetInstallationStatus(status)); + dispatch(setInitializationStatus(status)); + } + const debouncedChange = useCallback( debounce((state: any)=>{handleFormChange(state)}, 1000), [] @@ -197,7 +209,7 @@ const Installation = () => { {editorVisible && } - {installationArgs.installationType === 'smpe' ? `Please input the corresponding values used during the SMPE installation process.` : `Ready to download Zowe ${version} and deploy it to the ${installationArgs.installationDir}\nThen we will install MVS data sets, please provide HLQ below\n`} + {installationArgs.installationType === 'smpe' ? `Please input the corresponding values used during the SMPE installation process.` : `Ready to download Zowe ${version} and deploy it to the ${installationArgs.installationDir}\nThen we will install the MVS data sets, please provide the high-level qualifiers below\n`} dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details.config ?? yaml))}> diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 5202db44..a33c0737 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -34,9 +34,27 @@ contextBridge.exposeInMainWorld('electron', { setConfig(completeZoweYamlObj: any) { return ipcRenderer.invoke("set-config", completeZoweYamlObj); }, - setConfigByKey(key: string, value: any) { + setConfigByKeyAndValidate(key: string, value: any) { return ipcRenderer.invoke("set-config-by-key", key, value); }, + getJCLOutput() { + return ipcRenderer.invoke("get-jcl-output"); + }, + setJCLOutput(value: any) { + return ipcRenderer.invoke("set-jcl-output", value); + }, + getYAMLOutput() { + return ipcRenderer.invoke("get-yaml-output"); + }, + setYAMLOutput(value: any) { + return ipcRenderer.invoke("set-yaml-output", value); + }, + getStandardOutput() { + return ipcRenderer.invoke("get-standard-output"); + }, + setStandardOutput(value: any) { + return ipcRenderer.invoke("set-standard-output", value); + }, setSchema(schema: any) { return ipcRenderer.invoke("set-schema", schema); }, diff --git a/src/services/CheckENV.ts b/src/services/CheckENV.ts index a24156ff..eb6a00da 100644 --- a/src/services/CheckENV.ts +++ b/src/services/CheckENV.ts @@ -10,23 +10,26 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import {startBPXBATCHAndShellSession} from "./utils"; +import {startBPXBATCHAndShellSession} from "./ServiceUtils"; export class CheckENV { public async run(connectionArgs: IIpcConnectionArgs) { const jcl = `${connectionArgs.jobStatement} ${startBPXBATCHAndShellSession("ZNCHKNV")} -echo $JAVA_HOME; +echo $JAVA_HOME && echo $NODE_HOME; /* ` const resp: IJobResults = await submitJcl(connectionArgs, jcl, ["STDOUT", "STDERR"]); - // REVIEW: Need to find better parsing option - if (resp.rc === 0 && resp.jobOutput && resp.jobOutput["3"]) { - return {status: true, details: resp.jobOutput["3"]}; - } else { - return {status: false, details: `${resp.rc}: ${resp.jobOutput}`}; + // REVIEW: Need to find better parsing option. For some responses, relevant info is in 4th element (3) or some in 3rd element (2) + if (resp.rc === 0 && resp.jobOutput) { // Success case + if (resp.jobOutput["3"]) { + return {status: true, details: resp.jobOutput["3"]}; + } + } else if (resp.jobOutput["2"]) { // Failure case, but do we have relevant info? + return {status: false, details: resp.jobOutput["2"]}; } + return {status: false, details: `${resp.rc}: ${resp.jobOutput}`}; // Failure case, just send whatever you can I suppose } } diff --git a/src/services/CheckJava.ts b/src/services/CheckJava.ts index cbfd8639..8e1ce497 100644 --- a/src/services/CheckJava.ts +++ b/src/services/CheckJava.ts @@ -8,9 +8,10 @@ * Copyright Contributors to the Zowe Project. */ +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import {startBPXBATCHAndShellSession} from "./utils"; +import { startBPXBATCHAndShellSession } from "./ServiceUtils"; export class CheckJava { @@ -18,8 +19,8 @@ export class CheckJava { const jcl = `${config.jobStatement} ${startBPXBATCHAndShellSession("ZNCHKJV")} -${java}/bin/java -version; -echo "Script finished." +${java}/bin/java -version && +echo "${JCL_UNIX_SCRIPT_OK}" /* ` const resp: IJobResults = await submitJcl(config, jcl, ["STDOUT", "STDERR"]) diff --git a/src/services/CheckNode.ts b/src/services/CheckNode.ts index 86fcbd78..5fffffd5 100644 --- a/src/services/CheckNode.ts +++ b/src/services/CheckNode.ts @@ -10,7 +10,8 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import { startBPXBATCHAndShellSession } from "./utils"; +import { startBPXBATCHAndShellSession } from "./ServiceUtils"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; export class CheckNode { @@ -18,8 +19,8 @@ export class CheckNode { const jcl = `${config.jobStatement} ${startBPXBATCHAndShellSession("ZNCKNOD")} -${node}/bin/node -v; -echo "Script finished." +${node}/bin/node -v && +echo "${JCL_UNIX_SCRIPT_OK}" /* ` const resp: IJobResults = await submitJcl(config, jcl, ["STDOUT", "STDERR"]) diff --git a/src/services/CheckSpace.ts b/src/services/CheckSpace.ts index a7b1b848..f51f9303 100644 --- a/src/services/CheckSpace.ts +++ b/src/services/CheckSpace.ts @@ -10,7 +10,8 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import { startBPXBATCHAndShellSession } from "./utils"; +import { startBPXBATCHAndShellSession } from "./ServiceUtils"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; export class CheckSpace { @@ -18,9 +19,9 @@ export class CheckSpace { const jcl = `${config.jobStatement} ${startBPXBATCHAndShellSession("ZNCHKSP")} -echo "SPACE in MB"; -df -m ${dir}; -echo "Script finished." +echo "SPACE in MB" && +df -m ${dir} && +echo "${JCL_UNIX_SCRIPT_OK}" /* ` const resp: IJobResults = await submitJcl(config, jcl, ["STDOUT", "STDERR"]) diff --git a/src/services/FileTransfer.ts b/src/services/FileTransfer.ts index a3ca4b5b..f76f5c3a 100644 --- a/src/services/FileTransfer.ts +++ b/src/services/FileTransfer.ts @@ -9,7 +9,7 @@ */ import {IncomingMessage} from "http"; -import {connectFTPServer} from "./utils"; +import {connectFTPServer} from "./ServiceUtils"; import {IIpcConnectionArgs, IResponse} from "../types/interfaces"; import * as fs from 'fs'; diff --git a/src/services/RunScript.ts b/src/services/RunScript.ts index e5cc9210..ff31530f 100644 --- a/src/services/RunScript.ts +++ b/src/services/RunScript.ts @@ -10,17 +10,17 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import {parseUnixScriptByNumOfChars, startBPXBATCHAndShellSession} from "./utils"; +import { parseUnixScriptByNumOfChars, startBPXBATCHAndShellSession } from "./ServiceUtils"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; export class Script { public async run(config: IIpcConnectionArgs, script: string) { - // TODO: Shouldn't we change ";" to "&&" to stop on first fail instead of keep going? const jcl = `${config.jobStatement} ${startBPXBATCHAndShellSession("ZNSCRPT")} -${parseUnixScriptByNumOfChars(script)}; -echo "Script finished." +${parseUnixScriptByNumOfChars(script)} && +echo "${JCL_UNIX_SCRIPT_OK}" /* ` console.log(`JOB: ${jcl}`) const resp: IJobResults = await submitJcl(config, jcl, ["STDOUT", "STDERR"]) diff --git a/src/services/utils.ts b/src/services/ServiceUtils.ts similarity index 97% rename from src/services/utils.ts rename to src/services/ServiceUtils.ts index 28511bb1..d979e441 100644 --- a/src/services/utils.ts +++ b/src/services/ServiceUtils.ts @@ -13,6 +13,8 @@ import Header from "../renderer/components/Header" import { AlertColor } from "@mui/material/Alert"; import zos from 'zos-node-accessor'; +// Note: This file is not usable by the Renderer + export const JCL_UNIX_SCRIPT_CHARS = 70; export const JCL_JOBNAME_DEFAULT = "ZENJOB"; @@ -34,6 +36,7 @@ export async function checkDirExists(config: IIpcConnectionArgs, dir: string): P const list = await client.listDataset(dir); return !!list; } catch (error) { + console.warn(error); return false; } finally { client.close(); diff --git a/src/services/SubmitJcl.ts b/src/services/SubmitJcl.ts index ab44bd14..abd787f3 100644 --- a/src/services/SubmitJcl.ts +++ b/src/services/SubmitJcl.ts @@ -8,7 +8,7 @@ * Copyright Contributors to the Zowe Project. */ -import {connectFTPServer} from "./utils"; +import {connectFTPServer} from "./ServiceUtils"; import {IIpcConnectionArgs, IJobResults, JobOutput} from "../types/interfaces"; export function submitJcl(config: IIpcConnectionArgs, jcl: string, returnDDs: string[]): Promise { diff --git a/src/utils/eventDispatcher.js b/src/services/eventDispatcher.js similarity index 100% rename from src/utils/eventDispatcher.js rename to src/services/eventDispatcher.js diff --git a/src/storage/ConfigurationStore.ts b/src/storage/ConfigurationStore.ts index 8a2791ae..194f672b 100644 --- a/src/storage/ConfigurationStore.ts +++ b/src/storage/ConfigurationStore.ts @@ -9,70 +9,52 @@ */ import Store from 'electron-store'; +import { DefaultStore } from './DefaultStore'; -const store = new Store({cwd: 'zen-configuration-store'}); +const STORE_NAME = 'zen-configuration-store'; +const KEY_SCHEMA = 'schema' +const KEY_CONFIG = 'config' +const STORE_DEFAULT = {config: {}, schema: {}}; -export class ConfigurationStore { - static schema: any = {}; +export class ConfigurationStore extends DefaultStore { - private static validateWithSchema(key: string): boolean { - const keys = key.split('.'); - const schema = store.get('schema') as any; - if(schema && schema.properties){ - let schemaPart: any = schema?.properties || undefined; - for (const key of keys) { - if (schemaPart != undefined && !Object.prototype.hasOwnProperty.call(schemaPart, key)) { - return false; - } - if(schemaPart[key].properties){ - schemaPart = schemaPart[key]?.properties || undefined; - } else { - return true; - } - } - return true; - } - return true; + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); } - public static setSchema(schema: any) { - store.set('schema', schema); + public static setSchema(value: any): boolean { + return this.set(KEY_SCHEMA, value); } public static getSchema(): any { - return store.get('schema'); + return this.get(KEY_SCHEMA); } public static setConfig(value: any) { - store.set('config', value); + return this.set(KEY_CONFIG, value); } - public static getConfig() { - return store.get(`config`); + public static getConfig(): any { + return this.get(KEY_CONFIG); } public static getConfigByKey(key: string): any { - return store.get(`config.${key}`); - } - - public static getAll(): any { - return store.store; + return this.get(`${KEY_CONFIG}.${key}`); } - public static setConfigByKey(key: string, value: string | Array): boolean { - if (this.validateWithSchema(key)) { - store.set(`config.${key}`, value); - return true; + public static setConfigByKeyAndValidate(key: string, value: string | Array, schema?: any): boolean { + if (!schema) { + schema = this.getSchema(); } - console.warn(`failed validate against schema config.${key}`); - return false; + let schemaPart: any = schema?.properties; + return this.setAndValidate(key, value, schemaPart); } public static deleteConfigByKey(key: any): void { - store.delete(`config.${key}`); + this.delete(`${KEY_CONFIG}.${key}`); } public static deleteAll(): void { - store.store = {config: {}, schema: {}}; + this.getStore().store = STORE_DEFAULT; } -} +} \ No newline at end of file diff --git a/src/storage/ConnectionStore.ts b/src/storage/ConnectionStore.ts index dce5995d..143cb0d5 100644 --- a/src/storage/ConnectionStore.ts +++ b/src/storage/ConnectionStore.ts @@ -9,8 +9,11 @@ */ import Store from 'electron-store'; +import { DefaultStore } from './DefaultStore'; +import { DEF_JOB_STATEMENT } from '../renderer/components/common/Utils'; -const storeSchema = { +const STORE_NAME = 'zen-connection-store'; +const STORE_SCHEMA = { "connection-type": { "type": "string" }, @@ -66,7 +69,7 @@ const storeSchema = { } } as const; -const storeDefault = { +export const STORE_DEFAULT = { "connection-type": "ftp", "zowe-cli-version": "", "ftp-details": { @@ -80,52 +83,28 @@ const storeDefault = { "maxVersion": "TLSv1.3", "minVersion": "TLSv1.2" }, - "jobStatement": `//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A, -// MSGLEVEL=(1,1),MSGCLASS=A` + "jobStatement": DEF_JOB_STATEMENT }, "cli-details": { "profile": "" } }; -const validateWithSchema = (key: string): boolean => { - const keys = key.split('.'); - let schemaPart: any = storeSchema; - for (const key of keys) { - if (!Object.prototype.hasOwnProperty.call(schemaPart, key)) { - return false; - } - schemaPart = schemaPart[key].properties; - } - return true; -} - -const store = new Store({cwd: 'zen-connection-store', schema: storeSchema}); -store.set({...storeDefault, ...store.store}); +const store = new Store({cwd: 'zen-connection-store', schema: STORE_SCHEMA}); +store.set({...STORE_DEFAULT, ...store.store}); -export class ConnectionStore { +export class ConnectionStore extends DefaultStore { - public static get(key: string): any { - return store.get(key); + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); } - public static getAll(): any { - return store.store; - } - - public static set(key: string, value: any): boolean { - if (validateWithSchema(key)) { - store.set(key, value); - return true; - } - return false; - } - - public static delete(key: any): void { - store.delete(key); + public static setAndValidate(key: string, value: any, schema?: any): boolean { + return super.setAndValidate(key, value, schema || STORE_SCHEMA); } public static deleteAll(): void { - store.store = storeDefault; + this.getStore().store = STORE_DEFAULT; } -} + +} \ No newline at end of file diff --git a/src/storage/DefaultStore.ts b/src/storage/DefaultStore.ts new file mode 100644 index 00000000..1ad40e8d --- /dev/null +++ b/src/storage/DefaultStore.ts @@ -0,0 +1,68 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import Store from 'electron-store'; + +const STORE_NAME = 'zen-default-store'; + +// Note: This default class is for other Stores to inherit (this is not a Store for "defaults") +export class DefaultStore { + + // This method is intended to be overridden by subclasses + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); + } + + public static validateWithSchema(key: string, schema: any): boolean { + const keys = key.split('.'); + let schemaPart = schema; + for (const key of keys) { + if (!Object.prototype.hasOwnProperty.call(schemaPart, key)) { + return false; + } + schemaPart = schemaPart[key].properties; + } + return true; + } + + public static get(key: string): any { + return this.getStore().get(key); + } + + public static getAll(): any { + return this.getStore().store; + } + + public static set(key: string, value: any): boolean { + try { + this.getStore().set(key, value); + return true; + } catch (err) { + console.warn(`failed to add ${key} error: `, err); + return false; + } + } + + public static setAndValidate(key: string, value: any, schema: any): boolean { + if (this.validateWithSchema(key, schema)) { + return this.set(key, value); + } + console.warn(`failed validate against schema config.${key}`); + return false; + } + + public static delete(key: any): void { + this.getStore().delete(key); + } + + public static deleteAll(): void { + this.getStore().clear(); + } +} \ No newline at end of file diff --git a/src/storage/EditorStore.ts b/src/storage/EditorStore.ts new file mode 100644 index 00000000..681f333b --- /dev/null +++ b/src/storage/EditorStore.ts @@ -0,0 +1,55 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import Store from 'electron-store'; +import { DefaultStore } from './DefaultStore'; +import { TYPE_JCL, TYPE_OUTPUT, TYPE_YAML } from '../renderer/components/common/Utils'; + +const STORE_DEFAULT = { + [TYPE_OUTPUT]: "", + [TYPE_JCL]: "", + [TYPE_YAML]: "" +}; +const STORE_NAME = 'zen-editor-store'; + +export class EditorStore extends DefaultStore { + + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); + } + + public static deleteAll(): void { + this.getStore().store = STORE_DEFAULT; + } + + public static getJCLOutput(): any { + return this.get(TYPE_JCL); + } + + public static setJCLOutput(output: string): boolean { + return this.set(TYPE_JCL, output); + } + + public static getStandardOutput(): any { + return this.get(TYPE_OUTPUT); + } + + public static setStandardOutput(output: string): boolean { + return this.set(TYPE_OUTPUT, output); + } + + public static getYAMLOutput(): any { + return this.get(TYPE_YAML); + } + + public static setYAMLOutput(output: string): boolean { + return this.set(TYPE_YAML, output); + } +} \ No newline at end of file diff --git a/src/storage/ProgressStore.ts b/src/storage/ProgressStore.ts index d73a8278..e83a234b 100644 --- a/src/storage/ProgressStore.ts +++ b/src/storage/ProgressStore.ts @@ -9,10 +9,11 @@ */ import Store from 'electron-store'; +import { DefaultStore } from './DefaultStore'; // TODO: Store overall progress and restore up to last successful step -const storeDefault = { +const STORE_DEFAULT = { "installation": { "uploadYaml": false, "download": false, @@ -37,21 +38,15 @@ const storeDefault = { "zweInitCertificate": false, } }; +const STORE_NAME = 'zen-progress-store'; -const store = new Store({cwd: 'zen-progress-store'}); -store.set(storeDefault); +export class ProgressStore extends DefaultStore { -export class ProgressStore { - - public static getAll(): any { - return store.store; - } - - public static set(key: string, value: string | boolean) { - store.set(key, value); + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); } public static deleteAll(): void { - store.store = storeDefault; + this.getStore().store = STORE_DEFAULT; } -} +} \ No newline at end of file From ce9aafec39e50a636cd771ab1c18b1fe4adcf7f8 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Mon, 22 Apr 2024 09:18:27 -0400 Subject: [PATCH 002/455] Fix build errors Signed-off-by: Leanid Astrakou --- src/renderer/components/stages/Certificates.tsx | 1 + src/renderer/components/stages/LaunchConfig.tsx | 1 + src/renderer/components/stages/Networking.tsx | 1 + 3 files changed, 3 insertions(+) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 2b607826..8e212637 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -26,6 +26,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "./progress/progressStore"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT } from "../common/Utils"; const Certificates = () => { diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index a5a3a116..ff317bab 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -21,6 +21,7 @@ import { getStageDetails, getSubStageDetails } from "./progress/progressStore"; import { stages } from "../configuration-wizard/Wizard"; import { selectInitializationStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT } from "../common/Utils"; const LaunchConfig = () => { diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index b4fcec86..4113e5cc 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -20,6 +20,7 @@ import { getStageDetails, getSubStageDetails } from "./progress/progressStore"; import { stages } from "../configuration-wizard/Wizard"; import { selectInitializationStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT } from "../common/Utils"; function PatternPropertiesForm(props: any){ const [elements, setElements] = useState([]); From 11ed3a58886be39856cfb09b3574a1b086a34e58 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 14 May 2024 08:43:04 -0400 Subject: [PATCH 003/455] Updated job statement logic Signed-off-by: Leanid Astrakou --- src/renderer/components/common/Utils.tsx | 3 +-- src/renderer/components/stages/connection/connectionSlice.ts | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/common/Utils.tsx b/src/renderer/components/common/Utils.tsx index d5407641..d9abf09b 100644 --- a/src/renderer/components/common/Utils.tsx +++ b/src/renderer/components/common/Utils.tsx @@ -16,5 +16,4 @@ export const TYPE_YAML = "yaml"; export const TYPE_JCL = "jcl"; export const TYPE_OUTPUT = "output"; -export const DEF_JOB_STATEMENT = `//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A, -// MSGLEVEL=(1,1),MSGCLASS=A`; \ No newline at end of file +export const DEF_JOB_STATEMENT = `//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A,\n// MSGLEVEL=(1,1),MSGCLASS=A`; \ No newline at end of file diff --git a/src/renderer/components/stages/connection/connectionSlice.ts b/src/renderer/components/stages/connection/connectionSlice.ts index fb0f88bd..4d62bd88 100644 --- a/src/renderer/components/stages/connection/connectionSlice.ts +++ b/src/renderer/components/stages/connection/connectionSlice.ts @@ -11,6 +11,7 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '../../../store'; import { IIpcConnectionArgs, IIpcConnectionArgsSecureOptions } from '../../../../types/interfaces'; +import { DEF_JOB_STATEMENT } from '../../common/Utils'; export interface ConnectionState { connectionArgs: IIpcConnectionArgs; @@ -26,7 +27,7 @@ const initialState: ConnectionState = { port: 21, user: '', password: '', - jobStatement: "//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A,\n// MSGLEVEL=(1,1),MSGCLASS=A", + jobStatement: DEF_JOB_STATEMENT, secure: false, secureOptions: { enableTrace: false, From 7be2063512c325e8102beea11fab113bf011e9be Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 14 May 2024 22:58:36 -0400 Subject: [PATCH 004/455] Fixed a bug w/ schema validation Signed-off-by: Leanid Astrakou --- src/storage/ConfigurationStore.ts | 9 +++++---- src/storage/ConnectionStore.ts | 2 +- src/storage/DefaultStore.ts | 18 +++++++++++++----- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/storage/ConfigurationStore.ts b/src/storage/ConfigurationStore.ts index 194f672b..85d6d237 100644 --- a/src/storage/ConfigurationStore.ts +++ b/src/storage/ConfigurationStore.ts @@ -43,11 +43,12 @@ export class ConfigurationStore extends DefaultStore { } public static setConfigByKeyAndValidate(key: string, value: string | Array, schema?: any): boolean { - if (!schema) { - schema = this.getSchema(); + if (this.validateWithSchema(key, KEY_SCHEMA)) { + this.getStore().set(`config.${key}`, value); + return true; } - let schemaPart: any = schema?.properties; - return this.setAndValidate(key, value, schemaPart); + console.warn(`failed validate against schema config.${key}`); + return false; } public static deleteConfigByKey(key: any): void { diff --git a/src/storage/ConnectionStore.ts b/src/storage/ConnectionStore.ts index 143cb0d5..d34ff367 100644 --- a/src/storage/ConnectionStore.ts +++ b/src/storage/ConnectionStore.ts @@ -90,7 +90,7 @@ export const STORE_DEFAULT = { } }; -const store = new Store({cwd: 'zen-connection-store', schema: STORE_SCHEMA}); +const store = new Store({cwd: STORE_NAME, schema: STORE_SCHEMA}); store.set({...STORE_DEFAULT, ...store.store}); export class ConnectionStore extends DefaultStore { diff --git a/src/storage/DefaultStore.ts b/src/storage/DefaultStore.ts index 1ad40e8d..8f402b82 100644 --- a/src/storage/DefaultStore.ts +++ b/src/storage/DefaultStore.ts @@ -20,14 +20,22 @@ export class DefaultStore { return new Store({cwd: STORE_NAME}); } - public static validateWithSchema(key: string, schema: any): boolean { + public static validateWithSchema(key: string, schemaKey: any): boolean { const keys = key.split('.'); - let schemaPart = schema; - for (const key of keys) { - if (!Object.prototype.hasOwnProperty.call(schemaPart, key)) { + const schema = this.getStore().get(schemaKey) as any; + if(schema && schema.properties){ + let schemaPart: any = schema?.properties || undefined; + for (const key of keys) { + if (schemaPart != undefined && !Object.prototype.hasOwnProperty.call(schemaPart, key)) { return false; } - schemaPart = schemaPart[key].properties; + if(schemaPart[key].properties){ + schemaPart = schemaPart[key]?.properties || undefined; + } else { + return true; + } + } + return true; } return true; } From 6e84c03b3eae9e02666fb3010f7126ce227cef5d Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Fri, 24 May 2024 14:15:04 -0400 Subject: [PATCH 005/455] Fix for empty output Signed-off-by: Leanid Astrakou --- src/renderer/components/common/EditorDialog.tsx | 3 ++- src/renderer/components/common/Utils.tsx | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index 932d8ed9..299cce0c 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -17,6 +17,7 @@ import MonacoEditorComponent from "../common/MonacoEditor"; import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json"; import { parse, stringify } from "yaml"; import { IResponse } from "../../../types/interfaces"; +import { DEV_NO_OUTPUT } from "./Utils"; const test_jcl = ` //MYJOB JOB (ACCT), 'My Job Description', @@ -55,7 +56,7 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC } if(contentType == 'output') { window.electron.ipcRenderer.getStandardOutput().then((res: IResponse) => { - setEditorContent(res) + setEditorContent(res || DEV_NO_OUTPUT) // We may not always have output to show (for ex: no encountered error or run commands) }); } } diff --git a/src/renderer/components/common/Utils.tsx b/src/renderer/components/common/Utils.tsx index d9abf09b..54e52879 100644 --- a/src/renderer/components/common/Utils.tsx +++ b/src/renderer/components/common/Utils.tsx @@ -16,4 +16,5 @@ export const TYPE_YAML = "yaml"; export const TYPE_JCL = "jcl"; export const TYPE_OUTPUT = "output"; +export const DEV_NO_OUTPUT = "No output to display." export const DEF_JOB_STATEMENT = `//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A,\n// MSGLEVEL=(1,1),MSGCLASS=A`; \ No newline at end of file From e6a62992b2b4e4524f204061babf30a92b2c3ea7 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Fri, 24 May 2024 14:46:01 -0400 Subject: [PATCH 006/455] Dismiss error message after closing Editor output Signed-off-by: Leanid Astrakou --- src/renderer/components/common/EditorDialog.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index 299cce0c..2a077577 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -18,6 +18,7 @@ import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json"; import { parse, stringify } from "yaml"; import { IResponse } from "../../../types/interfaces"; import { DEV_NO_OUTPUT } from "./Utils"; +import { alertEmitter } from "../Header"; const test_jcl = ` //MYJOB JOB (ACCT), 'My Job Description', @@ -136,6 +137,14 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC reader.readAsText(file); }; + const handleClose = () => { + // Add your new functionality here + alertEmitter.emit('hideAlert'); + + // Call the existing toggleEditorVisibility method + toggleEditorVisibility(); + }; + const handleFileExport = () => { const content = editorContent; const blob = new Blob([content], { type: 'text/plain' }); @@ -179,7 +188,7 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC )} {contentType === 'jcl' && } - +
From 55a7e40ae498e317a56a14d0ebf15da568be7721 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 28 May 2024 16:52:22 -0400 Subject: [PATCH 007/455] Added undefined checks Signed-off-by: Leanid Astrakou --- src/renderer/components/stages/Certificates.tsx | 8 ++++---- src/renderer/components/stages/InitApfAuth.tsx | 8 ++++---- src/renderer/components/stages/Security.tsx | 8 ++++---- src/renderer/components/stages/Vsam.tsx | 8 ++++---- .../stages/installation/Installation.tsx | 14 +++++++------- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index a014bb5f..4849741f 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -267,10 +267,10 @@ const Certificates = () => { {!showProgress ? null : - - - - + {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} + + + } diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index f02022e3..931ac4e9 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -312,10 +312,10 @@ const InitApfAuth = () => { : null} {!showProgress ? null : - - {/* we do || false to prevent run-time issue with not filled out data */} - - + {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} + + + } diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 3a6a2b37..dd501486 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -271,10 +271,10 @@ window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installati {!showProgress ? null : - - - - + {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} + + + } diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 32c0bb67..f4b7d511 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -332,10 +332,10 @@ const Vsam = () => { {!showProgress ? null : - - - - + {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} + + + } diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 8a5fc06e..82913941 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -303,13 +303,13 @@ const Installation = () => { : null} {!showProgress ? null : - - - - - - - + {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} + + + + + + } From ef0ab8f90adfcd816c771b75a1bc23349a8b27f2 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 28 May 2024 16:57:56 -0400 Subject: [PATCH 008/455] Fix build error Signed-off-by: Leanid Astrakou --- src/renderer/components/stages/Vsam.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index f4b7d511..9d072853 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -24,7 +24,7 @@ import React from "react"; import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; -import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; +import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { setProgress, getProgress, setVsamInitState, mapAndSetSkipStatus, getInstallationArguments, getVsamInitState } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; From 309dab12bd5b34ec69d33faa24357c6f6dfa89da Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 28 May 2024 22:41:13 -0400 Subject: [PATCH 009/455] Fixed progress statuses undefined bug Signed-off-by: Leanid Astrakou --- src/renderer/components/stages/Certificates.tsx | 8 ++++---- src/renderer/components/stages/InitApfAuth.tsx | 8 ++++---- src/renderer/components/stages/Security.tsx | 8 ++++---- src/renderer/components/stages/Vsam.tsx | 8 ++++---- .../stages/installation/Installation.tsx | 14 +++++++------- src/storage/ProgressStore.ts | 2 ++ 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 4849741f..84b8643e 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -267,10 +267,10 @@ const Certificates = () => { {!showProgress ? null : - {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} - - - + + + + } diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 931ac4e9..ef12d9e6 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -312,10 +312,10 @@ const InitApfAuth = () => { : null} {!showProgress ? null : - {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} - - - + + + + } diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index dd501486..9ea42f6c 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -271,10 +271,10 @@ window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installati {!showProgress ? null : - {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} - - - + + + + } diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 9d072853..f0cb01a7 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -332,10 +332,10 @@ const Vsam = () => { {!showProgress ? null : - {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} - - - + + + + } diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 82913941..59f83198 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -303,13 +303,13 @@ const Installation = () => { : null} {!showProgress ? null : - {/* we do || false to prevent run-time issue with not initialized data. local storage, first time app init issue? */} - - - - - - + + + + + + + } diff --git a/src/storage/ProgressStore.ts b/src/storage/ProgressStore.ts index e83a234b..493ba5c3 100644 --- a/src/storage/ProgressStore.ts +++ b/src/storage/ProgressStore.ts @@ -39,6 +39,8 @@ const STORE_DEFAULT = { } }; const STORE_NAME = 'zen-progress-store'; +const store = new Store({cwd: STORE_NAME}); +store.set(STORE_DEFAULT); export class ProgressStore extends DefaultStore { From 652541cdb7a231c30664c1f41a40cea805bc0761 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 28 May 2024 23:52:47 -0400 Subject: [PATCH 010/455] Undefined checks for job property Signed-off-by: Leanid Astrakou --- src/renderer/components/stages/installation/Installation.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 3c45ba33..8d6d94c1 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -127,10 +127,10 @@ const Installation = () => { if (installationArgs.rbacProfile) { yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; } - if ((yamlObj.zowe.job.name === undefined || yamlObj.zowe.job.name === '') && installationArgs.jobName) { //this undefined check is necessary because InstallationStage.jobName has a defualt, and therefore this would always overwrite the value in the config + if ((yamlObj.zowe.job?.name === undefined || yamlObj.zowe.job?.name === '') && installationArgs.jobName) { //this undefined check is necessary because InstallationStage.jobName has a defualt, and therefore this would always overwrite the value in the config yamlObj.zowe.job.name = installationArgs.jobName; } - if ((yamlObj.zowe.job.prefix === undefined || yamlObj.zowe.job.prefix === '') && installationArgs.jobPrefix) { + if ((yamlObj.zowe.job?.prefix === undefined || yamlObj.zowe.job?.prefix === '') && installationArgs.jobPrefix) { yamlObj.zowe.job.prefix = installationArgs.jobPrefix; } if (installationArgs.cookieId) { From 21cf021a04dd1ad4c2c280cd47a1114a4589edee Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 30 May 2024 13:56:26 +0530 Subject: [PATCH 011/455] Updating the interfaces --- .../stages/progress/StageProgressStatus.ts | 30 +++++++++++++++++++ .../stages/progress/progressSlice.ts | 1 + src/types/stateInterfaces.ts | 1 + 3 files changed, 32 insertions(+) diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 73d31278..80e1d39b 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -27,6 +27,7 @@ const progressStatus: ProgressState = { networkingStatus: false, apfAuthStatus: false, securityStatus: false, + stcsStatus: false, certificateStatus: false, vsamStatus: false, launchConfigStatus: false, @@ -66,6 +67,12 @@ const securityInitStatus: InitSubStepsState = { success: false } +const stcsInitStatus: InitSubStepsState = { + writeYaml: false, + uploadYaml: false, + success: false +} + const certificateInitStatus: CertInitSubStepsState = { writeYaml: false, uploadYaml: false, @@ -122,6 +129,7 @@ let installationTypeKey = 'installation_type'; let datasetInstallationKey = 'dataset_installation'; let apfAuthKey = 'apf_auth'; let securityKey = 'security_init'; +let stcsKey = 'stcs_init'; let certificateKey = 'certificate_init'; let vsamKey = 'vsam_init'; let planningValidationDetailsKey = `planning_validation_details`; @@ -139,6 +147,7 @@ const setKeys = (id: string) => { datasetInstallationKey = `${datasetInstallationKey}_${id}`; apfAuthKey = `${apfAuthKey}_${id}`; securityKey = `${securityKey}_${id}`; + stcsKey = `${stcsKey}_${id}`; certificateKey = `${certificateKey}_${id}`; vsamKey = `${vsamKey}_${id}`; planningValidationDetailsKey = `${planningValidationDetailsKey}_${id}`; @@ -192,6 +201,12 @@ export const initializeProgress = (host: string, user: string) => { localStorage.setItem(securityKey, JSON.stringify(flattenedData)); } + const stcsInitState = localStorage.getItem(stcsKey); + if(!stcsInitState) { + const flattenedData = flatten(stcsInitStatus); + localStorage.setItem(stcsKey, JSON.stringify(flattenedData)); + } + const certificateInitState = localStorage.getItem(certificateKey); if(!certificateInitState) { const flattenedData = flatten(certificateInitStatus); @@ -309,6 +324,21 @@ export const getSecurityInitState = (): InitSubStepsState => { } } +export const setStcsInitState = (stcsInitSteps: InitSubStepsState): void => { + Object.assign(stcsInitStatus, stcsInitSteps); + localStorage.setItem(stcsKey, JSON.stringify(stcsInitStatus)); +} + +export const getStcsInitState = (): InitSubStepsState => { + const stcsInitState = localStorage.getItem(stcsKey); + if(stcsInitState) { + const flattenedData = JSON.parse(stcsInitState); + return unflatten(flattenedData) + } else { + return stcsInitStatus; + } +} + export const setCertificateInitState = (certificateInitSteps: CertInitSubStepsState): void => { Object.assign(certificateInitStatus, certificateInitSteps); localStorage.setItem(certificateKey, JSON.stringify(certificateInitStatus)); diff --git a/src/renderer/components/stages/progress/progressSlice.ts b/src/renderer/components/stages/progress/progressSlice.ts index 3ba8bf8d..8762abe7 100644 --- a/src/renderer/components/stages/progress/progressSlice.ts +++ b/src/renderer/components/stages/progress/progressSlice.ts @@ -22,6 +22,7 @@ const initialState: ProgressState = { networkingStatus: getProgress('networkingStatus') || false, apfAuthStatus: getProgress('apfAuthStatus') || false, securityStatus: getProgress('securityStatus') || false, + stcsStatus: getProgress('stcsStatus') || false, certificateStatus: getProgress('certificateStatus') || false, vsamStatus: getProgress('vsamStatus') || false, launchConfigStatus: getProgress('launchConfigStatus') || false, diff --git a/src/types/stateInterfaces.ts b/src/types/stateInterfaces.ts index 87b0cc36..ca7d5c68 100644 --- a/src/types/stateInterfaces.ts +++ b/src/types/stateInterfaces.ts @@ -17,6 +17,7 @@ export interface ProgressState { networkingStatus: boolean; apfAuthStatus: boolean; securityStatus: boolean; + stcsStatus: boolean; certificateStatus: boolean; vsamStatus: boolean; launchConfigStatus: boolean; From b20f65147a8e389795d982276cdc5b8be2bc9919 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 30 May 2024 14:23:37 +0530 Subject: [PATCH 012/455] Updating the slice --- src/renderer/components/stages/progress/progressSlice.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/progress/progressSlice.ts b/src/renderer/components/stages/progress/progressSlice.ts index 8762abe7..b13e02ae 100644 --- a/src/renderer/components/stages/progress/progressSlice.ts +++ b/src/renderer/components/stages/progress/progressSlice.ts @@ -50,6 +50,7 @@ export const progressSlice = createSlice({ state.networkingStatus && state.apfAuthStatus && state.securityStatus && + state.stcsStatus && state.certificateStatus && state.launchConfigStatus ) { @@ -76,6 +77,10 @@ export const progressSlice = createSlice({ state.securityStatus = action.payload; setProgress('securityStatus', action.payload); }, + setStcsStatus: (state, action: PayloadAction) => { + state.stcsStatus = action.payload; + setProgress('stcsStatus', action.payload); + }, setCertificateStatus: (state, action: PayloadAction) => { state.certificateStatus = action.payload; setProgress('certificateStatus', action.payload); @@ -95,7 +100,7 @@ export const progressSlice = createSlice({ } }); -export const { setConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setInitializationStatus, setDatasetInstallationStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setCertificateStatus, setVsamStatus, setLaunchConfigStatus, setReviewStatus } = progressSlice.actions; +export const { setConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setInitializationStatus, setDatasetInstallationStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setStcsStatus, setCertificateStatus, setVsamStatus, setLaunchConfigStatus, setReviewStatus } = progressSlice.actions; export const selectConnectionStatus = (state: RootState) => state.progress.connectionStatus; export const selectPlanningStatus = (state: RootState) => state.progress.planningStatus; @@ -105,6 +110,7 @@ export const selectDatasetInstallationStatus= (state: RootState) => state.progre export const selectNetworkingStatus= (state: RootState) => state.progress.networkingStatus; export const selectApfAuthStatus = (state: RootState) => state.progress.apfAuthStatus; export const selectSecurityStatus = (state: RootState) => state.progress.securityStatus; +export const selectStcsStatus = (state: RootState) => state.progress.stcsStatus; export const selectCertificateStatus = (state: RootState) => state.progress.certificateStatus; export const selectVsamStatus = (state: RootState) => state.progress.vsamStatus; export const selectLaunchConfigStatus = (state: RootState) => state.progress.launchConfigStatus; From a7e22a9ec398fb5bb05e20ed06e4937a3a61b469 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 30 May 2024 14:46:35 +0530 Subject: [PATCH 013/455] adding the script --- src/actions/InstallActions.ts | 5 +++++ src/actions/InstallationHandler.ts | 30 ++++++++++++++++++++++++++++++ src/main/index.ts | 10 ++++++++++ src/renderer/preload.ts | 8 +++++++- 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index fab0ed38..4f9744bd 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -52,6 +52,11 @@ export class InstallActions { return this.strategy.initSecurity(connectionArgs, installationArgs, zoweConfig); } + initStcs(connectionArgs: IIpcConnectionArgs, + installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { + return this.strategy.initStcs(connectionArgs, installationArgs, zoweConfig); + } + initVsam(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { return this.strategy.initVsam(connectionArgs, installationArgs, zoweConfig); diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 18e451fd..588ea9f7 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -199,6 +199,36 @@ class Installation { return {status: result.rc === 0, details: result.jobOutput} } + public async initStcs(connectionArgs: IIpcConnectionArgs, + installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise{ + + // Initialize Progress Store For Vsam + ProgressStore.set('initStcs.writeYaml', false); + ProgressStore.set('initStcs.uploadYaml', false); + ProgressStore.set('initStcs.success', false); + + console.log('writing current yaml to disk'); + const filePath = path.join(app.getPath('temp'), 'zowe.yaml') + await fs.writeFile(filePath, stringify(zoweConfig), (err) => { + if (err) { + console.warn("Can't save configuration to zowe.yaml"); + ProgressStore.set('initStcs.writeYaml', false); + return {status: false, details: `Can't save configuration to zowe.yaml`}; + } + }); + ProgressStore.set('initStcs.writeYaml', true); + console.log("uploading yaml..."); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + if(!uploadYaml.status){ + return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; + } + ProgressStore.set('initStcs.uploadYaml', uploadYaml.status); + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init stc -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const result = await new Script().run(connectionArgs, script); + ProgressStore.set('inittcs.success', result.rc === 0); + return {status: result.rc === 0, details: result.jobOutput} + } + async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string}, zoweConfig: any){ console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') diff --git a/src/main/index.ts b/src/main/index.ts index 64d97b64..ba38328b 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -184,6 +184,11 @@ const createWindow = (): void => { return res; }); + ipcMain.handle('init-stcs', async (event, connectionArgs, installationArgs, zoweConfig) => { + const res = await installActions.initStcs(connectionArgs, installationArgs, zoweConfig); + return res; + }); + ipcMain.handle('init-vsam', async (event, connectionArgs, installationArgs, zoweConfig) => { const res = await installActions.initVsam(connectionArgs, installationArgs, zoweConfig); return res; @@ -194,6 +199,11 @@ const createWindow = (): void => { return res; }); + ipcMain.handle('get-init-stcs-progress', async () => { + const res = ProgressStore.getAll()['initStcs']; + return res; + }); + ipcMain.handle('get-init-vsam-progress', async () => { const res = ProgressStore.getAll()['initVsam']; return res; diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 951e1d60..6f21cec9 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -91,18 +91,24 @@ contextBridge.exposeInMainWorld('electron', { initSecurityButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { return ipcRenderer.invoke("init-security", connectionArgs, installationArgs, zoweConfig); }, + initStcsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { + return ipcRenderer.invoke("init-stcs", connectionArgs, installationArgs, zoweConfig); + }, initVsamButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { return ipcRenderer.invoke("init-vsam", connectionArgs, installationArgs, zoweConfig); }, getInitSecurityProgress(){ return ipcRenderer.invoke("get-init-security-progress"); }, + getInitStcsProgress(){ + return ipcRenderer.invoke("get-init-stcs-progress"); + }, getInitVsamProgress(){ return ipcRenderer.invoke("get-init-vsam-progress"); }, on(channel: string, func: any) { // REVIEW: Used to have channel validation with ipcRenderer.send, do we need something similar for ipcRenderer.invoke? - const validChannels = ['install-mvs', 'init-security', 'init-vsam']; + const validChannels = ['install-mvs', 'init-security', 'init-vsam', 'init-stcs']; if (validChannels.includes(channel)) { ipcRenderer.on(channel, (event, ...args) => func(...args)); } From 025f4875b6e74c814e5881cf53477af274d5941d Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 30 May 2024 15:01:38 +0530 Subject: [PATCH 014/455] stcs base code --- src/renderer/components/common/Stepper.tsx | 3 +- .../configuration-wizard/Wizard.tsx | 10 +- .../components/stages/Certificates.tsx | 2 +- .../components/stages/ReviewInstallation.tsx | 3 +- src/renderer/components/stages/Stcs.tsx | 256 ++++++++++++++++++ src/storage/ProgressStore.ts | 5 + 6 files changed, 271 insertions(+), 8 deletions(-) create mode 100644 src/renderer/components/stages/Stcs.tsx diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index bbfb681e..c13997c3 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -20,8 +20,6 @@ import { Link } from 'react-router-dom'; import { selectConnectionStatus } from '../stages/progress/progressSlice'; import { useAppSelector, useAppDispatch } from '../../hooks'; import { selectNextStepEnabled } from '../configuration-wizard/wizardSlice'; -import { selectPlanningStatus, selectInitializationStatus, selectDatasetInstallationStatus, selectNetworkingStatus, selectApfAuthStatus, selectSecurityStatus, selectCertificateStatus, selectLaunchConfigStatus, selectReviewStatus } from '../stages/progress/progressSlice'; -import { selectInstallationTypeStatus } from '../stages/progress/progressSlice'; import { selectActiveStepIndex, selectActiveSubStepIndex } from '../stages/progress/activeStepSlice'; import { alertEmitter } from '../Header'; import EditorDialog from "./EditorDialog"; @@ -60,6 +58,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages completeProgress.networkingStatus, completeProgress.apfAuthStatus, completeProgress.securityStatus, + completeProgress.stcsStatus, completeProgress.certificateStatus, completeProgress.launchConfigStatus ] diff --git a/src/renderer/components/configuration-wizard/Wizard.tsx b/src/renderer/components/configuration-wizard/Wizard.tsx index 2d97de7a..8f16043b 100644 --- a/src/renderer/components/configuration-wizard/Wizard.tsx +++ b/src/renderer/components/configuration-wizard/Wizard.tsx @@ -13,6 +13,7 @@ import Connection from "../stages/connection/Connection"; import Planning from "../stages/Planning"; import Installation from "../stages/installation/Installation"; import Security from "../stages/Security"; +import Stcs from "../stages/Stcs"; import Certificates from "../stages/Certificates"; import Initialization from "../stages/Initialization"; import ReviewInstallation from '../stages/ReviewInstallation'; @@ -34,10 +35,11 @@ export const stages = [ {id: 0, label: 'Installation', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Network Setup', statusKey: 'datasetInstallationStatus'}, {id: 1, label: 'Networking', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to APF Auth Setup', statusKey: 'networkingStatus'}, {id: 2, label: 'APF Auth', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Security Setup', statusKey: 'apfAuthStatus'}, - {id: 3, label: 'Security', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Certificates Setup', statusKey: 'securityStatus'}, - {id: 4, label: 'Certificates', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Vsam Setup', statusKey: 'certificateStatus'}, - {id: 5, label: 'Vsam', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Launch Setup', statusKey: 'vsamStatus'}, - {id: 6, label: 'Launch Config', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Instance Setup', statusKey: 'launchConfigStatus'}, + {id: 3, label: 'Security', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Stcs Setup', statusKey: 'securityStatus'}, + {id: 4, label: 'Stcs', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Certificates Setup', statusKey: 'stcsStatus'}, + {id: 5, label: 'Certificates', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Vsam Setup', statusKey: 'certificateStatus'}, + {id: 6, label: 'Vsam', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Launch Setup', statusKey: 'vsamStatus'}, + {id: 7, label: 'Launch Config', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Instance Setup', statusKey: 'launchConfigStatus'}, ], nextButton: 'Review', statusKey: 'initializationStatus'}, {id: 4, label: 'Review Installation', component: , hasJCL: false, isSkippable: false, hasOutput: false, steps: 1, nextButton: 'Finish Installation', statusKey: 'reviewStatus'}, {id: 5, label: 'Finish Installation', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, statusKey: 'finishStatus'}, diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 9a4ed2bf..a8fb911b 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -11,7 +11,7 @@ import { useState, useEffect } from "react"; import { Box, Button, FormControl } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { setSecurityStatus, setInitializationStatus, selectCertificateStatus, setCertificateStatus, selectInitializationStatus } from './progress/progressSlice'; +import { setInitializationStatus, selectCertificateStatus, setCertificateStatus, selectInitializationStatus } from './progress/progressSlice'; import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index 15550283..7e3e7fb9 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -20,7 +20,7 @@ import { useAppSelector, useAppDispatch } from '../../hooks'; import eventDispatcher from '../../../utils/eventDispatcher'; import EditorDialog from "../common/EditorDialog"; import { createTheme } from '@mui/material/styles'; -import { selectConnectionStatus, selectPlanningStatus, selectInstallationTypeStatus, selectInitializationStatus, selectDatasetInstallationStatus, selectNetworkingStatus, selectApfAuthStatus, selectSecurityStatus, selectCertificateStatus, selectLaunchConfigStatus, setReviewStatus } from './progress/progressSlice'; +import { selectConnectionStatus, selectPlanningStatus, selectInstallationTypeStatus, selectInitializationStatus, selectDatasetInstallationStatus, selectNetworkingStatus, selectApfAuthStatus, selectSecurityStatus, selectStcsStatus, selectCertificateStatus, selectLaunchConfigStatus, setReviewStatus } from './progress/progressSlice'; import { setActiveStep } from './progress/activeStepSlice'; import { setNextStepEnabled } from '../configuration-wizard/wizardSlice'; import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; @@ -58,6 +58,7 @@ const ReviewInstallation = () => { completeProgress.networkingStatus, completeProgress.apfAuthStatus, completeProgress.securityStatus, + completeProgress.stcsStatus, completeProgress.certificateStatus, completeProgress.vsamStatus, completeProgress.launchConfigStatus diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx new file mode 100644 index 00000000..6d386979 --- /dev/null +++ b/src/renderer/components/stages/Stcs.tsx @@ -0,0 +1,256 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import { useState, useEffect } from "react"; +import { Box, Button, FormControl } from '@mui/material'; +import { useAppSelector, useAppDispatch } from '../../hooks'; +import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { setStcsStatus, setInitializationStatus, selectStcsStatus, selectInitializationStatus } from './progress/progressSlice'; +import ContainerCard from '../common/ContainerCard'; +import JsonForm from '../common/JsonForms'; +import EditorDialog from "../common/EditorDialog"; +import Ajv from "ajv"; +import { selectInstallationArgs } from "./installation/installationSlice"; +import { selectConnectionArgs } from "./connection/connectionSlice"; +import { IResponse } from "../../../types/interfaces"; +import ProgressCard from "../common/ProgressCard"; +import React from "react"; +import { createTheme } from '@mui/material/styles'; +import { stages } from "../configuration-wizard/Wizard"; +import { setActiveStep } from "./progress/activeStepSlice"; +import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; +import { setProgress, getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { InitSubStepsState } from "../../../types/stateInterfaces"; + +const Stcs = () => { + + // TODO: Display granular details of installation - downloading - unpacking - running zwe command + + const stageLabel = 'Initialization'; + const subStageLabel = 'Stcs'; + + const STAGE_ID = getStageDetails(stageLabel).id; + const SUB_STAGES = !!getStageDetails(stageLabel).subStages; + const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + + const theme = createTheme(); + + const dispatch = useAppDispatch(); + const schema = useAppSelector(selectSchema); + const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); + const setupSchema = schema?.properties?.zowe?.properties?.setup?.properties?.security?.properties?.stcs; + const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.security?.stcs); + const [showProgress, setShowProgress] = useState(getProgress('stcsStatus')); + const [init, setInit] = useState(false); + const [editorVisible, setEditorVisible] = useState(false); + const [isFormValid, setIsFormValid] = useState(false); + const [formError, setFormError] = useState(''); + const [contentType, setContentType] = useState(''); + const [stcsInitProgress, setStcsInitProgress] = useState(getStcsInitState()); + const [stateUpdated, setStateUpdated] = useState(false); + const [initClicked, setInitClicked] = useState(false); + const [reinit, setReinit] = useState(false); + + const installationArgs = getInstallationArguments(); + const connectionArgs = useAppSelector(selectConnectionArgs); + let timer: any; + + const section = 'stcs'; + + const ajv = new Ajv(); + ajv.addKeyword("$anchor"); + let stcsSchema; + let validate: any; + if(schema) { + stcsSchema = schema?.properties?.zowe?.properties?.setup?.properties?.security?.properties?.stcs; + } + + if(stcsSchema) { + validate = ajv.compile(stcsSchema); + } + + useEffect(() => { + + setShowProgress(initClicked || getProgress('stcsStatus')); + let nextPosition; + + if(getProgress('stcsStatus')) { + nextPosition = document.getElementById('stcs-progress'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'end' }); + } else { + nextPosition = document.getElementById('container-box-id'); + nextPosition?.scrollIntoView({behavior: 'smooth'}); + } + + updateProgress(getProgress('stcsStatus')); + setInit(true); + + return () => { + dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); + } + }, []); + + useEffect(() => { + setShowProgress(initClicked || getProgress('stcsStatus')); + + if(initClicked) { + let nextPosition = document.getElementById('start-stcs-progress'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + setStateUpdated(!stateUpdated); + dispatch(setStcsStatus(false)); + } + }, [initClicked]); + + useEffect(() => { + if(!getProgress('stcsStatus') && initClicked) { + timer = setInterval(() => { + window.electron.ipcRenderer.getInitStcsProgress().then((res: any) => { + setStcsInitializationProgress(res); + }) + }, 3000); + + if(showProgress) { + const nextPosition = document.getElementById('start-stcs-progress'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + } + return () => { + clearInterval(timer); + }; + }, [showProgress, stateUpdated]); + + useEffect(() => { + const allAttributesTrue = Object.values(stcsInitProgress).every(value => value === true); + if(allAttributesTrue) { + dispatch(setStcsStatus(true)); + dispatch(setNextStepEnabled(true)); + setShowProgress(initClicked || getProgress('stcsStatus')); + } + }, [stcsInitProgress]); + + const setStcsInitializationProgress = (stcsInitState: InitSubStepsState) => { + setStcsInitProgress(stcsInitState); + setStcsInitState(stcsInitState); + const allAttributesTrue = Object.values(stcsInitState).every(value => value === true); + if(allAttributesTrue) { + dispatch(setStcsStatus(true)); + dispatch(setNextStepEnabled(true)); + } + } + + const setStageSkipStatus = (status: boolean) => { + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; + stages[STAGE_ID].isSkipped = status; + mapAndSetSkipStatus(SUB_STAGE_ID, status); + } + + const updateProgress = (status: boolean) => { + setStateUpdated(!stateUpdated); + setStageSkipStatus(!status); + if(!status) { + for (let key in stcsInitProgress) { + stcsInitProgress[key as keyof(InitSubStepsState)] = false; + setStcsInitState(stcsInitProgress); + } + } + const allAttributesTrue = Object.values(stcsInitProgress).every(value => value === true); + status = allAttributesTrue ? true : false; + dispatch(setInitializationStatus(status)); + dispatch(setStcsStatus(status)); + dispatch(setNextStepEnabled(status)); + setStcsInitializationProgress(getStcsInitState()); + } + + const toggleEditorVisibility = (type: any) => { + setContentType(type); + setEditorVisible(!editorVisible); + }; + + const reinitialize = (event: any) => { + setReinit(true); + process(event); + } + + const process = (event: any) => { + setInitClicked(true); + updateProgress(false); + event.preventDefault(); + window.electron.ipcRenderer.initStcsButtonOnClick(connectionArgs, installationArgs, yaml).then((res: IResponse) => { + updateProgress(res.status); + clearInterval(timer); + }).catch((error: any) => { + clearInterval(timer); + updateProgress(false); + console.warn('zwe init stcs failed'); + }); + } + + const handleFormChange = (data: any) => { + let newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security?.stcs) : (data?.zowe?.setup?.security?.stcs ? data?.zowe?.setup?.security?.stcs : data); + setInit(false); + + if (newData) { + if(validate) { + validate(newData); + if(validate.errors) { + const errPath = validate.errors[0].schemaPath; + const errMsg = validate.errors[0].message; + setStageConfig(false, errPath+' '+errMsg, newData); + } else { + window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, security: {...yaml.zowe.setup.security, stcs: newData}}}}); + setStageConfig(true, '', newData); + } + } + } + }; + + const setStageConfig = (isValid: boolean, errorMsg: string, data: any) => { + setIsFormValid(isValid); + setFormError(errorMsg); + setSetupYaml(data); + } + + return ( +
+ + + + + + + {editorVisible && } + dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details.config ?? yaml))}> + {!isFormValid &&
{formError}
} + handleFormChange(data)} formData={setupYaml}/> + + {!showProgress ? + + : null} + + + + {!showProgress ? null : + + + + + + + } + +
+ + +
+
+ ); +}; + +export default Stcs; \ No newline at end of file diff --git a/src/storage/ProgressStore.ts b/src/storage/ProgressStore.ts index d73a8278..0890dafd 100644 --- a/src/storage/ProgressStore.ts +++ b/src/storage/ProgressStore.ts @@ -31,6 +31,11 @@ const storeDefault = { "uploadYaml": false, "success": false }, + "initStcs": { + "writeYaml": false, + "uploadYaml": false, + "success": false + }, "certificate": { "writeYaml": false, "uploadYaml": false, From dfe2b8777764086d298f76f96aef5d681baa5811 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 30 May 2024 17:49:10 +0530 Subject: [PATCH 015/455] stcs page --- src/actions/InstallationHandler.ts | 2 +- src/renderer/components/stages/Stcs.tsx | 55 +++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 588ea9f7..35122bc8 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -225,7 +225,7 @@ class Installation { ProgressStore.set('initStcs.uploadYaml', uploadYaml.status); const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init stc -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); - ProgressStore.set('inittcs.success', result.rc === 0); + ProgressStore.set('initStcs.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} } diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 6d386979..55206216 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -9,7 +9,7 @@ */ import { useState, useEffect } from "react"; -import { Box, Button, FormControl } from '@mui/material'; +import { Box, Button, FormControl, TextField, Typography } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import { setStcsStatus, setInitializationStatus, selectStcsStatus, selectInitializationStatus } from './progress/progressSlice'; @@ -28,6 +28,7 @@ import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; import { setProgress, getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; +import { alertEmitter } from "../Header"; const Stcs = () => { @@ -57,6 +58,7 @@ const Stcs = () => { const [stateUpdated, setStateUpdated] = useState(false); const [initClicked, setInitClicked] = useState(false); const [reinit, setReinit] = useState(false); + const [initErrorMsg, setInitErrorMsg] = useState(''); const installationArgs = getInstallationArguments(); const connectionArgs = useAppSelector(selectConnectionArgs); @@ -64,6 +66,8 @@ const Stcs = () => { const section = 'stcs'; + const defaultErrorMessage = "Please ensure that the values for security.stcs attributes are accurate."; + const ajv = new Ajv(); ajv.addKeyword("$anchor"); let stcsSchema; @@ -93,6 +97,7 @@ const Stcs = () => { setInit(true); return () => { + alertEmitter.emit('hideAlert'); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); } }, []); @@ -179,11 +184,17 @@ const Stcs = () => { } const process = (event: any) => { + alertEmitter.emit('hideAlert'); + setInitClicked(true); updateProgress(false); event.preventDefault(); window.electron.ipcRenderer.initStcsButtonOnClick(connectionArgs, installationArgs, yaml).then((res: IResponse) => { updateProgress(res.status); + if(res.error) { + setInitErrorMsg(`${res ? res.errorMsg : ''} ${defaultErrorMessage}`); + alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); + } clearInterval(timer); }).catch((error: any) => { clearInterval(timer); @@ -224,12 +235,50 @@ const Stcs = () => {
- + {editorVisible && } + + {`Please review the following started task (STC) configuration values from the security stage before initializing stcs.\n`} + dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details.config ?? yaml))}> {!isFormValid &&
{formError}
} - handleFormChange(data)} formData={setupYaml}/> + + + + + + {!showProgress ? : null} From b7fbc1d28e324133eb05aaed0bcab6eab3220d51 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Fri, 31 May 2024 13:27:02 -0400 Subject: [PATCH 016/455] Added even more error reporting Signed-off-by: Leanid Astrakou --- src/renderer/components/stages/Security.tsx | 61 ++++++++++----------- src/storage/DefaultStore.ts | 16 ++++-- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index cf33bd68..443a5fef 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -206,40 +206,39 @@ const Security = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); -updateProgress(true); -window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installationArgs, yaml).then((res: IResponse) => { - // Some parts of Zen pass the response as a string directly into the object - if (res.status == false && typeof res.details == "string") { - res.details = { 3: res.details }; - } - if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe init security - alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); - window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { - toggleEditorVisibility("output"); - }) - updateProgress(false); - securityProceedActions(false); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; - clearInterval(timer); - } else { - securityProceedActions(res.status); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; - clearInterval(timer); - } - }).catch((err: any) => { - // TODO: Test this - //alertEmitter.emit('showAlert', err.toString(), 'error'); + window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installationArgs, yaml).then((res: IResponse) => { + // Some parts of Zen pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { + res.details = { 3: res.details }; + } + if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe init security + alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); + window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { + toggleEditorVisibility("output"); + }) updateProgress(false); - clearInterval(timer); securityProceedActions(false); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; - stages[STAGE_ID].isSkipped = true; - if (typeof err === "string") { - console.warn('zwe init security failed', err); - } else { - console.warn('zwe init security failed', err?.toString()); // toString() throws run-time error on undefined or null - } - }); + clearInterval(timer); + } else { + securityProceedActions(res.status); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; + clearInterval(timer); + } + }).catch((err: any) => { + // TODO: Test this + //alertEmitter.emit('showAlert', err.toString(), 'error'); + updateProgress(false); + clearInterval(timer); + securityProceedActions(false); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; + stages[STAGE_ID].isSkipped = true; + if (typeof err === "string") { + console.warn('zwe init security failed', err); + } else { + console.warn('zwe init security failed', err?.toString()); // toString() throws run-time error on undefined or null + } + }); } // True - a proceed, False - blocked diff --git a/src/storage/DefaultStore.ts b/src/storage/DefaultStore.ts index 8f402b82..5b87ba64 100644 --- a/src/storage/DefaultStore.ts +++ b/src/storage/DefaultStore.ts @@ -12,10 +12,12 @@ import Store from 'electron-store'; const STORE_NAME = 'zen-default-store'; -// Note: This default class is for other Stores to inherit (this is not a Store for "defaults") +// This default class is for other Stores to inherit (this is not a Store for "defaults") export class DefaultStore { - // This method is intended to be overridden by subclasses + /* Note: All Stores that inherit DefaultStore must: + a) override this method with store name + b) use only this method to reference store object */ protected static getStore(): Store { return new Store({cwd: STORE_NAME}); } @@ -50,10 +52,14 @@ export class DefaultStore { public static set(key: string, value: any): boolean { try { - this.getStore().set(key, value); + if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { + console.warn(`Attempted to overwrite ${key} with undefined, function, or symbol`); + } else { + this.getStore().set(key, value); + } return true; } catch (err) { - console.warn(`failed to add ${key} error: `, err); + console.warn(`Failed to add ${key} Error: `, err); return false; } } @@ -62,7 +68,7 @@ export class DefaultStore { if (this.validateWithSchema(key, schema)) { return this.set(key, value); } - console.warn(`failed validate against schema config.${key}`); + console.warn(`Failed to validate against schema config.${key}`); return false; } From 23cc094267de791ffa05ed4e35c83ace642504a9 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Sun, 2 Jun 2024 12:32:08 -0400 Subject: [PATCH 017/455] Fix build errors Signed-off-by: Leanid Astrakou --- h | 62 +++++++++++++++++++ .../stages/connection/Connection.tsx | 10 +-- .../stages/installation/installationSlice.ts | 21 ------- 3 files changed, 67 insertions(+), 26 deletions(-) create mode 100644 h diff --git a/h b/h new file mode 100644 index 00000000..28606ede --- /dev/null +++ b/h @@ -0,0 +1,62 @@ +diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx +index b03f9cb..548560c 100644 +--- a/src/renderer/components/stages/connection/Connection.tsx ++++ b/src/renderer/components/stages/connection/Connection.tsx +@@ -36,7 +36,7 @@ import { alertEmitter } from "../../Header"; + import { getStageDetails, initStageSkipStatus } from "../../../../services/StageDetails"; + import { initializeProgress, getActiveStage } from "../progress/StageProgressStatus"; + import eventDispatcher from "../../../../services/eventDispatcher"; +-import { EXAMPLE_YAML, YAML_SCHEMA } from "../../common/Constants"; ++import { FALLBACK_YAML, FALLBACK_SCHEMA } from "../../common/Constants"; +  + const Connection = () => { +  +@@ -155,12 +155,12 @@ const FTPConnectionForm = () => { + const schema = res.details.schema; + dispatch(setSchema(schema)); + } else { +- dispatch(setYaml(EXAMPLE_YAML)); +- dispatch(setSchema(YAML_SCHEMA)); +- window.electron.ipcRenderer.setConfig(EXAMPLE_YAML).then((res: IResponse) => { ++ dispatch(setYaml(FALLBACK_YAML)); ++ dispatch(setSchema(FALLBACK_SCHEMA)); ++ window.electron.ipcRenderer.setConfig(FALLBACK_YAML).then((res: IResponse) => { + // yaml response + }); +- window.electron.ipcRenderer.setSchema(YAML_SCHEMA).then((res: IResponse) => { ++ window.electron.ipcRenderer.setSchema(FALLBACK_SCHEMA).then((res: IResponse) => { + // schema response + }); + } +diff --git a/src/renderer/components/stages/installation/installationSlice.ts b/src/renderer/components/stages/installation/installationSlice.ts +index bfb0c65..c8a7a28 100644 +--- a/src/renderer/components/stages/installation/installationSlice.ts ++++ b/src/renderer/components/stages/installation/installationSlice.ts +@@ -13,27 +13,6 @@ import { RootState } from '../../../store'; + import { setInstallationTypeStatus, getInstallationTypeStatus, setInstallationArguments } from '../progress/StageProgressStatus';  + import { InstallationArgs } from '../../../../types/stateInterfaces'; +  +-export interface InstallationArgs { +- installationDir: string; +- workspaceDir: string; +- logDir: string, +- extensionDir: string, +- installationType?: string; +- downloadDir: string; +- userUploadedPaxPath?: string; +- smpeDir?: string; +- javaHome: string; +- nodeHome: string; +- setupConfig: any; +- jobName: string; +- jobPrefix: string; +- rbacProfile: string; +- cookieId: string; +- zosmfHost: string, +- zosmfPort: string, +- zosmfApplId: string +-} +- + interface InstallationState { + installationArgs: InstallationArgs; + zoweVersion: string; diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index b03f9cba..548560cd 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -36,7 +36,7 @@ import { alertEmitter } from "../../Header"; import { getStageDetails, initStageSkipStatus } from "../../../../services/StageDetails"; import { initializeProgress, getActiveStage } from "../progress/StageProgressStatus"; import eventDispatcher from "../../../../services/eventDispatcher"; -import { EXAMPLE_YAML, YAML_SCHEMA } from "../../common/Constants"; +import { FALLBACK_YAML, FALLBACK_SCHEMA } from "../../common/Constants"; const Connection = () => { @@ -155,12 +155,12 @@ const FTPConnectionForm = () => { const schema = res.details.schema; dispatch(setSchema(schema)); } else { - dispatch(setYaml(EXAMPLE_YAML)); - dispatch(setSchema(YAML_SCHEMA)); - window.electron.ipcRenderer.setConfig(EXAMPLE_YAML).then((res: IResponse) => { + dispatch(setYaml(FALLBACK_YAML)); + dispatch(setSchema(FALLBACK_SCHEMA)); + window.electron.ipcRenderer.setConfig(FALLBACK_YAML).then((res: IResponse) => { // yaml response }); - window.electron.ipcRenderer.setSchema(YAML_SCHEMA).then((res: IResponse) => { + window.electron.ipcRenderer.setSchema(FALLBACK_SCHEMA).then((res: IResponse) => { // schema response }); } diff --git a/src/renderer/components/stages/installation/installationSlice.ts b/src/renderer/components/stages/installation/installationSlice.ts index bfb0c656..c8a7a280 100644 --- a/src/renderer/components/stages/installation/installationSlice.ts +++ b/src/renderer/components/stages/installation/installationSlice.ts @@ -13,27 +13,6 @@ import { RootState } from '../../../store'; import { setInstallationTypeStatus, getInstallationTypeStatus, setInstallationArguments } from '../progress/StageProgressStatus'; import { InstallationArgs } from '../../../../types/stateInterfaces'; -export interface InstallationArgs { - installationDir: string; - workspaceDir: string; - logDir: string, - extensionDir: string, - installationType?: string; - downloadDir: string; - userUploadedPaxPath?: string; - smpeDir?: string; - javaHome: string; - nodeHome: string; - setupConfig: any; - jobName: string; - jobPrefix: string; - rbacProfile: string; - cookieId: string; - zosmfHost: string, - zosmfPort: string, - zosmfApplId: string -} - interface InstallationState { installationArgs: InstallationArgs; zoweVersion: string; From 48f68a437c11fa879135c57650d420bc03697b96 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Sun, 2 Jun 2024 12:44:49 -0400 Subject: [PATCH 018/455] Ok, actually fix the build errors Signed-off-by: Leanid Astrakou --- README.md | 2 ++ src/actions/InstallActions.ts | 2 +- src/actions/InstallationHandler.ts | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 20608ceb..c4345f66 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ Node version 18.12 or higher is required. ### Developing +Note: `npm run start` may succeed without errors, but `npm run make` will not. It is always advised to run `npm run make` after writing new code, or using the build automation to view errors + Run `npm install` to install dependencies Run `npm run start` to run the application locally diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index aaf68095..61700763 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -8,7 +8,7 @@ * Copyright Contributors to the Zowe Project. */ -import { InstallationArgs } from '../renderer/components/stages/installation/installationSlice'; +import { InstallationArgs } from '../types/stateInterfaces'; import { IIpcConnectionArgs, IResponse } from '../types/interfaces'; import { FTPInstallation, CLIInstallation } from './InstallationHandler'; diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 307c02c5..c55235f1 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -17,7 +17,7 @@ import { IIpcConnectionArgs, IResponse } from '../types/interfaces'; import { ProgressStore } from "../storage/ProgressStore"; import * as fs from 'fs'; import { ConfigurationStore } from '../storage/ConfigurationStore'; -import { InstallationArgs } from '../renderer/components/stages/installation/installationSlice'; +import { InstallationArgs } from "../types/stateInterfaces"; class Installation { From aaf5eb2a1e12571eaef1c4a58e4757488addd2f4 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Sun, 2 Jun 2024 12:51:09 -0400 Subject: [PATCH 019/455] Delete h Signed-off-by: Leanid Astrakou --- h | 62 -------------------------------------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 h diff --git a/h b/h deleted file mode 100644 index 28606ede..00000000 --- a/h +++ /dev/null @@ -1,62 +0,0 @@ -diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx -index b03f9cb..548560c 100644 ---- a/src/renderer/components/stages/connection/Connection.tsx -+++ b/src/renderer/components/stages/connection/Connection.tsx -@@ -36,7 +36,7 @@ import { alertEmitter } from "../../Header"; - import { getStageDetails, initStageSkipStatus } from "../../../../services/StageDetails"; - import { initializeProgress, getActiveStage } from "../progress/StageProgressStatus"; - import eventDispatcher from "../../../../services/eventDispatcher"; --import { EXAMPLE_YAML, YAML_SCHEMA } from "../../common/Constants"; -+import { FALLBACK_YAML, FALLBACK_SCHEMA } from "../../common/Constants"; -  - const Connection = () => { -  -@@ -155,12 +155,12 @@ const FTPConnectionForm = () => { - const schema = res.details.schema; - dispatch(setSchema(schema)); - } else { -- dispatch(setYaml(EXAMPLE_YAML)); -- dispatch(setSchema(YAML_SCHEMA)); -- window.electron.ipcRenderer.setConfig(EXAMPLE_YAML).then((res: IResponse) => { -+ dispatch(setYaml(FALLBACK_YAML)); -+ dispatch(setSchema(FALLBACK_SCHEMA)); -+ window.electron.ipcRenderer.setConfig(FALLBACK_YAML).then((res: IResponse) => { - // yaml response - }); -- window.electron.ipcRenderer.setSchema(YAML_SCHEMA).then((res: IResponse) => { -+ window.electron.ipcRenderer.setSchema(FALLBACK_SCHEMA).then((res: IResponse) => { - // schema response - }); - } -diff --git a/src/renderer/components/stages/installation/installationSlice.ts b/src/renderer/components/stages/installation/installationSlice.ts -index bfb0c65..c8a7a28 100644 ---- a/src/renderer/components/stages/installation/installationSlice.ts -+++ b/src/renderer/components/stages/installation/installationSlice.ts -@@ -13,27 +13,6 @@ import { RootState } from '../../../store'; - import { setInstallationTypeStatus, getInstallationTypeStatus, setInstallationArguments } from '../progress/StageProgressStatus';  - import { InstallationArgs } from '../../../../types/stateInterfaces'; -  --export interface InstallationArgs { -- installationDir: string; -- workspaceDir: string; -- logDir: string, -- extensionDir: string, -- installationType?: string; -- downloadDir: string; -- userUploadedPaxPath?: string; -- smpeDir?: string; -- javaHome: string; -- nodeHome: string; -- setupConfig: any; -- jobName: string; -- jobPrefix: string; -- rbacProfile: string; -- cookieId: string; -- zosmfHost: string, -- zosmfPort: string, -- zosmfApplId: string --} -- - interface InstallationState { - installationArgs: InstallationArgs; - zoweVersion: string; From 6e94b761accb60cceefe219adc8e5aa69be3d4f7 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 4 Jun 2024 10:57:07 -0400 Subject: [PATCH 020/455] Added comment for dev help Signed-off-by: Leanid Astrakou --- src/renderer/components/stages/installation/Installation.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 8d6d94c1..1d3a07a8 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -293,8 +293,8 @@ const Installation = () => { } else { setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(true); - dispatch(setLoading(false)); - window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml, skipDownload ?? false).then((res: IResponse) => { + dispatch(setLoading(false)); /* change skipDownload ?? false --> true to skip upload/download steps for quicker development */ + window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml, true).then((res: IResponse) => { if(res.details?.mergedYaml != undefined){ dispatch(setYaml(res.details.mergedYaml)); window.electron.ipcRenderer.setConfig(res.details.mergedYaml); From f2118d7fccd34d4d16b0c3606087de8551463d7a Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 4 Jun 2024 11:03:26 -0400 Subject: [PATCH 021/455] Correct download/upload conditional w/ comment Signed-off-by: Leanid Astrakou --- src/renderer/components/stages/installation/Installation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 1d3a07a8..ddb76dc6 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -294,7 +294,7 @@ const Installation = () => { setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(true); dispatch(setLoading(false)); /* change skipDownload ?? false --> true to skip upload/download steps for quicker development */ - window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml, true).then((res: IResponse) => { + window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml, skipDownload ?? false).then((res: IResponse) => { if(res.details?.mergedYaml != undefined){ dispatch(setYaml(res.details.mergedYaml)); window.electron.ipcRenderer.setConfig(res.details.mergedYaml); From 41f89ef998ea2634a06a7e3e8782e262d98ad4b1 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 4 Jun 2024 11:11:35 -0400 Subject: [PATCH 022/455] Cleaned up some more comments Signed-off-by: Leanid Astrakou --- src/renderer/components/common/EditorDialog.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index d8a47f11..bd6ff05f 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -46,8 +46,7 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC useEffect(() => { setEditorVisible(isEditorVisible); - /* TODO: 1. All of these should use the Editor store (from ipcRenderer) - 2. Should use an array for the Store to house separate outputs (Security vs Certificates for example) */ + /* TODO: Should use an array for the Store to house separate outputs (Security vs Certificates for example) */ if(isEditorVisible) { if(contentType == 'yaml') { setEditorContent(stringify(setupYaml)); @@ -138,10 +137,7 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC }; const handleClose = () => { - // Add your new functionality here alertEmitter.emit('hideAlert'); - - // Call the existing toggleEditorVisibility method toggleEditorVisibility(); }; From 2414bf891a099b916dff5fe765ecef072452ba46 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:25:35 -0400 Subject: [PATCH 023/455] Add handler for download/upload button click as well as getter for progress Signed-off-by: Timothy Gerstel --- src/main/index.ts | 10 ++++++++++ src/renderer/preload.ts | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/index.ts b/src/main/index.ts index 9c2a2533..7d8a00f4 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -163,6 +163,11 @@ const createWindow = (): void => { return res; }); + ipcMain.handle('download-unpax', async (event, connectionArgs, installationArgs, version, zoweConfig) => { + const res = await installActions.downloadUnpax(connectionArgs, installationArgs, version, zoweConfig); + return res; + }); + ipcMain.handle('init-certificates', async (event, connectionArgs, installationArgs, zoweConfig) => { const res = await installActions.runInitCertificates(connectionArgs, installationArgs, zoweConfig); return res; @@ -185,6 +190,11 @@ const createWindow = (): void => { return res; }); + ipcMain.handle('get-download-unpax-progress', async () => { + const res = ProgressStore.getAll()['downloadUnpax']; + return res; + }); + ipcMain.handle('get-certificate-progress', async (event) => { const res = ProgressStore.getAll()['certificate']; return res; diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 93a05505..19a712fb 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -79,6 +79,9 @@ contextBridge.exposeInMainWorld('electron', { installButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string, javaHome: string, nodeHome: string, installationType: string, userUploadedPaxPath: string}, version: string, zoweConfig: any, skipDownload: boolean) { return ipcRenderer.invoke("install-mvs", connectionArgs, installationArgs, version, zoweConfig, skipDownload); }, + downloadButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string, javaHome: string, nodeHome: string, installationType: string, userUploadedPaxPath: string}, version: string, zoweConfig: any) { + return ipcRenderer.invoke("download-unpax", connectionArgs, installationArgs, version, zoweConfig); + }, initCertsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { return ipcRenderer.invoke("init-certificates", connectionArgs, installationArgs, zoweConfig); }, @@ -91,6 +94,9 @@ contextBridge.exposeInMainWorld('electron', { getInstallationProgress() { return ipcRenderer.invoke("get-installation-progress"); }, + getDownloadUnpaxProgress() { + return ipcRenderer.invoke("get-download-unpax-progress"); + }, getCertificateProgress() { return ipcRenderer.invoke("get-certificate-progress"); }, From 6d57884a2ec12e5cdaed38b093f13469dad2b38a Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:27:03 -0400 Subject: [PATCH 024/455] Add progress state for upload/download and unpaxing Signed-off-by: Timothy Gerstel --- .../stages/progress/StageProgressStatus.ts | 39 ++++++++++++++++++- .../stages/progress/progressSlice.ts | 8 +++- src/storage/ProgressStore.ts | 7 +++- src/types/stateInterfaces.ts | 11 ++++++ 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 73d31278..5d11ad19 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -9,19 +9,29 @@ */ import { flatten, unflatten } from 'flat'; -import { ProgressState, PlanningState, InstallationType, ActiveState, DatasetInstallationState, InitSubStepsState, CertInitSubStepsState, PlanningValidationDetails, SkipState, InstallationArgs} from '../../../../types/stateInterfaces'; +import { ProgressState, PlanningState, InstallationType, ActiveState, DatasetInstallationState, InitSubStepsState, CertInitSubStepsState, PlanningValidationDetails, SkipState, InstallationArgs, DownloadUnpaxState} from '../../../../types/stateInterfaces'; import { stages } from '../../configuration-wizard/Wizard'; const installationTypeStatus: InstallationType = { installationType: 'download', licenseAgreement: false, userUploadedPaxPath: '', -} +} + +const downloadUnpaxStatus: DownloadUnpaxState = { + uploadYaml: false, + download: false, + upload: false, + unpax: false, + getExampleYaml: false, + getSchemas: false, +} const progressStatus: ProgressState = { connectionStatus: false, planningStatus: false, installationTypeStatus: false, + downloadUnpaxStatus: false, initializationStatus: false, datasetInstallationStatus: false, networkingStatus: false, @@ -86,6 +96,7 @@ const planningValidationDetailsStatus: PlanningValidationDetails = { } const stepSkipStatus: SkipState = { + downloadUnpax: false, datasetInstallation: false, networking: false, apfAuth: false, @@ -119,6 +130,7 @@ let progressStateKey = 'stage_progress'; let activeStateKey = 'active_state'; let planningStateKey = 'planning_stage'; let installationTypeKey = 'installation_type'; +let downloadUnpaxKey = 'download_unpax'; let datasetInstallationKey = 'dataset_installation'; let apfAuthKey = 'apf_auth'; let securityKey = 'security_init'; @@ -136,6 +148,7 @@ const setKeys = (id: string) => { activeStateKey = `${activeStateKey}_${id}`; planningStateKey = `${planningStateKey}_${id}`; installationTypeKey = `${installationTypeKey}_${id}`; + downloadUnpaxKey = `${downloadUnpaxKey}_${id}`; datasetInstallationKey = `${datasetInstallationKey}_${id}`; apfAuthKey = `${apfAuthKey}_${id}`; securityKey = `${securityKey}_${id}`; @@ -174,6 +187,12 @@ export const initializeProgress = (host: string, user: string) => { localStorage.setItem(installationTypeKey, JSON.stringify(flattenedData)); } + const downloadUnpaxState = localStorage.getItem(downloadUnpaxKey); + if(!downloadUnpaxState) { + const flattenedData = flatten(downloadUnpaxStatus); + localStorage.setItem(downloadUnpaxKey, JSON.stringify(flattenedData)); + } + const datasetInstallationState = localStorage.getItem(datasetInstallationKey); if(!datasetInstallationState) { const flattenedData = flatten(datasetInstallationStatus); @@ -230,6 +249,7 @@ export const mapAndSetSkipStatus = (subStageId: number, value: boolean): void => export const mapAndGetSkipStatus = (subStageId: number): boolean => { const skipStatus = getSubStageSkipStatus(); const skipStatusArray = [ + skipStatus.downloadUnpax, skipStatus.datasetInstallation, skipStatus.networking, skipStatus.apfAuth, @@ -376,6 +396,21 @@ export const getInstallationTypeStatus = (): InstallationType => { } } +export const setDownloadUnpaxState = (downloadUnpaxSteps: DownloadUnpaxState): void => { + Object.assign(downloadUnpaxStatus, downloadUnpaxSteps); + localStorage.setItem(downloadUnpaxKey, JSON.stringify(downloadUnpaxStatus)); +} + +export const getDownloadUnpaxState = (): DownloadUnpaxState => { + const downloadUnpaxState = localStorage.getItem(downloadUnpaxKey); + if(downloadUnpaxState) { + const flattenedData = JSON.parse(downloadUnpaxState); + return unflatten(flattenedData); + } else { + return downloadUnpaxStatus; + } +}; + export const setPlanningStageStatus = (key: K, newValue: PlanningState[K]): void => { const planningData = localStorage.getItem(planningStateKey); if (planningData) { diff --git a/src/renderer/components/stages/progress/progressSlice.ts b/src/renderer/components/stages/progress/progressSlice.ts index 3ba8bf8d..6fd8cc0e 100644 --- a/src/renderer/components/stages/progress/progressSlice.ts +++ b/src/renderer/components/stages/progress/progressSlice.ts @@ -17,6 +17,7 @@ const initialState: ProgressState = { connectionStatus: getProgress('connectionStatus') || false, planningStatus: getProgress('planningStatus') || false, installationTypeStatus: getProgress('installationTypeStatus') || false, + downloadUnpaxStatus: getProgress('downloadUnpaxStatus') || false, initializationStatus: getProgress('initializationStatus') || false, datasetInstallationStatus: getProgress('datasetInstallationStatus') || false, networkingStatus: getProgress('networkingStatus') || false, @@ -43,6 +44,10 @@ export const progressSlice = createSlice({ state.installationTypeStatus = action.payload; setProgress('installationTypeStatus', action.payload); }, + setDownloadUnpaxStatus: (state, action: PayloadAction) => { + state.downloadUnpaxStatus = action.payload; + setProgress('downloadUnpaxStatus', action.payload); + }, setInitializationStatus: (state, action: PayloadAction) => { if ( state.datasetInstallationStatus && @@ -94,11 +99,12 @@ export const progressSlice = createSlice({ } }); -export const { setConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setInitializationStatus, setDatasetInstallationStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setCertificateStatus, setVsamStatus, setLaunchConfigStatus, setReviewStatus } = progressSlice.actions; +export const { setConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setInitializationStatus, setDatasetInstallationStatus, setDownloadUnpaxStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setCertificateStatus, setVsamStatus, setLaunchConfigStatus, setReviewStatus } = progressSlice.actions; export const selectConnectionStatus = (state: RootState) => state.progress.connectionStatus; export const selectPlanningStatus = (state: RootState) => state.progress.planningStatus; export const selectInstallationTypeStatus = (state: RootState) => state.progress.installationTypeStatus; +export const selectIDownloadUnpaxStatus = (state: RootState) => state.progress.downloadUnpaxStatus; export const selectInitializationStatus = (state: RootState) => state.progress.initializationStatus; export const selectDatasetInstallationStatus= (state: RootState) => state.progress.datasetInstallationStatus; export const selectNetworkingStatus= (state: RootState) => state.progress.networkingStatus; diff --git a/src/storage/ProgressStore.ts b/src/storage/ProgressStore.ts index d73a8278..44825651 100644 --- a/src/storage/ProgressStore.ts +++ b/src/storage/ProgressStore.ts @@ -13,11 +13,16 @@ import Store from 'electron-store'; // TODO: Store overall progress and restore up to last successful step const storeDefault = { - "installation": { + "downloadUnpax": { "uploadYaml": false, "download": false, "upload": false, "unpax": false, + "getExampleYaml": false, + "getSchemas": false, + }, + "installation": { + "uploadYaml": false, "install": false, "initMVS": false }, diff --git a/src/types/stateInterfaces.ts b/src/types/stateInterfaces.ts index 87b0cc36..996d0f4a 100644 --- a/src/types/stateInterfaces.ts +++ b/src/types/stateInterfaces.ts @@ -12,6 +12,7 @@ export interface ProgressState { connectionStatus: boolean; planningStatus: boolean; installationTypeStatus: boolean; + downloadUnpaxStatus: boolean; initializationStatus: boolean; datasetInstallationStatus: boolean; networkingStatus: boolean; @@ -35,6 +36,15 @@ export interface InstallationType { userUploadedPaxPath: string; } +export interface DownloadUnpaxState { + uploadYaml: boolean; + download: boolean, + upload: boolean, + unpax: boolean, + getExampleYaml: boolean, + getSchemas: boolean +} + export interface ActiveState { activeStepIndex: number, isSubStep: boolean, @@ -73,6 +83,7 @@ export interface PlanningValidationDetails { } export interface SkipState { + downloadUnpax: boolean, datasetInstallation: boolean, networking: boolean, apfAuth: boolean, From e2b07b8be03b8844593166781fe27c6bd5514a94 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:28:09 -0400 Subject: [PATCH 025/455] Separate upload/download and unpaxing from installation and init mvs Signed-off-by: Timothy Gerstel --- src/actions/InstallActions.ts | 6 ++ src/actions/InstallationHandler.ts | 112 ++++++++++++++++++----------- 2 files changed, 77 insertions(+), 41 deletions(-) diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index 9e139714..5c4c9c96 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -41,6 +41,12 @@ export class InstallActions { return this.strategy.initCertificates(connectionArgs, installationArgs, zoweConfig) } + downloadUnpax(connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs, + version: string, zoweConfig: any): Promise { + return this.strategy.downloadUnpax(connectionArgs, installationArgs, version, zoweConfig); + } + runInstallation ( connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 32b58f7e..d6eecb07 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -21,12 +21,11 @@ import { InstallationArgs } from '../types/stateInterfaces'; class Installation { - public async runInstallation ( + public async downloadUnpax ( connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, version: string, zoweConfig: any, - skipDownload: boolean ): Promise { const currentConfig: any = ConfigurationStore.getConfig(); const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; @@ -39,55 +38,50 @@ class Installation { try { console.log("uploading yaml..."); const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); - ProgressStore.set('installation.uploadYaml', uploadYaml.status); + ProgressStore.set('downloadUnpax.uploadYaml', uploadYaml.status); if(!uploadYaml.status){ return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } let download, upload, unpax; - if(!skipDownload){ - if(installationArgs.installationType === "download"){ - console.log("downloading...", version); - download = await this.downloadPax(version); - ProgressStore.set('installation.download', download.status); - } else { - //if the user has selected an SMPE or opted to upload their own pax, we simply set this status to true as no download is required - download = {status: true, details: ''} - ProgressStore.set('installation.download', true); - } + if(installationArgs.installationType === "download"){ + console.log("downloading...", version); + download = await this.downloadPax(version); + ProgressStore.set('downloadUnpax.download', download.status); + } else { + //if the user has selected an SMPE or opted to upload their own pax, we simply set this status to true as no download is required + download = {status: true, details: ''} + ProgressStore.set('downloadUnpax.download', true); + } - if(!download.status){ - return {status: false, details: `Error downloading pax: ${download.details}`}; - } + if(!download.status){ + return {status: false, details: `Error downloading pax: ${download.details}`}; + } - console.log("uploading..."); - if(installationArgs.installationType === "upload"){ - //upload the PAX the user selected in the "Install Type" stage to the installation dir (from the planning stage) - console.log('Uploading user selected pax') - upload = await new FileTransfer().upload(connectionArgs, installationArgs.userUploadedPaxPath, path.join(installationArgs.installationDir, "zowe.pax"), DataType.BINARY) - } else if (installationArgs.installationType === "download"){ - console.log('Uploading pax downloaded from jfrog') - upload = await this.uploadPax(connectionArgs, installationArgs.installationDir); - } - ProgressStore.set('installation.upload', upload.status); + console.log("uploading..."); + if(installationArgs.installationType === "upload"){ + //upload the PAX the user selected in the "Install Type" stage to the installation dir (from the planning stage) + console.log('Uploading user selected pax') + upload = await new FileTransfer().upload(connectionArgs, installationArgs.userUploadedPaxPath, path.join(installationArgs.installationDir, "zowe.pax"), DataType.BINARY) + } else if (installationArgs.installationType === "download"){ + console.log('Uploading pax downloaded from jfrog') + upload = await this.uploadPax(connectionArgs, installationArgs.installationDir); + } + ProgressStore.set('downloadUnpax.upload', upload.status); - if(!upload.status){ - return {status: false, details: `Error uploading pax: ${upload.details}`}; - } + if(!upload.status){ + return {status: false, details: `Error uploading pax: ${upload.details}`}; + } - console.log("unpaxing..."); - unpax = await this.unpax(connectionArgs, installationArgs.installationDir); - ProgressStore.set('installation.unpax', unpax.status); + console.log("unpaxing..."); + unpax = await this.unpax(connectionArgs, installationArgs.installationDir); + ProgressStore.set('downloadUnpax.unpax', unpax.status); - if(!unpax.status){ - return {status: false, details: `Error unpaxing Zowe archive: ${unpax.details}`}; - } - } else { - //if the user has selected an SMPE or opted to upload their own pax, we simply set this status to true as no download is required - unpax = upload = download = {status: true, details: ''} - ProgressStore.set('installation.download', true); + if(!unpax.status){ + return {status: false, details: `Error unpaxing Zowe archive: ${unpax.details}`}; } + if(!download.status){ return {status: false, details: `Error downloading pax: ${download.details}`}; @@ -100,7 +94,7 @@ class Installation { if (!SMPE_INSTALL) { console.log("unpaxing..."); unpax = await this.unpax(connectionArgs, installationArgs.installationDir); - ProgressStore.set('installation.unpax', unpax.status); + ProgressStore.set('downloadUnpax.unpax', unpax.status); if (!unpax.status) { return {status: false, details: `Error unpaxing Zowe archive: ${unpax.details}`}; @@ -109,6 +103,7 @@ class Installation { let yamlObj let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); + let parsedSchema = false, parsedYaml = false; if(readPaxYamlAndSchema.details.yaml){ const parseExampleYamlFromPax = function(catPath: string){ const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat ${catPath}\\r\\n`) @@ -173,11 +168,14 @@ class Installation { } console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); + ProgressStore.set('downloadUnpax.getExampleYaml', true); } catch(e) { console.log('error parsing example-zowe.yaml:', e); + ProgressStore.set('downloadUnpax.getExampleYaml', false); } } else { console.log("no yaml found from pax"); + ProgressStore.set('downloadUnpax.getExampleYaml', false); } //No reason not to always set schema to latest if user is re-running installation @@ -207,14 +205,46 @@ class Installation { } console.log('Setting schema from runtime dir:', JSON.stringify(yamlSchema)); ConfigurationStore.setSchema(yamlSchema); + ProgressStore.set('downloadUnpax.getSchemas', true); } } catch (e) { console.log('error setting schema from pax:', e); + ProgressStore.set('downloadUnpax.getSchemas', false); } } } + return {status: download.status && uploadYaml.status && upload.status && unpax.status, details: {message: 'Zowe unpax successful.', mergedYaml: yamlObj}}; + } catch (error) { + return {status: false, details: error.message}; + } + } + + public async runInstallation ( + connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs, + version: string, + zoweConfig: any, + skipDownload: boolean + ): Promise { + const currentConfig: any = ConfigurationStore.getConfig(); + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; + const savingResult = await this.generateYamlFile(zoweConfig); + if (!savingResult.status) { + console.log("failed to save yaml"); + return savingResult; + } + + try { + console.log("uploading yaml..."); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + ProgressStore.set('installation.uploadYaml', uploadYaml.status); + + if(!uploadYaml.status){ + return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; + } + let installation; if (installationArgs.installationType !== "smpe") { console.log("installing..."); @@ -244,7 +274,7 @@ class Installation { return {status: false, details: `Error running zwe init mvs: ${initMvs.details}`}; } - return {status: download.status && uploadYaml.status && upload.status && unpax.status && installation.status && initMvs.status, details: {message: 'Zowe install successful.', mergedYaml: yamlObj}}; + return {status: installation.status && initMvs.status, details: {message: 'Zowe install successful.'}}; } catch (error) { return {status: false, details: error.message}; } From 0329c36b1f5d8b059d7be8cf7160e279698afbf1 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:40:17 -0400 Subject: [PATCH 026/455] Add download/upload + unpax status to stepper Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Stepper.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 7d0ae4db..6f6b1f77 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -18,10 +18,8 @@ import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import { Link } from 'react-router-dom'; import { selectConnectionStatus } from '../stages/progress/progressSlice'; -import { useAppSelector, useAppDispatch } from '../../hooks'; +import { useAppSelector } from '../../hooks'; import { selectNextStepEnabled } from '../configuration-wizard/wizardSlice'; -import { selectPlanningStatus, selectInitializationStatus, selectDatasetInstallationStatus, selectNetworkingStatus, selectApfAuthStatus, selectSecurityStatus, selectCertificateStatus, selectLaunchConfigStatus, selectReviewStatus } from '../stages/progress/progressSlice'; -import { selectInstallationTypeStatus } from '../stages/progress/progressSlice'; import { selectActiveStepIndex, selectActiveSubStepIndex } from '../stages/progress/activeStepSlice'; import { alertEmitter } from '../Header'; import EditorDialog from "./EditorDialog"; @@ -29,12 +27,11 @@ import savedInstall from '../../assets/saved-install-green.png'; import eventDispatcher from '../../../utils/eventDispatcher'; import Warning from '@mui/icons-material/Warning'; import CheckCircle from '@mui/icons-material/CheckCircle'; -import Home from '../Home'; import { getProgress, getCompleteProgress, mapAndSetSkipStatus, mapAndGetSkipStatus } from '../stages/progress/StageProgressStatus'; import '../../styles/Stepper.css'; import { StepIcon } from '@mui/material'; -import { stages } from '../configuration-wizard/Wizard'; +import { getStageDetails } from '../../../utils/StageDetails'; // TODO: define props, stages, stage interfaces // TODO: One rule in the store to enable/disable button @@ -42,8 +39,8 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const connectionStatus = useSelector(selectConnectionStatus); - const INIT_STAGE_ID = 3; - const REVIEW_STAGE_ID = 4; + const INIT_STAGE_ID = getStageDetails('Initialization').id;; + const REVIEW_STAGE_ID = getStageDetails('Review Installation').id; const completeProgress = getCompleteProgress(); @@ -51,6 +48,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages useSelector(selectConnectionStatus), completeProgress.planningStatus, completeProgress.installationTypeStatus, + completeProgress.downloadUnpaxStatus, completeProgress.initializationStatus, completeProgress.reviewStatus ]; @@ -125,8 +123,10 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const handleSkip = () => { stages[activeStep].isSkipped = true; - stages[activeStep].subStages[activeSubStep].isSkipped = true; - mapAndSetSkipStatus(activeSubStep, true); + if(stages[activeStep].subStages){ + stages[activeStep].subStages[activeSubStep].isSkipped = true; + mapAndSetSkipStatus(activeSubStep, true); + } handleNext(); } From 8817e40d1075915cd51e6f4e7a00ad58eded94eb Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:40:33 -0400 Subject: [PATCH 027/455] Add unpax to stepper Signed-off-by: Timothy Gerstel --- .../components/configuration-wizard/Wizard.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/configuration-wizard/Wizard.tsx b/src/renderer/components/configuration-wizard/Wizard.tsx index 2c8e6597..b001adfd 100644 --- a/src/renderer/components/configuration-wizard/Wizard.tsx +++ b/src/renderer/components/configuration-wizard/Wizard.tsx @@ -25,15 +25,17 @@ import InitApfAuth from '../stages/InitApfAuth'; import Networking from '../stages/Networking'; import Vsam from '../stages/Vsam'; import LaunchConfig from '../stages/LaunchConfig'; -import { getProgress } from '../stages/progress/StageProgressStatus'; +import { getInstallationTypeStatus, getProgress } from '../stages/progress/StageProgressStatus'; +import Unpax from '../stages/Unpax'; const mvsDatasetInitProgress = getProgress('datasetInstallationStatus'); export const stages = [ {id: 0, label: 'Connection', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue', statusKey: 'connectionStatus'}, {id: 1, label: 'Planning', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: true, steps: 3, nextButton: 'Continue to Installation Options', statusKey: 'planningStatus'}, - {id: 2, label: 'Installation Type', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue to Components Installation', statusKey: 'installationTypeStatus'}, - {id: 3, label: 'Initialization', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, subStages: [ + {id: 2, label: 'Installation Type', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: "Continue to Unpax", statusKey: 'installationTypeStatus'}, + {id: 3, label: 'Unpax', component: , hasJCL: false, isSkippable: true, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue to Components Installation', statusKey: 'downloadUnpaxStatus'}, + {id: 4, label: 'Initialization', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, subStages: [ {id: 0, label: 'Installation', component: , hasJCL: true, isSkippable: mvsDatasetInitProgress ?? false, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Network Setup', statusKey: 'datasetInstallationStatus'}, {id: 1, label: 'Networking', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to APF Auth Setup', statusKey: 'networkingStatus'}, {id: 2, label: 'APF Auth', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Security Setup', statusKey: 'apfAuthStatus'}, @@ -42,8 +44,8 @@ export const stages = [ {id: 5, label: 'Vsam', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Launch Setup', statusKey: 'vsamStatus'}, {id: 6, label: 'Launch Config', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Instance Setup', statusKey: 'launchConfigStatus'}, ], nextButton: 'Review', statusKey: 'initializationStatus'}, - {id: 4, label: 'Review Installation', component: , hasJCL: false, isSkippable: false, hasOutput: false, steps: 1, nextButton: 'Finish Installation', statusKey: 'reviewStatus'}, - {id: 5, label: 'Finish Installation', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, statusKey: 'finishStatus'}, + {id: 5, label: 'Review Installation', component: , hasJCL: false, isSkippable: false, hasOutput: false, steps: 1, nextButton: 'Finish Installation', statusKey: 'reviewStatus'}, + {id: 6, label: 'Finish Installation', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, statusKey: 'finishStatus'}, ] const Wizard = ({initialization}: {initialization: boolean}) => { From ba0afef52e1ae7a7260febb31c99d8696464d94c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:40:57 -0400 Subject: [PATCH 028/455] Add unpax status to review stage Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/ReviewInstallation.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index 15550283..ae20e146 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -20,7 +20,7 @@ import { useAppSelector, useAppDispatch } from '../../hooks'; import eventDispatcher from '../../../utils/eventDispatcher'; import EditorDialog from "../common/EditorDialog"; import { createTheme } from '@mui/material/styles'; -import { selectConnectionStatus, selectPlanningStatus, selectInstallationTypeStatus, selectInitializationStatus, selectDatasetInstallationStatus, selectNetworkingStatus, selectApfAuthStatus, selectSecurityStatus, selectCertificateStatus, selectLaunchConfigStatus, setReviewStatus } from './progress/progressSlice'; +import { selectConnectionStatus, setReviewStatus } from './progress/progressSlice'; import { setActiveStep } from './progress/activeStepSlice'; import { setNextStepEnabled } from '../configuration-wizard/wizardSlice'; import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; @@ -51,6 +51,7 @@ const ReviewInstallation = () => { completeProgress.planningStatus, completeProgress.installationTypeStatus, completeProgress.initializationStatus, + completeProgress.downloadUnpaxStatus ]; const subStageProgressStatus = [ From dcdbb9cfb4ba6292e7e7fee5af5af941b9b75fa6 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:43:34 -0400 Subject: [PATCH 029/455] Remove references to downloa d, upload, unpax. Bugfixes Signed-off-by: Timothy Gerstel --- src/actions/InstallActions.ts | 4 ++-- src/actions/InstallationHandler.ts | 1 - src/main/index.ts | 4 ++-- .../stages/installation/Installation.tsx | 20 +++++-------------- 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index 5c4c9c96..6d1e583d 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -50,8 +50,8 @@ export class InstallActions { runInstallation ( connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, - version: string, zoweConfig: any, skipDownload: boolean): Promise { - return this.strategy.runInstallation(connectionArgs, installationArgs, version, zoweConfig, skipDownload); + version: string, zoweConfig: any ): Promise { + return this.strategy.runInstallation(connectionArgs, installationArgs, version, zoweConfig); } initSecurity(connectionArgs: IIpcConnectionArgs, diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index d6eecb07..7dbae647 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -226,7 +226,6 @@ class Installation { installationArgs: InstallationArgs, version: string, zoweConfig: any, - skipDownload: boolean ): Promise { const currentConfig: any = ConfigurationStore.getConfig(); const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; diff --git a/src/main/index.ts b/src/main/index.ts index 7d8a00f4..b6ed05ec 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -158,8 +158,8 @@ const createWindow = (): void => { return res; }) - ipcMain.handle('install-mvs', async (event, connectionArgs, installationArgs, version, zoweConfig, skipDownload) => { - const res = await installActions.runInstallation(connectionArgs, installationArgs, version, zoweConfig, skipDownload); + ipcMain.handle('install-mvs', async (event, connectionArgs, installationArgs, version, zoweConfig) => { + const res = await installActions.runInstallation(connectionArgs, installationArgs, version, zoweConfig); return res; }); diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index b3019b74..e4b9bb2a 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -43,9 +43,6 @@ const Installation = () => { const theme = createTheme(); // TODO: Display granular details of installation - downloading - unpacking - running zwe command - - const stageId = 3; - const subStageId = 0; const dispatch = useAppDispatch(); // this schema will be used in the case where the user, for some reason, clicks "skip installation" without downloading or uploading a Zowe pax // Maybe we shouldnt allow the user to skip the installation stage?? @@ -205,7 +202,7 @@ const Installation = () => { setShowProgress(installationType!=='smpe' && (initClicked || getProgress('datasetInstallationStatus'))); if(initClicked) { - const nextPosition = document.getElementById('installation-progress'); + const nextPosition = document.getElementById('start-installation-progress'); nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end' }); setStateUpdated(!stateUpdated); dispatch(setDatasetInstallationStatus(false)); @@ -246,9 +243,9 @@ const Installation = () => { } const setStageSkipStatus = (status: boolean) => { - stages[stageId].subStages[subStageId].isSkipped = status; - stages[stageId].isSkipped = status; - mapAndSetSkipStatus(subStageId, status); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; + stages[STAGE_ID].isSkipped = status; + mapAndSetSkipStatus(SUB_STAGE_ID, status); } const setDsInstallStageStatus = (status: boolean) => { @@ -296,14 +293,10 @@ const Installation = () => { setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(true); dispatch(setLoading(false)); - window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml, skipDownload ?? false).then((res: IResponse) => { + window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml, true).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details, 'error'); } - if(res.details?.mergedYaml != undefined){ - dispatch(setYaml(res.details.mergedYaml)); - window.electron.ipcRenderer.setConfig(res.details.mergedYaml); - } updateProgress(true); clearInterval(timer); }).catch(() => { @@ -368,9 +361,6 @@ const Installation = () => { {!showProgress ? null : - - - From 47e740514e3f4f0c6b1f8f59592497c9f03513fa Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:43:47 -0400 Subject: [PATCH 030/455] Remove skip downloda arg Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index e4b9bb2a..d09a1266 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -274,7 +274,7 @@ const Installation = () => { setEditorVisible(!editorVisible); }; - const process = (event: any, skipDownload?: boolean) => { + const process = (event: any) => { if(!(installationType === 'smpe')) { setInitClicked(true); @@ -293,7 +293,7 @@ const Installation = () => { setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(true); dispatch(setLoading(false)); - window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml, true).then((res: IResponse) => { + window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details, 'error'); } From 56d0e3eacba82b32a92daa8df6f8ba07e0a66a65 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:44:11 -0400 Subject: [PATCH 031/455] Add stage to upload/download + unpax zowe archive Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Unpax.tsx | 161 +++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 src/renderer/components/stages/Unpax.tsx diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx new file mode 100644 index 00000000..3fb19df3 --- /dev/null +++ b/src/renderer/components/stages/Unpax.tsx @@ -0,0 +1,161 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import {useEffect, useState} from "react"; +import { Box, Button, Link, Typography } from '@mui/material'; +import ContainerCard from '../common/ContainerCard'; +import { useAppSelector, useAppDispatch } from '../../hooks'; +import { selectYaml, setLoading, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectInstallationArgs, selectZoweVersion} from './installation/installationSlice'; +import { selectConnectionArgs } from './connection/connectionSlice'; +import CheckCircle from '@mui/icons-material/CheckCircle'; +import { setActiveStep } from "./progress/activeStepSlice"; +import { getStageDetails } from "../../../utils/StageDetails"; +import { setDownloadUnpaxStatus } from './progress/progressSlice'; +import { getDownloadUnpaxState, getInstallationTypeStatus, getProgress, setDownloadUnpaxState } from "./progress/StageProgressStatus"; +import React from "react"; +import ProgressCard from "../common/ProgressCard"; +import { alertEmitter } from "../Header"; +import { IResponse } from "../../../types/interfaces"; +import { DownloadUnpaxState } from "../../../types/stateInterfaces"; + +const Unpax = () => { + + // TODO: Display granular details of installation - downloading - unpacking - running zwe command + + const stageLabel = 'Unpax'; + + const STAGE_ID = getStageDetails(stageLabel).id; + const SUB_STAGES = !!getStageDetails(stageLabel).subStages; + + const dispatch = useAppDispatch(); + const connectionArgs = useAppSelector(selectConnectionArgs); + const [installValue, setInstallValue] = useState(getInstallationTypeStatus()?.installationType || 'download'); + const [paxPath, setPaxPath] = useState(getInstallationTypeStatus()?.userUploadedPaxPath || ''); + const [showProgress, setShowProgress] = useState(getProgress('downloadUnpaxStatus')); + const [downloadUnpaxProgress, setDownloadUnpaxProgress] = useState(getDownloadUnpaxState()); + const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); + const version = useAppSelector(selectZoweVersion); + + const installationArgs = useAppSelector(selectInstallationArgs); + let timer: any; + + useEffect(() => { + if(!getProgress('downloadUnpaxStatus') && showProgress) { + timer = setInterval(() => { + window.electron.ipcRenderer.getDownloadUnpaxProgress().then((res: any) => { + setDownloadUnpaxProgress(res); + setDownloadUnpaxState(res); + if(downloadUnpaxProgress.uploadYaml && downloadUnpaxProgress.download && downloadUnpaxProgress.upload && downloadUnpaxProgress.unpax){ + dispatch(setNextStepEnabled(true)); + dispatch(setDownloadUnpaxStatus(true)); + clearInterval(timer); + } + }) + }, 3000); + } + return () => { + clearInterval(timer); + }; + }, [showProgress]); + + const process = (event: any) => { + event.preventDefault(); + setShowProgress(true); + dispatch(setDownloadUnpaxStatus(false)); + dispatch(setNextStepEnabled(false)); + window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, installationArgs, version, yaml).then((res: IResponse) => { + if(!res.status){ //errors during runInstallation() + alertEmitter.emit('showAlert', res.details, 'error'); + } + if(res.details?.mergedYaml != undefined){ + dispatch(setYaml(res.details.mergedYaml)); + window.electron.ipcRenderer.setConfig(res.details.mergedYaml); + } + dispatch(setNextStepEnabled(res.status)); + dispatch(setDownloadUnpaxStatus(res.status)); + clearInterval(timer); + }).catch(() => { + clearInterval(timer); + dispatch(setNextStepEnabled(false)); + }); + } + + useEffect(() => { + let nextPosition; + if(getProgress('downloadUnpaxStatus')) { + nextPosition = document.getElementById('download-progress-card'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + dispatch(setNextStepEnabled(getProgress('downloadUnpaxStatus') || installValue === "smpe")); + dispatch(setDownloadUnpaxStatus(getProgress('downloadUnpaxStatus') || installValue === "smpe")); + return () => { + dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: 0 })); + } + }, []); + + return (<> + {installValue === "smpe" && + + {`The SMP/E process has already downloaded the required Zowe runtime files. Please click skip or continue.`} + + } + {installValue === "download" && + + {`Zen will download the latest Zowe convenience build in PAX archive format from `} + {'https://zowe.org.'} + {` Skip this step if you have already downloaded Zowe.`} + + {!showProgress && + + } + {showProgress && + + + + + + + + + + } + } + {installValue === "upload" && + + {`Zen will upload and unpax the Zowe runtime files from ${paxPath}`} + + + + + {showProgress && + + + + + + + + + } + } + + ); +}; + +export default Unpax; \ No newline at end of file From 15b41bfb89086c7ba8faa99d0a8e13dc8dead9b8 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:53:54 -0400 Subject: [PATCH 032/455] Fix conflict Signed-off-by: Timothy Gerstel --- src/storage/ProgressStore.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/storage/ProgressStore.ts b/src/storage/ProgressStore.ts index cd7e0f0e..c0b47f82 100644 --- a/src/storage/ProgressStore.ts +++ b/src/storage/ProgressStore.ts @@ -13,13 +13,8 @@ import { DefaultStore } from './DefaultStore'; // TODO: Store overall progress and restore up to last successful step -<<<<<<< HEAD -const storeDefault = { - "downloadUnpax": { -======= const STORE_DEFAULT = { - "installation": { ->>>>>>> origin/v2.x/staging + "downloadUnpax": { "uploadYaml": false, "download": false, "upload": false, From 388e911d2e6c66dde7d0e437385a249d5bbcf092 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 19:58:06 -0400 Subject: [PATCH 033/455] Fix wonky scrolling Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index ab980ded..5cedbe14 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -195,7 +195,7 @@ const Installation = () => { setShowProgress(installationType!=='smpe' && (initClicked || getProgress('datasetInstallationStatus'))); if(initClicked) { - const nextPosition = document.getElementById('start-installation-progress'); + const nextPosition = document.getElementById('installation-progress'); nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end' }); setStateUpdated(!stateUpdated); dispatch(setDatasetInstallationStatus(false)); @@ -394,7 +394,7 @@ const Installation = () => { }
- +
); From 1c145362f22ef38c73e220d173027a31c63ce975 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 20:33:58 -0400 Subject: [PATCH 034/455] Remove unused imports, set download status false when installation type changes Signed-off-by: Timothy Gerstel --- .../stages/installation/InstallTypeSelection.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index 5f063a41..f6ca5752 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -8,21 +8,19 @@ * Copyright Contributors to the Zowe Project. */ -import {useEffect, useRef, useState} from "react"; +import {useEffect, useState} from "react"; import { Box, Button, FormControl, FormControlLabel, Link, Radio, RadioGroup, Typography } from '@mui/material'; import ContainerCard from '../../common/ContainerCard'; import { useAppSelector, useAppDispatch } from '../../../hooks'; import { setNextStepEnabled } from '../../configuration-wizard/wizardSlice'; -import { selectInstallationArgs, selectZoweVersion, setInstallationArgs, setInstallationType, setLicenseAgreement, setUserUploadedPaxPath, selectInstallationType, selectLicenseAgreement } from './installationSlice'; -import { setInstallationTypeStatus } from "../progress/progressSlice"; +import { selectInstallationArgs, setInstallationArgs, setInstallationType, setLicenseAgreement, setUserUploadedPaxPath } from './installationSlice'; +import { setDownloadUnpaxStatus, setInstallationTypeStatus } from "../progress/progressSlice"; import { selectConnectionArgs } from '../connection/connectionSlice'; import CheckCircle from '@mui/icons-material/CheckCircle'; import LicenseDialog from "./LicenseDialog"; import { setActiveStep } from "../progress/activeStepSlice"; import { getStageDetails } from "../../../../services/StageDetails"; import { getInstallationTypeStatus } from "../progress/StageProgressStatus"; -import { connect } from "http2"; - const InstallationType = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command @@ -82,6 +80,7 @@ const InstallationType = () => { } setInstallValue(type); updateProgress(false); + dispatch(setDownloadUnpaxStatus(false)); } return ( From 067e2f21788edc4b24af5124f83b76218d866d4f Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 20:34:27 -0400 Subject: [PATCH 035/455] Fix smpe + upload install types Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index d4d1a970..94ba98c7 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -29,7 +29,7 @@ import { Checkbox, FormControlLabel } from "@mui/material"; import { setActiveStep } from './progress/activeStepSlice'; import EditorDialog from "../common/EditorDialog"; import { getStageDetails } from "../../../services/StageDetails"; -import { getProgress, getPlanningStageStatus, setPlanningValidationDetailsState, getPlanningValidationDetailsState } from "./progress/StageProgressStatus"; +import { getProgress, getPlanningStageStatus, setPlanningValidationDetailsState, getPlanningValidationDetailsState, getInstallationTypeStatus } from "./progress/StageProgressStatus"; import { FALLBACK_YAML } from "../common/Constants"; // TODO: Our current theoretical cap is 72 (possibly minus a couple for "\n", 70?) But we force more chars in InstallationHandler.tsx @@ -141,7 +141,7 @@ const Planning = () => { const workspaceParent = getParentDir(res.details?.zowe?.workspaceDirectory); if (runtimeParent === workspaceParent) installationDir = runtimeParent; } - dispatch(setInstallationArgs({...installationArgs, installationDir: res.details?.zowe?.runtimeDirectory ?? ''})); + dispatch(setInstallationArgs({...installationArgs, installationDir: res.details?.zowe?.runtimeDirectory ?? '', installationType: getInstallationTypeStatus()?.installationType, userUploadedPaxPath: getInstallationTypeStatus()?.userUploadedPaxPath})); } }) From dbcc5ec55f082b9eeea20d5451c8ddc9123db6bf Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 20:34:50 -0400 Subject: [PATCH 036/455] Get latest installation args Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Unpax.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index b7336fd1..427ad740 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -44,7 +44,7 @@ const Unpax = () => { const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); const version = useAppSelector(selectZoweVersion); - const installationArgs = useAppSelector(selectInstallationArgs); + const [installationArgs, setInstArgs] = useState(useAppSelector(selectInstallationArgs)); let timer: any; useEffect(() => { @@ -89,6 +89,11 @@ const Unpax = () => { } useEffect(() => { + window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { + if(res != undefined){ + setInstArgs((res as any)); + } + }) let nextPosition; if(getProgress('downloadUnpaxStatus')) { nextPosition = document.getElementById('download-progress-card'); @@ -136,13 +141,13 @@ const Unpax = () => { {`Zen will upload and unpax the Zowe runtime files from ${paxPath}`} - + {!showProgress && - + } {showProgress && From 362001a8e485749b987d61de1050dac726797bb7 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 20:51:40 -0400 Subject: [PATCH 037/455] Reset unpax stage when pax path changes Signed-off-by: Timothy Gerstel --- .../components/stages/installation/InstallTypeSelection.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index f6ca5752..7b58acb8 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -54,6 +54,10 @@ const InstallationType = () => { }, [installValue, paxPath, installationArgs, agreeLicense]); + useEffect(() => { + dispatch(setDownloadUnpaxStatus(false)); + }, [paxPath]) + const updateProgress = (status: boolean): void => { dispatch(setInstallationTypeStatus(status)) dispatch(setNextStepEnabled(status)); From 97a03ab95cba4c1a5aaf3e340edd67698687b76d Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 21:16:47 -0400 Subject: [PATCH 038/455] Remove console log Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index ffe56525..b12543ff 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -166,7 +166,7 @@ class Installation { if (zoweConfig) { yamlObj = {...yamlObj, ...zoweConfig}; } - console.log('Setting merged yaml:', JSON.stringify(yamlObj)); + // console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); ProgressStore.set('downloadUnpax.getExampleYaml', true); } catch(e) { From 0bc1ce01bbcbbfc3fe1d2ea0e07deb479ff2c554 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 22:28:28 -0400 Subject: [PATCH 039/455] Allow progress cards to restart properly Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Unpax.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 427ad740..53b01a39 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -48,12 +48,13 @@ const Unpax = () => { let timer: any; useEffect(() => { - if(!getProgress('downloadUnpaxStatus') && showProgress) { + const stageComplete = downloadUnpaxProgress.uploadYaml && downloadUnpaxProgress.download && downloadUnpaxProgress.upload && downloadUnpaxProgress.unpax; + if(!stageComplete && showProgress) { timer = setInterval(() => { window.electron.ipcRenderer.getDownloadUnpaxProgress().then((res: any) => { setDownloadUnpaxProgress(res); setDownloadUnpaxState(res); - if(downloadUnpaxProgress.uploadYaml && downloadUnpaxProgress.download && downloadUnpaxProgress.upload && downloadUnpaxProgress.unpax){ + if(stageComplete){ dispatch(setNextStepEnabled(true)); dispatch(setDownloadUnpaxStatus(true)); clearInterval(timer); From 6c63011e1ce9c10a9e31942d6ef8e49bab740001 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 22:45:41 -0400 Subject: [PATCH 040/455] Reset state when upload/download is pressed Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Unpax.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 53b01a39..31680aa2 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -19,7 +19,7 @@ import CheckCircle from '@mui/icons-material/CheckCircle'; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails } from "../../../services/StageDetails"; import { setDownloadUnpaxStatus } from './progress/progressSlice'; -import { getDownloadUnpaxState, getInstallationTypeStatus, getProgress, setDownloadUnpaxState } from "./progress/StageProgressStatus"; +import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationTypeStatus, getProgress, setDownloadUnpaxState } from "./progress/StageProgressStatus"; import React from "react"; import ProgressCard from "../common/ProgressCard"; import { alertEmitter } from "../Header"; @@ -71,6 +71,7 @@ const Unpax = () => { event.preventDefault(); setShowProgress(true); dispatch(setDownloadUnpaxStatus(false)); + setDownloadUnpaxProgress(downloadUnpaxStatus); dispatch(setNextStepEnabled(false)); window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, installationArgs, version, yaml).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() From 09d052cb079d59bd306170d2346f1eaed9666ea3 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 22:46:03 -0400 Subject: [PATCH 041/455] Export const Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/progress/StageProgressStatus.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 5d11ad19..c8021ec9 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -18,7 +18,7 @@ const installationTypeStatus: InstallationType = { userUploadedPaxPath: '', } -const downloadUnpaxStatus: DownloadUnpaxState = { +export const downloadUnpaxStatus: DownloadUnpaxState = { uploadYaml: false, download: false, upload: false, From 7d754528089b3b2a79b09fac7d8e870d4edf29f9 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 23:11:09 -0400 Subject: [PATCH 042/455] Move stage labels to Constants.tsx Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Constants.tsx | 16 ++++++++++ src/renderer/components/common/Stepper.tsx | 6 ++-- .../configuration-wizard/Wizard.tsx | 29 ++++++++++--------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/renderer/components/common/Constants.tsx b/src/renderer/components/common/Constants.tsx index 8ff0cd93..f4a22739 100644 --- a/src/renderer/components/common/Constants.tsx +++ b/src/renderer/components/common/Constants.tsx @@ -19,6 +19,22 @@ export const TYPE_OUTPUT = "output"; export const DEF_NO_OUTPUT = "No output to display." export const DEF_JOB_STATEMENT = `//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A,\n// MSGLEVEL=(1,1),MSGCLASS=A`; +export const CONNECTION_STAGE_LABEL = "Connection"; +export const PLANNING_STAGE_LABEL = "Planning"; +export const INSTALLATION_TYPE_STAGE_LABEL = "Installation Type"; +export const UNPAX_STAGE_LABEL = "Unpax"; +export const INIT_STAGE_LABEL = "Initialization"; +export const INSTALL_STAGE_LABEL = "Installation"; +export const NETWORKING_STAGE_LABEL = "Networking"; +export const APF_AUTH_STAGE_LABEL = "APF Auth"; +export const SECURITY_STAGE_LABEL = "Security"; +export const CERTIFICATES_STAGE_LABEL = "Certificates"; +export const VSAM_STAGE_LABEL = "Vsam"; +export const LAUNCH_CONFIG_STAGE_LABEL = "Launch Config"; +export const REVIEW_INSTALL_STAGE_LABEL = "Review Installation"; +export const FINISH_INSTALL_STAGE_LABEL = "Finish Installation"; + + export const FALLBACK_SCHEMA = { "$schema": "https://json-schema.org/draft/2019-09/schema", "$id": "https://zowe.org/schemas/v2/server-base", diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index c014de39..04bbb11d 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -27,7 +27,7 @@ import savedInstall from '../../assets/saved-install-green.png'; import eventDispatcher from '../../../services/eventDispatcher'; import Warning from '@mui/icons-material/Warning'; import CheckCircle from '@mui/icons-material/CheckCircle'; -import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL } from '../common/Constants'; +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, INIT_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL } from '../common/Constants'; import { getProgress, getCompleteProgress, mapAndSetSkipStatus, mapAndGetSkipStatus } from '../stages/progress/StageProgressStatus'; import '../../styles/Stepper.css'; @@ -40,8 +40,8 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const connectionStatus = useSelector(selectConnectionStatus); - const INIT_STAGE_ID = getStageDetails('Initialization').id;; - const REVIEW_STAGE_ID = getStageDetails('Review Installation').id; + const INIT_STAGE_ID = getStageDetails(INIT_STAGE_LABEL).id; + const REVIEW_STAGE_ID = getStageDetails(REVIEW_INSTALL_STAGE_LABEL).id; const completeProgress = getCompleteProgress(); diff --git a/src/renderer/components/configuration-wizard/Wizard.tsx b/src/renderer/components/configuration-wizard/Wizard.tsx index b001adfd..1516449e 100644 --- a/src/renderer/components/configuration-wizard/Wizard.tsx +++ b/src/renderer/components/configuration-wizard/Wizard.tsx @@ -27,25 +27,26 @@ import Vsam from '../stages/Vsam'; import LaunchConfig from '../stages/LaunchConfig'; import { getInstallationTypeStatus, getProgress } from '../stages/progress/StageProgressStatus'; import Unpax from '../stages/Unpax'; +import { APF_AUTH_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, CONNECTION_STAGE_LABEL, FINISH_INSTALL_STAGE_LABEL, INIT_STAGE_LABEL, INSTALLATION_TYPE_STAGE_LABEL, INSTALL_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL, NETWORKING_STAGE_LABEL, PLANNING_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, SECURITY_STAGE_LABEL, UNPAX_STAGE_LABEL, VSAM_STAGE_LABEL } from '../common/Constants'; const mvsDatasetInitProgress = getProgress('datasetInstallationStatus'); export const stages = [ - {id: 0, label: 'Connection', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue', statusKey: 'connectionStatus'}, - {id: 1, label: 'Planning', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: true, steps: 3, nextButton: 'Continue to Installation Options', statusKey: 'planningStatus'}, - {id: 2, label: 'Installation Type', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: "Continue to Unpax", statusKey: 'installationTypeStatus'}, - {id: 3, label: 'Unpax', component: , hasJCL: false, isSkippable: true, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue to Components Installation', statusKey: 'downloadUnpaxStatus'}, - {id: 4, label: 'Initialization', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, subStages: [ - {id: 0, label: 'Installation', component: , hasJCL: true, isSkippable: mvsDatasetInitProgress ?? false, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Network Setup', statusKey: 'datasetInstallationStatus'}, - {id: 1, label: 'Networking', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to APF Auth Setup', statusKey: 'networkingStatus'}, - {id: 2, label: 'APF Auth', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Security Setup', statusKey: 'apfAuthStatus'}, - {id: 3, label: 'Security', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Certificates Setup', statusKey: 'securityStatus'}, - {id: 4, label: 'Certificates', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Vsam Setup', statusKey: 'certificateStatus'}, - {id: 5, label: 'Vsam', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Launch Setup', statusKey: 'vsamStatus'}, - {id: 6, label: 'Launch Config', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Instance Setup', statusKey: 'launchConfigStatus'}, + {id: 0, label: CONNECTION_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue', statusKey: 'connectionStatus'}, + {id: 1, label: PLANNING_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: true, steps: 3, nextButton: 'Continue to Installation Options', statusKey: 'planningStatus'}, + {id: 2, label: INSTALLATION_TYPE_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: "Continue to Unpax", statusKey: 'installationTypeStatus'}, + {id: 3, label: UNPAX_STAGE_LABEL, component: , hasJCL: false, isSkippable: true, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue to Components Installation', statusKey: 'downloadUnpaxStatus'}, + {id: 4, label: INIT_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, subStages: [ + {id: 0, label: INSTALL_STAGE_LABEL, component: , hasJCL: true, isSkippable: mvsDatasetInitProgress ?? false, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Network Setup', statusKey: 'datasetInstallationStatus'}, + {id: 1, label: NETWORKING_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to APF Auth Setup', statusKey: 'networkingStatus'}, + {id: 2, label: APF_AUTH_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Security Setup', statusKey: 'apfAuthStatus'}, + {id: 3, label: SECURITY_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Certificates Setup', statusKey: 'securityStatus'}, + {id: 4, label: CERTIFICATES_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Vsam Setup', statusKey: 'certificateStatus'}, + {id: 5, label: VSAM_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Launch Setup', statusKey: 'vsamStatus'}, + {id: 6, label: LAUNCH_CONFIG_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Instance Setup', statusKey: 'launchConfigStatus'}, ], nextButton: 'Review', statusKey: 'initializationStatus'}, - {id: 5, label: 'Review Installation', component: , hasJCL: false, isSkippable: false, hasOutput: false, steps: 1, nextButton: 'Finish Installation', statusKey: 'reviewStatus'}, - {id: 6, label: 'Finish Installation', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, statusKey: 'finishStatus'}, + {id: 5, label: REVIEW_INSTALL_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, hasOutput: false, steps: 1, nextButton: 'Finish Installation', statusKey: 'reviewStatus'}, + {id: 6, label: FINISH_INSTALL_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, statusKey: 'finishStatus'}, ] const Wizard = ({initialization}: {initialization: boolean}) => { From e13d57c47061299eeb21ace4189df422d674d5a9 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 23:24:54 -0400 Subject: [PATCH 043/455] Remove console.logs Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index b12543ff..5168f49d 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -119,10 +119,10 @@ class Installation { try { yamlObj = parse(yamlFromPax); if (currentConfig) { - console.log("current config:", JSON.stringify(currentConfig)); + // console.log("current config:", JSON.stringify(currentConfig)); // console.log("yamlObj: ", JSON.stringify(yamlObj)); yamlObj = {...currentConfig, ...yamlObj} - console.log("merged yamlObj: ", JSON.stringify(yamlObj)); + // console.log("merged yamlObj: ", JSON.stringify(yamlObj)); } if (yamlObj.zowe.runtimeDirectory === undefined && installationArgs.installationDir) { yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; @@ -203,7 +203,7 @@ class Installation { delete yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; yamlSchema.$defs.networkSettings.properties.server.properties.listenAddresses.items = serverCommon.$defs.ipv4 } - console.log('Setting schema from runtime dir:', JSON.stringify(yamlSchema)); + // console.log('Setting schema from runtime dir:', JSON.stringify(yamlSchema)); ConfigurationStore.setSchema(yamlSchema); ProgressStore.set('downloadUnpax.getSchemas', true); } From 91dc9bf5f0fce77a30ce582552ff6fc09906b18b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 4 Jun 2024 23:41:13 -0400 Subject: [PATCH 044/455] Update upload pax description Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Unpax.tsx | 2 +- .../components/stages/installation/InstallTypeSelection.tsx | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 31680aa2..a8e19008 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -141,7 +141,7 @@ const Unpax = () => {
} {installValue === "upload" && - {`Zen will upload and unpax the Zowe runtime files from ${paxPath}`} + {`Zen will upload and unpax the Zowe runtime files from ${paxPath}. Skip this step if you have already uploaded a Zowe pax.`} {!showProgress && : null} From c516c6b56bcda6d2575a57a84b53d7e8254b2651 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 01:36:19 -0400 Subject: [PATCH 047/455] Add keys to list objects to remove warning Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Networking.tsx | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index db1c9e9d..7a9d5481 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -38,7 +38,7 @@ function PatternPropertiesForm(props: any){ for (let i = 0; i < keys.length && i < LOOP_LIMIT; i++) { //i = go through each property of the yaml if (props.schema.properties[keys[i]].patternProperties != undefined) { //only for rendering patternProperties if(typeof yaml[keys[i]] === "object" && Object.keys(yaml[keys[i]]).length > 0) { - newElements.push(

{keys[i]}

); + newElements.push(

{keys[i]}

); const patterns = Object.keys(props.schema.properties[keys[i]].patternProperties); //get all user defined regex patterns for(let j = 0; j < patterns.length && j < LOOP_LIMIT; j++){ //j = go through each pattern const pattern = new RegExp(patterns[j]); @@ -50,8 +50,8 @@ function PatternPropertiesForm(props: any){ // console.log('matched pattern ' + pattern + ' to ' + toMatch[k] + ' for key' + keys[i]); const matchedProps = Object.keys(yamlValue[toMatch[k]]); if(matchedProps.length > 0) { - newElements.push({toMatch[k]}) - newElements.push(
); + newElements.push({toMatch[k]}) + newElements.push(
); // console.log('matchedProps:', matchedProps); for(let l = 0; l < matchedProps.length && l < LOOP_LIMIT; l++){ // pattern = patterns[j] = current regex pattern from patternProperties @@ -62,7 +62,7 @@ function PatternPropertiesForm(props: any){ case 'boolean': newElements.push( { // console.log('new yaml:', JSON.stringify({...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}})); const newYaml = {...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}}; @@ -71,13 +71,13 @@ function PatternPropertiesForm(props: any){ dispatch(setYaml(newYaml)); }}/>} />) - newElements.push(
); + newElements.push(
); break; case 'number': newElements.push( { const newYaml = {...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: Number(e.target.value)}}}; @@ -90,7 +90,7 @@ function PatternPropertiesForm(props: any){ break; } } - newElements.push(
); + newElements.push(
); } } } @@ -721,24 +721,25 @@ const Networking = () => { return ( yaml && schema &&
- - - + + + {editorVisible && } dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
} -

External Domains { +

External Domains { let domains = [...yaml.zowe?.externalDomains, ""]; const newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: domains}}; window.electron.ipcRenderer.setConfig(newYaml ) dispatch(setYaml(newYaml)) setLYaml(newYaml); }}>

- {yaml.zowe.externalDomains != undefined && yaml.zowe.externalDomains.map((domain: string, index: number) => { let domains = [...yaml.zowe?.externalDomains]; domains[index] = e.target.value; From 1df824e984b5a8aa099be2cd50d33638974456e4 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 02:10:45 -0400 Subject: [PATCH 048/455] Fix init not using correct values from input Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 5cedbe14..2629f9ab 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -159,7 +159,6 @@ const Installation = () => { // console.log('got config:', JSON.stringify(res.details)); let yamlObj = mergeInstallationArgsAndYaml(res.details); if(res.details.zowe?.setup?.dataset === undefined){ - // console.log('setting yaml:',{...yamlObj, zowe: {...yamlObj.zowe, setup: {...yamlObj.zowe.setup, dataset: FALLBACK_YAML.zowe.setup.dataset}} }); dispatch(setYaml({...yamlObj, zowe: {...yamlObj.zowe, setup: {...yamlObj.zowe.setup, dataset: FALLBACK_YAML.zowe.setup.dataset}} })); } else { dispatch(setYaml(yamlObj)); @@ -350,6 +349,7 @@ const Installation = () => { setStageConfig(false, errPath+' '+errMsg, updatedData); } else { const newYaml = {...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, dataset: updatedData}}}; + setLYaml(newYaml); await window.electron.ipcRenderer.setConfig(newYaml) setStageConfig(true, '', updatedData); } From ddb9874c26366aa1a24e3cdb159d727a33773e03 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 5 Jun 2024 15:20:08 +0530 Subject: [PATCH 049/455] Updating the installation handler for error handling --- src/actions/InstallationHandler.ts | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 74227c2f..e58d5b14 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -313,9 +313,9 @@ class Installation { const filePath = path.join(app.getPath('temp'), 'zowe.yaml') await fs.writeFile(filePath, stringify(zoweConfig), (err) => { if (err) { - console.warn("Can't save configuration to zowe.yaml"); - ProgressStore.set('initStcs.writeYaml', false); - return {status: false, details: `Can't save configuration to zowe.yaml`}; + console.warn("Can't save configuration to zowe.yaml"); + ProgressStore.set('initStcs.writeYaml', false); + return {status: false, details: `Can't save configuration to zowe.yaml`}; } }); ProgressStore.set('initStcs.writeYaml', true); @@ -327,8 +327,21 @@ class Installation { ProgressStore.set('initStcs.uploadYaml', uploadYaml.status); const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init stc -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); - ProgressStore.set('initStcs.success', result.rc === 0); - return {status: result.rc === 0, details: result.jobOutput} + let errorFound = false; + let errorMessage = ''; + const errorPattern = /Error ZWE.*/; + for (const key in result.jobOutput) { + const match = result.jobOutput[key].match(errorPattern); + if (match) { + errorFound = true; + errorMessage = match[0]; + break; + } + } + + ProgressStore.set('initStcs.success', result.rc === 0 && !errorFound); + return {status: result.rc === 0 && !errorFound, details: result.jobOutput, error: errorFound, errorMsg: errorMessage } + } async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string}, zoweConfig: any){ From 4d234412db09682eff6ba0a3050befbed89476b2 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 5 Jun 2024 15:20:56 +0530 Subject: [PATCH 050/455] Updating stc and the yaml --- src/renderer/components/stages/Stcs.tsx | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 55206216..e02c6759 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -25,7 +25,7 @@ import React from "react"; import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; -import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; +import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { setProgress, getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; @@ -65,8 +65,11 @@ const Stcs = () => { let timer: any; const section = 'stcs'; + const DEFAULT_ZOWE = 'ZWESLSTC'; + const DEFAULT_ZIS = 'ZWESISTC'; + const DEFAULT_AUX = 'ZWESASTC'; - const defaultErrorMessage = "Please ensure that the values for security.stcs attributes are accurate."; + const defaultErrorMessage = "Please ensure that the values for security.stcs attributes and dataset.proclib are accurate."; const ajv = new Ajv(); ajv.addKeyword("$anchor"); @@ -96,6 +99,14 @@ const Stcs = () => { updateProgress(getProgress('stcsStatus')); setInit(true); + if(!setupYaml) { + const newYaml = {...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, security: {...yaml.zowe.setup.security, stcs: {zowe: DEFAULT_ZOWE, zis: DEFAULT_ZIS, aux: DEFAULT_AUX}}}}}; + window.electron.ipcRenderer.setConfig(newYaml); + setSetupYaml({zowe: DEFAULT_ZOWE, zis: DEFAULT_ZIS, aux: DEFAULT_AUX}); + setLYaml(newYaml); + dispatch(setYaml(newYaml)); + } + return () => { alertEmitter.emit('hideAlert'); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); @@ -251,7 +262,7 @@ const Stcs = () => { label="Zowe" multiline maxRows={6} - value={setupYaml?.zowe ?? "ZWESLSTC"} + value={setupYaml?.zowe ?? DEFAULT_ZOWE} variant="filled" disabled /> @@ -262,7 +273,7 @@ const Stcs = () => { label="Zis" multiline maxRows={6} - value={setupYaml?.zis ?? "ZWESISTC"} + value={setupYaml?.zis ?? DEFAULT_ZIS} variant="filled" disabled /> @@ -273,7 +284,7 @@ const Stcs = () => { label="Aux" multiline maxRows={6} - value={setupYaml?.aux ?? "ZWESASTC"} + value={setupYaml?.aux ?? DEFAULT_AUX} variant="filled" disabled /> From fd33dae904f58a1387093dae89852dcfa8589d50 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 5 Jun 2024 15:45:55 +0530 Subject: [PATCH 051/455] Updating the styling --- src/renderer/components/stages/Stcs.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index e02c6759..529fdcaa 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -306,7 +306,7 @@ const Stcs = () => { } - +
From ca4cf5c525e98b5b1c7820a153efb9a275550a7d Mon Sep 17 00:00:00 2001 From: 1000TurquoisePogs Date: Wed, 5 Jun 2024 13:40:46 +0200 Subject: [PATCH 052/455] Update build_test.yml Signed-off-by: 1000TurquoisePogs --- .github/workflows/build_test.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 7f1ddc6d..58bd278d 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -78,14 +78,17 @@ jobs: node-version: 18 - name: '[Prep 3] Checkout' uses: actions/checkout@v3 - - name: '[prep 4] Install' + - name: '[Prep 4] Install Python 3.11.4 for appdmg compatibility' + uses: actions/setup-python@v4 + with: + python-version: '3.11.4' + - name: '[prep 5] Install' run: | - python3 -m pip install setuptools npm install - - name: '[prep 5] Package' + - name: '[prep 6] Package' run: | npm run make - - name: '[prep 6] Publish' + - name: '[prep 7] Publish' uses: zowe-actions/zlux-builds/zen/publish@v2.x/main with: os: macos From f6ce852d77ab7fd8107cff09d726252c114e1481 Mon Sep 17 00:00:00 2001 From: 1000TurquoisePogs Date: Wed, 5 Jun 2024 13:52:06 +0200 Subject: [PATCH 053/455] Update build_test.yml Signed-off-by: 1000TurquoisePogs --- .github/workflows/build_test.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 58bd278d..315d24df 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -82,6 +82,10 @@ jobs: uses: actions/setup-python@v4 with: python-version: '3.11.4' + - name: 'setup appdmg' + run: | + python3 -m pip install setuptools + npm install -g appdmg@0.6.6 - name: '[prep 5] Install' run: | npm install From 66b51a6047db02bfdfda6dfa0c4ae734d2348737 Mon Sep 17 00:00:00 2001 From: 1000TurquoisePogs Date: Wed, 5 Jun 2024 13:59:15 +0200 Subject: [PATCH 054/455] Update build_test.yml Signed-off-by: 1000TurquoisePogs --- .github/workflows/build_test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 315d24df..2e31c5e8 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -78,10 +78,10 @@ jobs: node-version: 18 - name: '[Prep 3] Checkout' uses: actions/checkout@v3 - - name: '[Prep 4] Install Python 3.11.4 for appdmg compatibility' - uses: actions/setup-python@v4 + - name: '[Prep 4] Install Python 3.12 for appdmg' + uses: actions/setup-python@v5 with: - python-version: '3.11.4' + python-version: '3.12' - name: 'setup appdmg' run: | python3 -m pip install setuptools @@ -93,7 +93,7 @@ jobs: run: | npm run make - name: '[prep 7] Publish' - uses: zowe-actions/zlux-builds/zen/publish@v2.x/main + uses: zowe-actions/zlux-builds/zen/publish@arm64-osx with: os: macos From 0b4dd5eb28a0823651b91ef1bb01d5ff250df0f8 Mon Sep 17 00:00:00 2001 From: 1000TurquoisePogs Date: Wed, 5 Jun 2024 14:06:57 +0200 Subject: [PATCH 055/455] Update build_test.yml Signed-off-by: 1000TurquoisePogs --- .github/workflows/build_test.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 2e31c5e8..d1b950c5 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -78,16 +78,13 @@ jobs: node-version: 18 - name: '[Prep 3] Checkout' uses: actions/checkout@v3 - - name: '[Prep 4] Install Python 3.12 for appdmg' + - name: '[Prep 4] Install Python 3.12 for npm appdmg' uses: actions/setup-python@v5 with: python-version: '3.12' - - name: 'setup appdmg' - run: | - python3 -m pip install setuptools - npm install -g appdmg@0.6.6 - name: '[prep 5] Install' run: | + python3 -m pip install setuptools npm install - name: '[prep 6] Package' run: | From 8fda1f20870bf9322637e78eb2f8c95c4b5062db Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 5 Jun 2024 18:16:58 +0530 Subject: [PATCH 056/455] Temporary changes --- src/renderer/components/stages/installation/Installation.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index ddb76dc6..f946f6b7 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -247,6 +247,7 @@ const Installation = () => { const setDsInstallStageStatus = (status: boolean) => { dispatch(setNextStepEnabled(status)); + dispatch(setNextStepEnabled(true)); dispatch(setInitializationStatus(status)); dispatch(setDatasetInstallationStatus(status)); } @@ -336,6 +337,7 @@ const Installation = () => { // True - a proceed, False - blocked const installProceedActions = (status: boolean) => { dispatch(setNextStepEnabled(status)); + dispatch(setNextStepEnabled(true)); dispatch(setDatasetInstallationStatus(status)); dispatch(setInitializationStatus(status)); } From 847731d3133dae9ec523f8668b084ef3bbae9b26 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 5 Jun 2024 18:42:42 +0530 Subject: [PATCH 057/455] Removing the duplicate stageId --- .../components/stages/installation/Installation.tsx | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index ddb76dc6..ff14bcad 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -44,9 +44,6 @@ const Installation = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - // TODO: Why are there two sets of stageId/STAGE_ID's? - const stageId = 3; - const subStageId = 0; const dispatch = useAppDispatch(); // this schema will be used in the case where the user, for some reason, clicks "skip installation" without downloading or uploading a Zowe pax // Maybe we shouldnt allow the user to skip the installation stage?? @@ -240,9 +237,9 @@ const Installation = () => { } const setStageSkipStatus = (status: boolean) => { - stages[stageId].subStages[subStageId].isSkipped = status; - stages[stageId].isSkipped = status; - mapAndSetSkipStatus(subStageId, status); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; + stages[STAGE_ID].isSkipped = status; + mapAndSetSkipStatus(SUB_STAGE_ID, status); } const setDsInstallStageStatus = (status: boolean) => { @@ -321,8 +318,8 @@ const Installation = () => { clearInterval(timer); updateProgress(false); installProceedActions(false); - stages[stageId].subStages[subStageId].isSkipped = true; - stages[stageId].isSkipped = true; + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; + stages[STAGE_ID].isSkipped = true; if (typeof err === "string") { console.warn('Installation failed', err); } else { From 5d9e0b9cd5c54c1c26d04b296d74d17dd42be869 Mon Sep 17 00:00:00 2001 From: 1000TurquoisePogs Date: Wed, 5 Jun 2024 15:18:05 +0200 Subject: [PATCH 058/455] reset to main action Signed-off-by: 1000TurquoisePogs --- .github/workflows/build_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index d1b950c5..c3d93b7b 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -90,7 +90,7 @@ jobs: run: | npm run make - name: '[prep 7] Publish' - uses: zowe-actions/zlux-builds/zen/publish@arm64-osx + uses: zowe-actions/zlux-builds/zen/publish@v2.x/main with: os: macos From 6545988f532fceec347c89b80586635e2ec35436 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 09:24:21 -0400 Subject: [PATCH 059/455] Why is this var hard coded smh Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/ReviewInstallation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index 40d626f2..adfc2e8e 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -147,7 +147,7 @@ const ReviewInstallation = () => {
)} - {stage.id !== 0 && stage.id < 4 && ( + {stage.id !== 0 && stage.id < 5 && (
updateActiveStep(stage.id, false)}>{stage.label} From 53fc6d36b23318f2fda47ddc5246ae572c14ccac Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 09:43:21 -0400 Subject: [PATCH 060/455] Fix install page not accepting input Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 2629f9ab..f213f0c2 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -350,7 +350,7 @@ const Installation = () => { } else { const newYaml = {...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, dataset: updatedData}}}; setLYaml(newYaml); - await window.electron.ipcRenderer.setConfig(newYaml) + window.electron.ipcRenderer.setConfig(newYaml) setStageConfig(true, '', updatedData); } } From 625d7e457e4766f162d8431dedcf2efcd61b44a7 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 09:55:45 -0400 Subject: [PATCH 061/455] Remove unwanted logic Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Stepper.tsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 04bbb11d..983d702c 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -166,15 +166,6 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages return; } - // To not access the stage if any previous stage is not completed - for (let i = 0; i < newActiveStep; i++) { - const statusAtIndex = stageProgressStatus[i]; - // We can access 'Review Installation' if Initialization in not completed since it can be skipped - if (!statusAtIndex && !(newActiveStep == REVIEW_STAGE_ID && i == INIT_STAGE_ID)) { - return; - } - } - setActiveStep(newActiveStep); const newSubStep = isSubStep ? subStepIndex : 0; if((subStepIndex > 0 && subStageProgressStatus[0] === true) || subStepIndex === 0){ //only allow substages after installation to be navigated to if init mvs has been completed From 5b9072bb518668f629896cdee3d485fddd0a5134 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 10:05:23 -0400 Subject: [PATCH 062/455] key was causing ui lag Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Networking.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 7a9d5481..4e15234a 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -739,7 +739,6 @@ const Networking = () => { {yaml.zowe.externalDomains != undefined && yaml.zowe.externalDomains.map((domain: string, index: number) => { let domains = [...yaml.zowe?.externalDomains]; domains[index] = e.target.value; From f89cf7745aeb1d1ed8be617ee5ba7ce6fcfd3590 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 10:36:16 -0400 Subject: [PATCH 063/455] Update description Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Unpax.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index a8e19008..25b4e616 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -109,7 +109,7 @@ const Unpax = () => { }, []); return (<> - {installValue === "smpe" && + {installValue === "smpe" && {`The SMP/E process has already downloaded the required Zowe runtime files. Please click skip or continue.`} From 7c05105b0fe063b14fb9872a3750c95002205a82 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 10:37:16 -0400 Subject: [PATCH 064/455] Fix smpe install Signed-off-by: Timothy Gerstel --- .../stages/installation/Installation.tsx | 79 +++++++++---------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index f213f0c2..d0050da1 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -176,6 +176,8 @@ const Installation = () => { dispatch(setSchema(FALLBACK_SCHEMA)); } }) + + dispatch(setNextStepEnabled(getProgress('datasetInstallationStatus'))); if(installationType === 'smpe') { const status = getProgress('datasetInstallationStatus'); @@ -211,10 +213,12 @@ const Installation = () => { }, [mvsDatasetInitProgress]); useEffect(() => { + const stageComplete = mvsDatasetInitProgress.uploadYaml && mvsDatasetInitProgress.initMVS && mvsDatasetInitProgress.install; if(!getProgress('datasetInstallationStatus') && initClicked) { timer = setInterval(() => { window.electron.ipcRenderer.getInstallationProgress().then((res: any) => { setMvsDatasetInitializationProgress(res); + setDatasetInstallationStatus(res) }) }, 3000); } @@ -280,47 +284,42 @@ const Installation = () => { window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.setup.dataset', setupYaml), ]).then(async () => { dispatch(setLoading(false)); - if(installationType === 'smpe'){ - setStageSkipStatus(false); - setDsInstallStageStatus(true); - dispatch(setLoading(false)); - setShowProgress(false); - } else { - setYaml(window.electron.ipcRenderer.getConfig()); - setShowProgress(true); - dispatch(setLoading(false)); /* change skipDownload ?? false --> true to skip upload/download steps for quicker development */ - window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml).then((res: IResponse) => { - // Some parts of Zen pass the response as a string directly into the object - if (res.status == false && typeof res.details == "string") { - res.details = { 3: res.details }; - } - if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe install - alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); - window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { - toggleEditorVisibility("output"); - }) - updateProgress(false); - installProceedActions(false); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; - clearInterval(timer); - } else { - installProceedActions(res.status); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; - clearInterval(timer); - } - }).catch((err: any) => { - clearInterval(timer); + setYaml(window.electron.ipcRenderer.getConfig()); + setShowProgress(true); + dispatch(setLoading(false)); /* change skipDownload ?? false --> true to skip upload/download steps for quicker development */ + window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml).then((res: IResponse) => { + // Some parts of Zen pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { + res.details = { 3: res.details }; + } + if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe install + alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); + window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { + toggleEditorVisibility("output"); + }) updateProgress(false); installProceedActions(false); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; - stages[STAGE_ID].isSkipped = true; - if (typeof err === "string") { - console.warn('Installation failed', err); - } else { - console.warn('Installation failed', err?.toString()); // toString() throws run-time error on undefined or null - } - }); - } + clearInterval(timer); + } else { + installProceedActions(res.status); + updateProgress(true) + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; + clearInterval(timer); + } + }).catch((err: any) => { + clearInterval(timer); + updateProgress(false); + installProceedActions(false); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; + stages[STAGE_ID].isSkipped = true; + if (typeof err === "string") { + console.warn('Installation failed', err); + } else { + console.warn('Installation failed', err?.toString()); // toString() throws run-time error on undefined or null + } + }); + }) } @@ -380,7 +379,7 @@ const Installation = () => { {!showProgress ? - + {/* */} : null} @@ -389,7 +388,7 @@ const Installation = () => { - + } From c4a40cdce48c1109e6679754269ae5843a9be13a Mon Sep 17 00:00:00 2001 From: 1000TurquoisePogs Date: Wed, 5 Jun 2024 16:44:09 +0200 Subject: [PATCH 065/455] Bump libraries as per audit report Signed-off-by: 1000TurquoisePogs --- package-lock.json | 5633 +++++++++++++++++++++------------------------ package.json | 19 +- 2 files changed, 2683 insertions(+), 2969 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a84d3e2..ae7fb139 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,6 @@ "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "flat": "^5.0.2", - "jimp": "^0.22.10", "js-yaml": "^4.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -35,13 +34,13 @@ "zos-node-accessor": "^1.0.16" }, "devDependencies": { - "@electron-forge/cli": "^6.0.5", - "@electron-forge/maker-deb": "^6.0.5", - "@electron-forge/maker-dmg": "^6.0.5", - "@electron-forge/maker-rpm": "^6.0.5", - "@electron-forge/maker-squirrel": "^6.0.5", - "@electron-forge/maker-zip": "^6.0.5", - "@electron-forge/plugin-webpack": "^6.0.5", + "@electron-forge/cli": "^6.4.0", + "@electron-forge/maker-deb": "^6.4.0", + "@electron-forge/maker-dmg": "^6.4.0", + "@electron-forge/maker-rpm": "^6.4.0", + "@electron-forge/maker-squirrel": "^6.4.0", + "@electron-forge/maker-zip": "^6.4.0", + "@electron-forge/plugin-webpack": "^6.4.0", "@playwright/test": "^1.38.0", "@types/flat": "^5.0.2", "@types/js-yaml": "^4.0.5", @@ -50,9 +49,9 @@ "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", - "@vercel/webpack-asset-relocator-loader": "^1.7.3", + "@vercel/webpack-asset-relocator-loader": "1.7.3", "css-loader": "^6.7.3", - "electron": "22.0.0", + "electron": "^26.0.0", "electron-playwright-helpers": "^1.6.0", "eslint": "^8.34.0", "eslint-plugin-header": "^3.1.1", @@ -70,51 +69,113 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dependencies": { + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -184,24 +245,68 @@ "node": ">=4" } }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -235,29 +340,6 @@ "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz", "integrity": "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA==" }, - "node_modules/@date-io/date-fns": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz", - "integrity": "sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA==", - "peer": true, - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "date-fns": "^2.0.0" - }, - "peerDependenciesMeta": { - "date-fns": { - "optional": true - } - } - }, - "node_modules/@date-io/date-fns/node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==", - "peer": true - }, "node_modules/@date-io/dayjs": { "version": "1.3.13", "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-1.3.13.tgz", @@ -269,56 +351,10 @@ "dayjs": "^1.8.17" } }, - "node_modules/@date-io/luxon": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz", - "integrity": "sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ==", - "peer": true, - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "luxon": "^1.21.3 || ^2.x || ^3.x" - }, - "peerDependenciesMeta": { - "luxon": { - "optional": true - } - } - }, - "node_modules/@date-io/luxon/node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==", - "peer": true - }, - "node_modules/@date-io/moment": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz", - "integrity": "sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ==", - "peer": true, - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "moment": "^2.24.0" - }, - "peerDependenciesMeta": { - "moment": { - "optional": true - } - } - }, - "node_modules/@date-io/moment/node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==", - "peer": true - }, "node_modules/@electron-forge/cli": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.0.5.tgz", - "integrity": "sha512-3xD4XKyV634cQCR8HobpVnb4LqVdTHDs+KwsU9zgjaBIJMBapCS3ZzpXYbxzPekTaVwu39ojMUg990JVYBhs2A==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.4.2.tgz", + "integrity": "sha512-bM6YVTV0uUEpIL1jkpARlSm4Li26XZn+avC/lyTdpPqnd65T/oXZNkrAD+2Jb0RlgplOaM21qWm7ybtvKDGDyA==", "dev": true, "funding": [ { @@ -331,8 +367,8 @@ } ], "dependencies": { - "@electron-forge/core": "6.0.5", - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/core": "6.4.2", + "@electron-forge/shared-types": "6.4.2", "@electron/get": "^2.0.0", "chalk": "^4.0.0", "commander": "^4.1.1", @@ -350,19 +386,10 @@ "node": ">= 14.17.5" } }, - "node_modules/@electron-forge/cli/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@electron-forge/core": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.0.5.tgz", - "integrity": "sha512-lMtm3x2ZFEBOU7/JTIo2oI5dXm2hKqpdc4opHA7iOxja5YYDDvnqKt+tACJSCdnCOxYLS+0OSoaz/DJ8SNyStw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.4.2.tgz", + "integrity": "sha512-VtrFZ1Q7NG1ov0jJO/tUvUiYdWZ0Y31xw762is/jfpRPD6V/soOpwJJAoWoPK9TZVkTm2pkS8S5LikCMbNCLxw==", "dev": true, "funding": [ { @@ -375,20 +402,22 @@ } ], "dependencies": { - "@electron-forge/core-utils": "6.0.5", - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/plugin-base": "6.0.5", - "@electron-forge/publisher-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5", - "@electron-forge/template-base": "6.0.5", - "@electron-forge/template-webpack": "6.0.5", - "@electron-forge/template-webpack-typescript": "6.0.5", + "@electron-forge/core-utils": "6.4.2", + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/plugin-base": "6.4.2", + "@electron-forge/publisher-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "@electron-forge/template-vite": "6.4.2", + "@electron-forge/template-vite-typescript": "6.4.2", + "@electron-forge/template-webpack": "6.4.2", + "@electron-forge/template-webpack-typescript": "6.4.2", "@electron/get": "^2.0.0", "@electron/rebuild": "^3.2.10", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", "debug": "^4.3.1", - "electron-packager": "^17.1.1", + "electron-packager": "^17.1.2", "fast-glob": "^3.2.7", "filenamify": "^4.1.0", "find-up": "^5.0.0", @@ -413,12 +442,12 @@ } }, "node_modules/@electron-forge/core-utils": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-6.0.5.tgz", - "integrity": "sha512-KCxTQOGRGITUwdxMu63xFn4SkuBE6Fvn188MjZHyztAHimiKBWdNGBrBHgjR2WyYTziT8y6JXcAntAW5d+jYHQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-6.4.2.tgz", + "integrity": "sha512-CjB3aakmRsXAMMDYc8PxNTMf4FdI29y4PErfv7eCXlL5oo3JW0VSKZIV7R8/Po0S0got85q2kmhZgCKuxL1BNA==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/shared-types": "6.4.2", "@electron/rebuild": "^3.2.10", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", @@ -434,12 +463,12 @@ } }, "node_modules/@electron-forge/maker-base": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.0.5.tgz", - "integrity": "sha512-m3xS/Gd2XlYUjXO4o8bxZEcwN9AulMDjuIzq68FRH5VB1vuESJKtVZjSa331IjaA+0aRXbSCa108FLy8g5Qlaw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.4.2.tgz", + "integrity": "sha512-zW3GH+LqDK9nxQmQEFkJPR8RqiX0lVk6a4mXll3ngujN1fPevO4ivUAWmaEVeC1dH/hXbN7s9m0S6a37MigftQ==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/shared-types": "6.4.2", "fs-extra": "^10.0.0", "which": "^2.0.2" }, @@ -448,19 +477,19 @@ } }, "node_modules/@electron-forge/maker-deb": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.0.5.tgz", - "integrity": "sha512-uaDxBeLhJcrySnPGPEZbGwJG7qeiBE05+rdkPpsfHzsTBYca1abQ2Ll66R5EmOrosIZv60OUt1eGyxOrWlo1+w==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.4.2.tgz", + "integrity": "sha512-tlV8ffivgBP94vtYXgAeXgzeKCaRyLuWH9LT8PQW1QrYbAFpCMmuwk/zFaJkyMklImCWmDFTPYMEqdEJGd7Npg==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5" + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2" }, "engines": { "node": ">= 14.17.5" }, "optionalDependencies": { - "electron-installer-debian": "^3.0.0" + "electron-installer-debian": "^3.2.0" } }, "node_modules/@electron-forge/maker-dmg": { @@ -480,42 +509,14 @@ "electron-installer-dmg": "^4.0.0" } }, - "node_modules/@electron-forge/maker-dmg/node_modules/@electron-forge/maker-base": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.4.2.tgz", - "integrity": "sha512-zW3GH+LqDK9nxQmQEFkJPR8RqiX0lVk6a4mXll3ngujN1fPevO4ivUAWmaEVeC1dH/hXbN7s9m0S6a37MigftQ==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "6.4.2", - "fs-extra": "^10.0.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 14.17.5" - } - }, - "node_modules/@electron-forge/maker-dmg/node_modules/@electron-forge/shared-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", - "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", - "dev": true, - "dependencies": { - "@electron/rebuild": "^3.2.10", - "electron-packager": "^17.1.2", - "listr2": "^5.0.3" - }, - "engines": { - "node": ">= 14.17.5" - } - }, "node_modules/@electron-forge/maker-rpm": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-6.0.5.tgz", - "integrity": "sha512-qwrTMo8kBf6fsPi6S22qCvD5F2OeJ8F4c0vuHi9YCUoPVjU3wBsvxi+lJclkdTqgzRWidfZ1vsbltcOSZb+2fw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-6.4.2.tgz", + "integrity": "sha512-+hfbY5pYbAer0y07OtOzVgVBHoTRmemqqZ//T0mKJpyK2ThHKGTvyW8FFlr5jlQs5LoDCM2WHKE8oGtRhivsMg==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5" + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2" }, "engines": { "node": ">= 14.17.5" @@ -525,13 +526,13 @@ } }, "node_modules/@electron-forge/maker-squirrel": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.0.5.tgz", - "integrity": "sha512-moP4OIytJlqxx3J7UCWrOv04tepjQIzK9RdzK4m9jfjPAxZtRObesFGXr/jLO18NHXk7fDcbYLf3sTIfaPU6jg==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.4.2.tgz", + "integrity": "sha512-ukK3RcFaBrQXUzR52PsHxfwDq5XKSnj6A1kkXiyHWqgj+HIU97prBScBb5JRtasPvYN+nDdQO2vlInsLaqcx9Q==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", "fs-extra": "^10.0.0" }, "engines": { @@ -542,46 +543,47 @@ } }, "node_modules/@electron-forge/maker-zip": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.0.5.tgz", - "integrity": "sha512-Yg256nGQUWT35EZyRIALpgtdM8WSvgZc0O4aA6Wy0S6ektaxyM2a+tO2ug/Vl+RgYA6oIeAADfkU2RxLiGnhbA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.4.2.tgz", + "integrity": "sha512-k2nfhhnxcYbUS7rCKCisuqEalxtH9l73+lrtfL0aQZiE/BLbDXyNckDIDOPvX0tBEg62nVzUdJonZwOhZVvAMw==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", "cross-zip": "^4.0.0", - "fs-extra": "^10.0.0" + "fs-extra": "^10.0.0", + "got": "^11.8.5" }, "engines": { "node": ">= 14.17.5" } }, "node_modules/@electron-forge/plugin-base": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.0.5.tgz", - "integrity": "sha512-Q2ywNq6Qzb9K1W59qzbJvI+NZaDPrHz7iq9W8UfyHoEDYLJsD368PzHtNaQFJx+ofZNgsSpukXoL9mGvN1lVbA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.4.2.tgz", + "integrity": "sha512-g6AAtQ7fZ94djBmwcnWasQ8xgaNVNjgaQ00GLK0NkmQ7n0PNbsnlMDuw9vdfTiL6WaLg5nxNSYc9bFJP/rtyeA==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5" + "@electron-forge/shared-types": "6.4.2" }, "engines": { "node": ">= 14.17.5" } }, "node_modules/@electron-forge/plugin-webpack": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-webpack/-/plugin-webpack-6.0.5.tgz", - "integrity": "sha512-L2H8tZA24VHPqYQRgO0/t6GJw6SMfj45hZfOMEqm2Xq2x2or9zi1ZMXzEEaZZJR6V0AWct002bwCJ+NNuiuTkQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-webpack/-/plugin-webpack-6.4.2.tgz", + "integrity": "sha512-o+iQajtCCnYEPaJy0IkYI0noGqHoCDGMydki9sNU+CoUfDYBCNDkUXLTpoVkL6GmKTINT8kvOFgsFfPF9fhXlg==", "dev": true, "dependencies": { - "@electron-forge/core-utils": "6.0.5", - "@electron-forge/plugin-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5", - "@electron-forge/web-multi-logger": "6.0.5", + "@electron-forge/core-utils": "6.4.2", + "@electron-forge/plugin-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/web-multi-logger": "6.4.2", "chalk": "^4.0.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.3.1", + "html-webpack-plugin": "^5.5.3", "webpack": "^5.69.1", "webpack-dev-server": "^4.0.0", "webpack-merge": "^5.7.3" @@ -591,25 +593,25 @@ } }, "node_modules/@electron-forge/publisher-base": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.0.5.tgz", - "integrity": "sha512-gwOaMC3RKPO1mq3dqP9ko8kJptO41XU+I+pM66W/wvCNIQzisFCqrsx3d8A9RWsMJug0I1xNsYdBt99j1/2haA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.4.2.tgz", + "integrity": "sha512-Tnf9O8MFzdT1gsb5EDDaQUoslt7gUuUywtsr+lT/fpBlBQbei2fvioTwvZ1Q1cmsKnld7XhRh6unfgdWLTZzgw==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5" + "@electron-forge/shared-types": "6.4.2" }, "engines": { "node": ">= 14.17.5" } }, "node_modules/@electron-forge/shared-types": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.0.5.tgz", - "integrity": "sha512-FrJI11afw/Cxk0JwgWyKg9aPoHOdmMi4JHTY6pnmi95MjarQ1d0SIqKJUzX7q2lXPUAxqPKA2Wmykg6F2CThlg==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", "dev": true, "dependencies": { "@electron/rebuild": "^3.2.10", - "electron-packager": "^17.1.1", + "electron-packager": "^17.1.2", "listr2": "^5.0.3" }, "engines": { @@ -617,12 +619,12 @@ } }, "node_modules/@electron-forge/template-base": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.0.5.tgz", - "integrity": "sha512-/3nOKPltnL8nVdZS2EpnKx1VMBqgLjW8TLRt8vtc+WdHtCVJBiU1Pt0JxTYDM3Raq/CclWGqVFb1svqorAon7Q==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.4.2.tgz", + "integrity": "sha512-vsQh+64Fr2Vxg6k8DAahWq4MAdB2F2qTig+LgIJENv8ksbzC1YIq05SBAS/g2674cdr7WdwyukMy2rgxe3rhnQ==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/shared-types": "6.4.2", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", @@ -632,14 +634,42 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/template-vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-6.4.2.tgz", + "integrity": "sha512-NX7jHRblBmIqufMbqWgpI/VnpgF/qMSTq9ZPmDSXamBhid336MC6+DoWzDpXceQZEp0m/jpMLR04ynr8O4jGlg==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@electron-forge/template-vite-typescript": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-6.4.2.tgz", + "integrity": "sha512-h3pn6onvC/nLglmJuelYU82Qzrh0l6MqvbBGoT39bbDoRLIqmlhWTWppHgDJVXAGrSoH+9BEpptipeBQWirFwg==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, "node_modules/@electron-forge/template-webpack": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.0.5.tgz", - "integrity": "sha512-fDINYYCJ3D8rMYgS5tTHhgC8d73pRpQKtyBCQFC9KkfdNMYJr9MPZeep5pYQqrOMjSgBpgaYSBL9Unsa5I1F2g==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.4.2.tgz", + "integrity": "sha512-9QYr/td4cmnGOj8UF25W6An/eI+JXj9T/b+KFybL3cQ87H1yrQOn2T84Bm5/JaB4SPdIu4FdKRjqwR7C7R0g2w==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", - "@electron-forge/template-base": "6.0.5", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", "fs-extra": "^10.0.0" }, "engines": { @@ -647,13 +677,13 @@ } }, "node_modules/@electron-forge/template-webpack-typescript": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-6.0.5.tgz", - "integrity": "sha512-YjKVszYRT4S3Sw3AOEpJokU7KPpmr0HWuO14+WHMO0FhQ1gaTMfPoz6QRHg0F1Ulz73mm6b3MLb9ID5igZv7Mw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-6.4.2.tgz", + "integrity": "sha512-MPAZQ4v6piCED7NT1LTVQf61o6Eg/laNoKbhbrFBSH1i20OUwbtV2MLj6Op292ynI9+1qdHKmFgctr6qPTCAQw==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", - "@electron-forge/template-base": "6.0.5", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", "fs-extra": "^10.0.0" }, "engines": { @@ -661,9 +691,9 @@ } }, "node_modules/@electron-forge/web-multi-logger": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/web-multi-logger/-/web-multi-logger-6.0.5.tgz", - "integrity": "sha512-Y4jbaLaoUjQbokQl6G8aTi1s8NdQ9MG74cr1dKOnRernk8C0pq8QoXBPAhPfkrmcLHzF3gpCrZeCIQ+/sDKviw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/web-multi-logger/-/web-multi-logger-6.4.2.tgz", + "integrity": "sha512-acZwr5+4l5G6baaqUwU9tuJ/njhJLUu9LgTvjedknIipg22EwLqwhjdXuTpWb9gidXDjdAjSRFzEEyVZCCooFA==", "dev": true, "dependencies": { "express": "^4.17.1", @@ -677,12 +707,11 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", - "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", + "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", "dev": true, "dependencies": { - "chromium-pickle-js": "^0.2.0", "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" @@ -694,10 +723,19 @@ "node": ">=10.12.0" } }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -739,9 +777,9 @@ } }, "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -757,9 +795,9 @@ } }, "node_modules/@electron/notarize": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.3.tgz", - "integrity": "sha512-9oRzT56rKh5bspk3KpAVF8lPKHYQrBnRwcgiOeR0hdilVEQmszDaAu0IPCPrwwzJN0ugNs0rRboTreHMt/6mBQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -785,9 +823,9 @@ } }, "node_modules/@electron/osx-sign": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", - "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.0.tgz", + "integrity": "sha512-TEXhxlYSDRr9JWK5nWdOv5MtuUdaZ412uxIIEQ0hLt80o0HYWtQJBlW5QmrQDMtebzATaOjKG9UfCzLyA90zWQ==", "dev": true, "dependencies": { "compare-version": "^0.1.2", @@ -806,9 +844,9 @@ } }, "node_modules/@electron/rebuild": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.2.10.tgz", - "integrity": "sha512-SUBM6Mwi3yZaDFQjZzfGKpYTtOp9m60glounwX6tfGeVc/ZOl4jbquktUcyy7gYSLDWFLtKkftkY2xgMJZLQgg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.0.tgz", + "integrity": "sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==", "dev": true, "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", @@ -817,26 +855,26 @@ "detect-libc": "^2.0.1", "fs-extra": "^10.0.0", "got": "^11.7.0", - "lzma-native": "^8.0.5", - "node-abi": "^3.0.0", - "node-api-version": "^0.1.4", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", "node-gyp": "^9.0.0", "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", "semver": "^7.3.5", "tar": "^6.0.5", "yargs": "^17.0.1" }, "bin": { - "electron-rebuild": "lib/src/cli.js" + "electron-rebuild": "lib/cli.js" }, "engines": { "node": ">=12.13.0" } }, "node_modules/@electron/universal": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.3.4.tgz", - "integrity": "sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", "dev": true, "dependencies": { "@electron/asar": "^3.2.1", @@ -888,74 +926,101 @@ "node": ">=10" } }, + "node_modules/@electron/windows-sign": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.1.2.tgz", + "integrity": "sha512-eXEiZjDtxW3QORCWfRUarANPRTlH9B6At4jqBZJ0NzokSGutXQUVLPA6WmGpIhDW6w2yCMdHW1EJd1HrXtU5sg==", + "dev": true, + "optional": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@emotion/babel-plugin": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", - "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/serialize": "^1.1.1", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.1.3" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" + "stylis": "4.2.0" } }, "node_modules/@emotion/cache": { - "version": "11.10.5", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", - "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.1", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.1.3" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", - "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "dependencies": { - "@emotion/memoize": "^0.8.0" + "@emotion/memoize": "^0.8.1" } }, "node_modules/@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", - "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/cache": "^11.10.5", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { @@ -968,33 +1033,33 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dependencies": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", - "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/styled": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz", - "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/is-prop-valid": "^1.2.0", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0" + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -1007,37 +1072,61 @@ } }, "node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "node_modules/@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1068,50 +1157,120 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", + "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", - "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", - "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", + "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", "hasInstallScript": true, "peer": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.2" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz", - "integrity": "sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", + "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.2" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", - "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", + "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", "dependencies": { "prop-types": "^15.8.1" }, @@ -1127,13 +1286,13 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -1154,507 +1313,111 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, - "node_modules/@jimp/bmp": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.22.10.tgz", - "integrity": "sha512-1UXRl1Nw1KptZ1r0ANqtXOst9vGH51dq7keVKQzyyTO2lz4dOaezS9StuSTNh+RmiHg/SVPaFRpPfB0S/ln4Kg==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "bmp-js": "^0.1.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/core": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.22.10.tgz", - "integrity": "sha512-ZKyrehVy6wu1PnBXIUpn/fXmyMRQiVSbvHDubgXz4bfTOao3GiOurKHjByutQIgozuAN6ZHWiSge1dKA+dex3w==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "exif-parser": "^0.1.12", - "file-type": "^16.5.4", - "isomorphic-fetch": "^3.0.0", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.6.0" - } - }, - "node_modules/@jimp/custom": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.22.10.tgz", - "integrity": "sha512-sPZkUYe1hu0iIgNisjizxPJqq2vaaKvkCkPoXq2U6UV3ZA1si/WVdrg25da3IcGIEV+83AoHgM8TvqlLgrCJsg==", - "dependencies": { - "@jimp/core": "^0.22.10" - } - }, - "node_modules/@jimp/gif": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.22.10.tgz", - "integrity": "sha512-yEX2dSpamvkSx1PPDWGnKeWDrBz0vrCKjVG/cn4Zr68MRRT75tbZIeOrBa+RiUpY3ho5ix7d36LkYvt3qfUIhQ==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "gifwrap": "^0.10.1", - "omggif": "^1.0.9" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/jpeg": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.22.10.tgz", - "integrity": "sha512-6bu98pAcVN4DY2oiDLC4TOgieX/lZrLd1tombWZOFCN5PBmqaHQxm7IUmT+Wj4faEvh8QSHgVLSA+2JQQRJWVA==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "jpeg-js": "^0.4.4" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-blit": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.10.tgz", - "integrity": "sha512-6EI8Sl+mxYHEIy6Yteh6eknD+EZguKpNdr3sCKxNezmLR0+vK99vHcllo6uGSjXXiwtwS67Xqxn8SsoatL+UJQ==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-blur": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.10.tgz", - "integrity": "sha512-4XRTWuPVdMXJeclJMisXPGizeHtTryVaVV5HnuQXpKqIZtzXReCCpNGH8q/i0kBQOQMXhGWS3mpqOEwtpPePKw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-circle": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.22.10.tgz", - "integrity": "sha512-mhcwTO1ywRxiCgtLGge6tDDIDPlX6qkI3CY+BjgGG/XhVHccCddXgOGLdlf+5OuKIEF2Nqs0V01LQEQIJFTmEw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-color": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.10.tgz", - "integrity": "sha512-e4t3L7Kedd96E0x1XjsTM6NcgulKUU66HdFTao7Tc9FYJRFSlttARZ/C6LEryGDm/i69R6bJEpo7BkNz0YL55Q==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "tinycolor2": "^1.6.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-contain": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.22.10.tgz", - "integrity": "sha512-eP8KrzctuEoqibQAxi9WhbnoRosydhiwg+IYya3dKuKDBTrD9UHt+ERlPQ/lTNWHzV/l4S1ntV3r9s9saJgsXA==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-cover": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.22.10.tgz", - "integrity": "sha512-kJCwL5T1igfa0InCfkE7bBeqg26m46aoRt10ug+rvm11P6RrvRMGrgINFyIKB+mnB7CiyBN/MOula1CvLhSInQ==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-crop": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.10.tgz", - "integrity": "sha512-BOZ+YGaZlhU7c5ye65RxikicXH0Ki0It6/XHISvipR5WZrfjLjL2Ke20G+AGnwBQc76gKenVcMXVUCnEjtZV+Q==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-displace": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.22.10.tgz", - "integrity": "sha512-llNiWWMTKISDXt5+cXI0GaFmZWAjlT+4fFLYf4eXquuL/9wZoQsEBhv2GdGd48mkiS8jZq1Nnb2Q4ehEPTvrzw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-dither": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.22.10.tgz", - "integrity": "sha512-05WLmeV5M+P/0FS+bWf13hMew2X0oa8w9AtmevL2UyA/5GqiyvP2Xm5WfGQ8oFiiMvpnL6RFomJQOZtWca0C2w==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-fisheye": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.22.10.tgz", - "integrity": "sha512-InjiXvc7Gkzrx8VWtU97kDqV7ENnhHGPULymJWeZaF2aicud9Fpk4iCtd/DcZIrk7Cbe60A8RwNXN00HXIbSCg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-flip": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.22.10.tgz", - "integrity": "sha512-42GkGtTHWnhnwTMPVK/kXObZbkYIpQWfuIfy5EMEMk6zRj05zpv4vsjkKWfuemweZINwfvD7wDJF7FVFNNcZZg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-rotate": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-gaussian": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.22.10.tgz", - "integrity": "sha512-ykrG/6lTp9Q5YA8jS5XzwMHtRxb9HOFMgtmnrUZ8kU+BK8REecfy9Ic5BUEOjCYvS1a/xLsnrZQU07iiYxBxFg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-invert": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.22.10.tgz", - "integrity": "sha512-d8j9BlUJYs/c994t4azUWSWmQq4LLPG4ecm8m6SSNqap+S/HlVQGqjYhJEBbY9EXkOTYB9vBL9bqwSM1Rr6paA==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-mask": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.22.10.tgz", - "integrity": "sha512-yRBs1230XZkz24uFTdTcSlZ0HXZpIWzM3iFQN56MzZ7USgdVZjPPDCQ8I9RpqfZ36nDflQkUO0wV7ucsi4ogow==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-normalize": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.22.10.tgz", - "integrity": "sha512-Wk9GX6eJMchX/ZAazVa70Fagu+OXMvHiPY+HrcEwcclL+p1wo8xAHEsf9iKno7Ja4EU9lLhbBRY5hYJyiKMEkg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-print": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.22.10.tgz", - "integrity": "sha512-1U3VloIR+beE1kWPdGEJMiE2h1Do29iv3w8sBbvPyRP4qXxRFcDpmCGtctsrKmb1krlBFlj8ubyAY90xL+5n9w==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "load-bmfont": "^1.4.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-resize": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.10.tgz", - "integrity": "sha512-ixomxVcnAONXDgaq0opvAx4UAOiEhOA/tipuhFFOvPKFd4yf1BAnEviB5maB0SBHHkJXPUSzDp/73xVTMGSe7g==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-rotate": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.10.tgz", - "integrity": "sha512-eeFX8dnRyf3LAdsdXWKWuN18hLRg8zy1cP0cP9rHzQVWRK7ck/QsLxK1vHq7MADGwQalNaNTJ9SQxH6c8mz6jw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-scale": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.10.tgz", - "integrity": "sha512-TG/H0oUN69C9ArBCZg4PmuoixFVKIiru8282KzSB/Tp1I0xwX0XLTv3dJ5pobPlIgPcB+TmD4xAIdkCT4rtWxg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-shadow": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.22.10.tgz", - "integrity": "sha512-TN9xm6fI7XfxbMUQqFPZjv59Xdpf0tSiAQdINB4g6pJMWiVANR/74OtDONoy3KKpenu5Y38s+FkrtID/KcQAhw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blur": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-threshold": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.22.10.tgz", - "integrity": "sha512-DA2lSnU0TgIRbAgmXaxroYw3Ad6J2DOFEoJp0NleSm2h3GWbZEE5yW9U2B6hD3iqn4AenG4E2b2WzHXZyzSutw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-color": ">=0.8.0", - "@jimp/plugin-resize": ">=0.8.0" - } - }, - "node_modules/@jimp/plugins": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.22.10.tgz", - "integrity": "sha512-KDMZyM6pmvS8freB+UBLko1TO/k4D7URS/nphCozuH+P7i3UMe7NdckXKJ8u+WD6sqN0YFYvBehpkpnUiw/91w==", - "dependencies": { - "@jimp/plugin-blit": "^0.22.10", - "@jimp/plugin-blur": "^0.22.10", - "@jimp/plugin-circle": "^0.22.10", - "@jimp/plugin-color": "^0.22.10", - "@jimp/plugin-contain": "^0.22.10", - "@jimp/plugin-cover": "^0.22.10", - "@jimp/plugin-crop": "^0.22.10", - "@jimp/plugin-displace": "^0.22.10", - "@jimp/plugin-dither": "^0.22.10", - "@jimp/plugin-fisheye": "^0.22.10", - "@jimp/plugin-flip": "^0.22.10", - "@jimp/plugin-gaussian": "^0.22.10", - "@jimp/plugin-invert": "^0.22.10", - "@jimp/plugin-mask": "^0.22.10", - "@jimp/plugin-normalize": "^0.22.10", - "@jimp/plugin-print": "^0.22.10", - "@jimp/plugin-resize": "^0.22.10", - "@jimp/plugin-rotate": "^0.22.10", - "@jimp/plugin-scale": "^0.22.10", - "@jimp/plugin-shadow": "^0.22.10", - "@jimp/plugin-threshold": "^0.22.10", - "timm": "^1.6.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/png": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.22.10.tgz", - "integrity": "sha512-RYinU7tZToeeR2g2qAMn42AU+8OUHjXPKZZ9RkmoL4bguA1xyZWaSdr22/FBkmnHhOERRlr02KPDN1OTOYHLDQ==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "pngjs": "^6.0.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/tiff": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.22.10.tgz", - "integrity": "sha512-OaivlSYzpNTHyH/h7pEtl3A7F7TbsgytZs52GLX/xITW92ffgDgT6PkldIrMrET6ERh/hdijNQiew7IoEEr2og==", - "dependencies": { - "utif2": "^4.0.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/types": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.22.10.tgz", - "integrity": "sha512-u/r+XYzbCx4zZukDmxx8S0er3Yq3iDPI6+31WKX0N18i2qPPJYcn8qwIFurfupRumGvJ8SlGLCgt/T+Y8zzUIw==", - "dependencies": { - "@jimp/bmp": "^0.22.10", - "@jimp/gif": "^0.22.10", - "@jimp/jpeg": "^0.22.10", - "@jimp/png": "^0.22.10", - "@jimp/tiff": "^0.22.10", - "timm": "^1.6.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/utils": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.22.10.tgz", - "integrity": "sha512-ztlOK9Mm2iLG2AMoabzM4i3WZ/FtshcgsJCbZCRUs/DKoeS2tySRJTnQZ1b7Roq0M4Ce+FUAxnCAcBV0q7PH9w==", - "dependencies": { - "regenerator-runtime": "^0.13.3" - } - }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jsonforms/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@jsonforms/core/-/core-3.0.0.tgz", - "integrity": "sha512-DcUGLNaeAE411oA8d5dPuPEF2/nDmALAfQRsaA3GPAre2D76kJXyBb8TFMjLMRJCVIR0q5LsiRRdmLnuPVHKqA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@jsonforms/core/-/core-3.3.0.tgz", + "integrity": "sha512-p88vnW5VbeQ9dPe36DHhqzKEd5puM7njWp5yu5FCB2O7kjSc0do4OqjgUDVl3vBblsi0OsTQqxaLZ8uUVVbcRQ==", "dependencies": { "@types/json-schema": "^7.0.3", "ajv": "^8.6.1", "ajv-formats": "^2.1.0", - "lodash": "^4.17.15" + "lodash": "^4.17.21" } }, "node_modules/@jsonforms/material-renderers": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@jsonforms/material-renderers/-/material-renderers-3.0.0.tgz", - "integrity": "sha512-M0MgnB473vIAuuPMaUjNa3tBVEv/aTN59DK/Pm0TJrR+6UJgOJsBXfE6I/uQcpFaDbE5o91vK1fbRHHQ47BLZQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@jsonforms/material-renderers/-/material-renderers-3.3.0.tgz", + "integrity": "sha512-qyvPR7LVmvB6uiFjAGyv/MB9COOFwUc2PfRJfA1qpPx/aDBM03sCvWyw/M3XFHjyOJUxoMBVTbSz2t2gpCMnug==", "dependencies": { "@date-io/dayjs": "1.3.13", - "dayjs": "1.10.6" + "dayjs": "1.10.7", + "lodash": "^4.17.21" }, "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "@jsonforms/core": "3.0.0", - "@jsonforms/react": "3.0.0", - "@mui/icons-material": "^5.0.0", - "@mui/material": "^5.0.0", - "@mui/x-date-pickers": "^5.0.0-beta.5" + "@jsonforms/core": "3.3.0", + "@jsonforms/react": "3.3.0", + "@mui/icons-material": "^5.11.16", + "@mui/material": "^5.13.0", + "@mui/x-date-pickers": "^6.0.0", + "react": "^16.12.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@jsonforms/material-renderers/node_modules/dayjs": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", - "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" - }, "node_modules/@jsonforms/react": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@jsonforms/react/-/react-3.0.0.tgz", - "integrity": "sha512-Fj/L6hjk9uYSEBQrV7Vyj3ocTYGFelSupAJYmlys/37BPgifzPc+cBQj5bMKzx6pfO8YbmI+Sr3HDs2eNA/LkA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@jsonforms/react/-/react-3.3.0.tgz", + "integrity": "sha512-+iuNYHlsZ3uc8MuvxsmmiWRvDoMaHcNSRLUcGUNwWKLEOmQj0jj75oBNkI9h36oXB3/9VtXzXqw0VYHqmoWYYA==", "dependencies": { - "lodash": "^4.17.15" + "lodash": "^4.17.21" }, "peerDependencies": { - "@jsonforms/core": "3.0.0", + "@jsonforms/core": "3.3.0", "react": "^16.12.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, "node_modules/@malept/cross-spawn-promise": { @@ -1680,25 +1443,24 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.119", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.119.tgz", - "integrity": "sha512-XA5zhlYfXi67u613eIF0xRmktkatx6ERy3h+PwrMN5IcWFbgiL1guz8VpdXON+GWb8+G7B8t5oqTFIaCqaSAeA==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@emotion/is-prop-valid": "^1.2.0", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.11", - "@popperjs/core": "^2.11.6", - "clsx": "^1.2.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", @@ -1712,27 +1474,27 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.11.tgz", - "integrity": "sha512-0YK0K9GfW1ysw9z4ztWAjLW+bktf+nExMyn2+EQe1Ijb0kF2kz1kIOmb4+di0/PsXG70uCuw4DhEIdNd+JQkRA==", + "version": "5.15.19", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.19.tgz", + "integrity": "sha512-tCHSi/Tomez9ERynFhZRvFO6n9ATyrPs+2N80DMDzp6xDVirbBjEwhPcE+x7Lj+nwYw0SqFkOxyvMP0irnm55w==", "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.11.tgz", - "integrity": "sha512-Eell3ADmQVE8HOpt/LZ3zIma8JSvPh3XgnhwZLT0k5HRqZcd6F/QDHc7xsWtgz09t+UEFvOYJXjtrwKmLdwwpw==", + "version": "5.15.19", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.19.tgz", + "integrity": "sha512-RsEiRxA5azN9b8gI7JRqekkgvxQUlitoBOtZglflb8cUDyP12/cP4gRwhb44Ea1/zwwGGjAj66ZJpGHhKfibNA==", "dependencies": { - "@babel/runtime": "^7.21.0" + "@babel/runtime": "^7.23.9" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@mui/material": "^5.0.0", @@ -1746,19 +1508,19 @@ } }, "node_modules/@mui/material": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.11.tgz", - "integrity": "sha512-sSe0dmKjB1IGOYt32Pcha+cXV3IIrX5L5mFAF9LDRssp/x53bluhgLLbkc8eTiJvueVvo6HAyze6EkFEYLQRXQ==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/base": "5.0.0-alpha.119", - "@mui/core-downloads-tracker": "^5.11.11", - "@mui/system": "^5.11.11", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.11", - "@types/react-transition-group": "^4.4.5", - "clsx": "^1.2.1", - "csstype": "^3.1.1", + "version": "5.15.19", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.19.tgz", + "integrity": "sha512-lp5xQBbcRuxNtjpWU0BWZgIrv2XLUz4RJ0RqFXBdESIsKoGCQZ6P3wwU5ZPuj5TjssNiKv9AlM+vHopRxZhvVQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.19", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.2.0", "react-transition-group": "^4.4.5" @@ -1768,7 +1530,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.5.0", @@ -1790,12 +1552,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.11.tgz", - "integrity": "sha512-yLgTkjNC1mpye2SOUkc+zQQczUpg8NvQAETvxwXTMzNgJK1pv4htL7IvBM5vmCKG7IHAB3hX26W2u6i7bxwF3A==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/utils": "^5.11.11", + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", "prop-types": "^15.8.1" }, "engines": { @@ -1803,7 +1565,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", @@ -1816,13 +1578,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.11.tgz", - "integrity": "sha512-wV0UgW4lN5FkDBXefN8eTYeuE9sjyQdg5h94vtwZCUamGQEzmCOtir4AakgmbWMy0x8OLjdEUESn9wnf5J9MOg==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@emotion/cache": "^11.10.5", - "csstype": "^3.1.1", + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -1830,7 +1592,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.4.1", @@ -1847,17 +1609,17 @@ } }, "node_modules/@mui/system": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.11.tgz", - "integrity": "sha512-a9gaOAJBjpzypDfhbGZQ8HzdcxdxsKkFvbp1aAWZhFHBPdehEkARNh7mj851VfEhD/GdffYt85PFKFKdUta5Eg==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/private-theming": "^5.11.11", - "@mui/styled-engine": "^5.11.11", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.11", - "clsx": "^1.2.1", - "csstype": "^3.1.1", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -1865,7 +1627,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.5.0", @@ -1886,11 +1648,11 @@ } }, "node_modules/@mui/types": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz", - "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==", + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", "peerDependencies": { - "@types/react": "*" + "@types/react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -1899,13 +1661,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.11.tgz", - "integrity": "sha512-neMM5rrEXYQrOrlxUfns/TGgX4viS8K2zb9pbQh11/oUUYFlGI32Tn+PHePQx7n6Fy/0zq6WxdBFC9VpnJ5JrQ==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@types/prop-types": "^15.7.5", - "@types/react-is": "^16.7.1 || ^17.0.0", + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -1914,33 +1675,34 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@mui/x-date-pickers": { - "version": "5.0.20", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz", - "integrity": "sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.20.0.tgz", + "integrity": "sha512-q/x3rNmPYMXnx75+3s9pQb1YDtws9y5bwxpxeB3EW88oCp33eS7bvJpeuoCA1LzW/PpVfIRhi5RCyAvrEeTL7Q==", "peer": true, "dependencies": { - "@babel/runtime": "^7.18.9", - "@date-io/core": "^2.15.0", - "@date-io/date-fns": "^2.15.0", - "@date-io/dayjs": "^2.15.0", - "@date-io/luxon": "^2.15.0", - "@date-io/moment": "^2.15.0", - "@mui/utils": "^5.10.3", - "@types/react-transition-group": "^4.4.5", - "clsx": "^1.2.1", - "prop-types": "^15.7.2", - "react-transition-group": "^4.4.5", - "rifm": "^0.12.1" + "@babel/runtime": "^7.23.2", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -1949,14 +1711,17 @@ "peerDependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/material": "^5.4.1", - "@mui/system": "^5.4.1", - "date-fns": "^2.25.0", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0 || ^3.2.0", + "date-fns-jalali": "^2.13.0-0", "dayjs": "^1.10.7", - "luxon": "^1.28.0 || ^2.0.0 || ^3.0.0", - "moment": "^2.29.1", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1968,6 +1733,9 @@ "date-fns": { "optional": true }, + "date-fns-jalali": { + "optional": true + }, "dayjs": { "optional": true }, @@ -1976,28 +1744,11 @@ }, "moment": { "optional": true - } - } - }, - "node_modules/@mui/x-date-pickers/node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==", - "peer": true - }, - "node_modules/@mui/x-date-pickers/node_modules/@date-io/dayjs": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz", - "integrity": "sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw==", - "peer": true, - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "dayjs": "^1.8.17" - }, - "peerDependenciesMeta": { - "dayjs": { + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { "optional": true } } @@ -2065,12 +1816,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.38.0.tgz", - "integrity": "sha512-xis/RXXsLxwThKnlIXouxmIvvT3zvQj1JE39GsNieMUrMpb3/GySHDh2j8itCG22qKVD4MYLBp7xB73cUW/UUw==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", + "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", "dev": true, "dependencies": { - "playwright": "1.38.0" + "playwright": "1.44.1" }, "bin": { "playwright": "cli.js" @@ -2080,23 +1831,23 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@reduxjs/toolkit": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz", - "integrity": "sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", "dependencies": { - "immer": "^9.0.16", - "redux": "^4.2.0", + "immer": "^9.0.21", + "redux": "^4.2.1", "redux-thunk": "^2.4.2", - "reselect": "^4.1.7" + "reselect": "^4.1.8" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18", @@ -2112,11 +1863,11 @@ } }, "node_modules/@remix-run/router": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", - "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", "engines": { - "node": ">=14" + "node": ">=14.0.0" } }, "node_modules/@sindresorhus/is": { @@ -2143,11 +1894,6 @@ "node": ">=10" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -2158,9 +1904,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true }, "node_modules/@tsconfig/node12": { @@ -2176,15 +1922,15 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", @@ -2192,9 +1938,9 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -2213,18 +1959,18 @@ } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -2232,9 +1978,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", - "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2242,9 +1988,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -2252,15 +1998,15 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -2270,20 +2016,21 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", + "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-3zsplnP2djeps5P9OyarTxwRpMLoe5Ash8aL9iprw0JxB+FAHjY+ifn4yZUuW4/9hqtnmor6uvjSRzJhiVbrEQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/flat/-/flat-5.0.5.tgz", + "integrity": "sha512-nPLljZQKSnac53KDUDzuzdRfGI0TDb5qPrb+SrQyN3MtdQrOnGsKniHN1iYZsJEBIVQve94Y6gNz22sgISZq+Q==", "dev": true }, "node_modules/@types/fs-extra": { @@ -2314,9 +2061,9 @@ "dev": true }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -2329,30 +2076,36 @@ "dev": true }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/js-yaml": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.6.tgz", - "integrity": "sha512-ACTuifTSIIbyksx2HTon3aFtCKWcID7/h3XEmRpDYdMCXxPbl+m9GteOJeaAkiAta/NJaSFuA7ahZ0NkwajDSw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2370,9 +2123,9 @@ } }, "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "node_modules/@types/minimatch": { @@ -2383,60 +2136,63 @@ "optional": true }, "node_modules/@types/node": { - "version": "18.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", - "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", - "dev": true + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "node_modules/@types/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", - "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "devOptional": true, "dependencies": { "@types/react": "*" } }, - "node_modules/@types/react-is": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", - "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-router": { "version": "5.1.20", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", @@ -2459,17 +2215,17 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "dependencies": { "@types/react": "*" } }, "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, "dependencies": { "@types/node": "*" @@ -2481,40 +2237,46 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { - "@types/mime": "*", - "@types/node": "*" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { "@types/node": "*" @@ -2526,18 +2288,18 @@ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, "optional": true, "dependencies": { @@ -2545,19 +2307,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", - "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/type-utils": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -2579,14 +2341,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", - "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -2606,13 +2368,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2623,13 +2385,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", - "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2650,9 +2412,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2663,13 +2425,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2690,18 +2452,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", - "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -2716,12 +2478,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2732,6 +2494,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vercel/webpack-asset-relocator-loader": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz", @@ -2742,151 +2510,160 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -2919,9 +2696,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2931,9 +2708,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -2949,9 +2726,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -2970,28 +2747,17 @@ } }, "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" }, "engines": { "node": ">= 8.0.0" } }, - "node_modules/agentkeepalive/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3006,14 +2772,14 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -3036,6 +2802,18 @@ } } }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3068,210 +2846,77 @@ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appdmg": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", - "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "async": "^1.4.2", - "ds-store": "^0.1.5", - "execa": "^1.0.0", - "fs-temp": "^1.0.0", - "fs-xattr": "^0.3.0", - "image-size": "^0.7.4", - "is-my-json-valid": "^2.20.0", - "minimist": "^1.1.3", - "parse-color": "^1.0.0", - "path-exists": "^4.0.0", - "repeat-string": "^1.5.4" - }, - "bin": { - "appdmg": "bin/appdmg.js" - }, - "engines": { - "node": ">=8.5" - } - }, - "node_modules/appdmg/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "optional": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/appdmg/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "optional": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appdmg/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "optional": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appdmg/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appdmg/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "optional": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/appdmg/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" } }, - "node_modules/appdmg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">=8" } }, - "node_modules/appdmg/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, "dependencies": { - "shebang-regex": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/appdmg/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/appdmg/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/appdmg": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", + "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", "dev": true, "optional": true, + "os": [ + "darwin" + ], "dependencies": { - "isexe": "^2.0.0" + "async": "^1.4.2", + "ds-store": "^0.1.5", + "execa": "^1.0.0", + "fs-temp": "^1.0.0", + "fs-xattr": "^0.3.0", + "image-size": "^0.7.4", + "is-my-json-valid": "^2.20.0", + "minimist": "^1.1.3", + "parse-color": "^1.0.0", + "path-exists": "^4.0.0", + "repeat-string": "^1.5.4" }, "bin": { - "which": "bin/which" + "appdmg": "bin/appdmg.js" + }, + "engines": { + "node": ">=8.5" } }, "node_modules/aproba": { @@ -3284,6 +2929,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "dev": true, "dependencies": { "delegates": "^1.0.0", @@ -3304,6 +2950,22 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -3311,15 +2973,16 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -3338,15 +3001,35 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3357,14 +3040,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3374,6 +3057,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asar": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", @@ -3397,6 +3102,16 @@ "@types/glob": "^7.1.1" } }, + "node_modules/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -3440,10 +3155,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -3485,6 +3203,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -3516,12 +3235,15 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -3541,19 +3263,14 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "node_modules/bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" - }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -3561,7 +3278,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -3586,23 +3303,15 @@ "dev": true }, "node_modules/bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } }, - "node_modules/bonjour-service/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -3637,21 +3346,21 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -3661,13 +3370,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -3680,6 +3393,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -3777,6 +3491,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -3814,9 +3529,9 @@ } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "dependencies": { "clone-response": "^1.0.2", @@ -3831,14 +3546,35 @@ "node": ">=8" } }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3862,20 +3598,10 @@ "tslib": "^2.0.3" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001452", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001452.tgz", - "integrity": "sha512-Lkp0vFjMkBB3GTpLR8zk4NwW5EdRdnitwYJHDOOKIU85x4ckYCPQ+9WlVvSVClHxVReefkUMtWZH2l9KGlD51w==", + "version": "1.0.30001628", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz", + "integrity": "sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA==", "dev": true, "funding": [ { @@ -3885,6 +3611,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -3905,16 +3635,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3927,6 +3651,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -3953,9 +3680,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "engines": { "node": ">=6.0" @@ -3965,12 +3692,13 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true + "dev": true, + "optional": true }, "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "dependencies": { "source-map": "~0.6.0" @@ -3979,6 +3707,15 @@ "node": ">= 10.0" } }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -4001,9 +3738,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "engines": { "node": ">=6" @@ -4078,9 +3815,9 @@ } }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } @@ -4113,15 +3850,15 @@ } }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "engines": { "node": ">= 6" @@ -4267,9 +4004,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, "engines": { "node": ">= 0.6" @@ -4315,6 +4052,13 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "optional": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4376,9 +4120,9 @@ } }, "node_modules/cross-zip": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.0.tgz", - "integrity": "sha512-MEzGfZo0rqE10O/B+AEcCSJLZsrWuRUvmqJTqHNqBtALhaJc3E3ixLGLJNTRzEA2K34wbmOHC4fwYs9sVsdcCA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz", + "integrity": "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==", "dev": true, "funding": [ { @@ -4399,19 +4143,19 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -4421,7 +4165,16 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-select": { @@ -4464,16 +4217,66 @@ "node": ">=4" } }, - "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", - "peer": true + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" }, "node_modules/debounce-fn": { "version": "4.0.0", @@ -4489,19 +4292,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -4514,16 +4308,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -4558,9 +4342,9 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4578,6 +4362,65 @@ "node": ">= 10" } }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -4599,6 +4442,23 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -4609,11 +4469,12 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4650,9 +4511,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, "engines": { "node": ">=8" @@ -4695,16 +4556,10 @@ "node": ">=8" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -4757,11 +4612,6 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -4846,14 +4696,14 @@ "dev": true }, "node_modules/electron": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-22.0.0.tgz", - "integrity": "sha512-cgRc4wjyM+81A0E8UGv1HNJjL1HBI5cWNh/DUIjzYvoUuiEM0SS0hAH/zaFQ18xOz2ced6Yih8SybpOiOYJhdg==", + "version": "26.6.10", + "resolved": "https://registry.npmjs.org/electron/-/electron-26.6.10.tgz", + "integrity": "sha512-pV2SD0RXzAiNRb/2yZrsVmVkBOMrf+DVsPulIgRjlL0+My9BL5spFuhHVMQO9yHl9tFpWtuRpQv0ofM/i9P8xg==", "dev": true, "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", - "@types/node": "^16.11.26", + "@types/node": "^18.11.18", "extract-zip": "^2.0.1" }, "bin": { @@ -4930,9 +4780,9 @@ } }, "node_modules/electron-installer-debian": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz", - "integrity": "sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz", + "integrity": "sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==", "dev": true, "optional": true, "os": [ @@ -4947,7 +4797,7 @@ "get-folder-size": "^2.0.1", "lodash": "^4.17.4", "word-wrap": "^1.2.3", - "yargs": "^15.0.1" + "yargs": "^16.0.2" }, "bin": { "electron-installer-debian": "src/cli.js" @@ -4980,29 +4830,15 @@ } }, "node_modules/electron-installer-debian/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "optional": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/electron-installer-debian/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "optional": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "wrap-ansi": "^7.0.0" } }, "node_modules/electron-installer-debian/node_modules/fs-extra": { @@ -5021,105 +4857,33 @@ "node": ">=10" } }, - "node_modules/electron-installer-debian/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "optional": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "optional": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-installer-debian/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "optional": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "optional": true - }, "node_modules/electron-installer-debian/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "optional": true, "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/electron-installer-debian/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "optional": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/electron-installer-dmg": { @@ -5143,9 +4907,9 @@ } }, "node_modules/electron-installer-redhat": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.3.0.tgz", - "integrity": "sha512-hXIXB3uQXmXZy/v3MpbwWN4Of28ALpPt9ZyUDNEoSe0w7QZceL9IqI2K6Q6imiBJCLRC0hmT94WhlKj1RyGOWg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz", + "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==", "dev": true, "optional": true, "os": [ @@ -5252,6 +5016,7 @@ "version": "17.1.2", "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.2.tgz", "integrity": "sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw==", + "deprecated": "Please use @electron/packager moving forward. There is no API change, just a package name change", "dev": true, "dependencies": { "@electron/asar": "^3.2.1", @@ -5285,9 +5050,9 @@ } }, "node_modules/electron-packager/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -5299,18 +5064,18 @@ } }, "node_modules/electron-playwright-helpers": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/electron-playwright-helpers/-/electron-playwright-helpers-1.6.0.tgz", - "integrity": "sha512-0csyp77xRAi8m5g1ApcYdTMJ8n0+Geyb4huyMAsIYTInk4wsuUTHmIy2gMfgF3I130ogfpX6ZfEGeffS93FaUA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/electron-playwright-helpers/-/electron-playwright-helpers-1.7.1.tgz", + "integrity": "sha512-S9mo7LfpERgub2WIuYVPpib4XKFeAqBP+mxYf5Bv7E0B5GUB+LUbSj6Fpu39h18Ar635Nf9nQYTmypjuvaYJng==", "dev": true, "dependencies": { "@electron/asar": "^3.2.4" } }, "node_modules/electron-squirrel-startup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz", - "integrity": "sha512-Oce8mvgGdFmwr+DsAcXBmFK8jFfN6yaFAP9IvyhTfupM3nFkBku/7VS/mdtJteWumImkC6P+BKGsxScoDDkv9Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.1.tgz", + "integrity": "sha512-sTfFIHGku+7PsHLJ7v0dRcZNkALrV+YEozINTW8X1nM//e5O3L+rfYuvSW00lmGHnYmUjARZulD8F2V8ISI9RA==", "dependencies": { "debug": "^2.2.0" } @@ -5329,9 +5094,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/electron-store": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.1.0.tgz", - "integrity": "sha512-2clHg/juMjOH0GT9cQ6qtmIvK183B39ZXR0bUoPwKwYHJsEF3quqyDzMFUAu+0OP8ijmN2CbPRAelhNbWUbzwA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.2.0.tgz", + "integrity": "sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw==", "dependencies": { "conf": "^10.2.0", "type-fest": "^2.17.0" @@ -5340,27 +5105,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/electron-store/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/electron-to-chromium": { - "version": "1.4.297", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.297.tgz", - "integrity": "sha512-dTXLXBdzfDYnZYq+bLer21HrFsEkzlR2OSIOsR+qroDmhmQU3i4T4KdY0Lcp83ZId3HnWTpPAEfhaJtVxmS/dQ==", + "version": "1.4.790", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz", + "integrity": "sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A==", "dev": true }, "node_modules/electron-winstaller": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.1.0.tgz", - "integrity": "sha512-4wlZzkUm5cJNiOtp5wL804+QpygdKTKkrZJXA3sSDEI2XnCVPv0kxmxUvVw4KHBwbNS+Yox89agEr+VkR7kxww==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.3.1.tgz", + "integrity": "sha512-oM8BW3a8NEqG0XW+Vx3xywhk0DyDV4T0jT0zZfWt0IczNT3jHAAvQWBorF8osQDplSsCyXXyxrsrQ8cY0Slb/A==", "dev": true, "hasInstallScript": true, "optional": true, @@ -5368,11 +5122,14 @@ "@electron/asar": "^3.2.1", "debug": "^4.1.1", "fs-extra": "^7.0.1", - "lodash.template": "^4.2.2", + "lodash": "^4.17.21", "temp": "^0.9.0" }, "engines": { "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" } }, "node_modules/electron-winstaller/node_modules/fs-extra": { @@ -5411,10 +5168,13 @@ } }, "node_modules/electron/node_modules/@types/node": { - "version": "16.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.12.tgz", - "integrity": "sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==", - "dev": true + "version": "18.19.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.34.tgz", + "integrity": "sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5451,6 +5211,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -5460,6 +5221,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -5478,9 +5240,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -5522,44 +5284,57 @@ } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -5568,33 +5343,66 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -5622,9 +5430,9 @@ "optional": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -5648,49 +5456,48 @@ } }, "node_modules/eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -5704,14 +5511,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -5724,9 +5531,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -5759,26 +5566,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -5809,9 +5618,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5830,40 +5639,16 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ajv": { @@ -5883,9 +5668,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -5893,6 +5678,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { @@ -5904,21 +5692,48 @@ "node": ">=4.0" } }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5928,9 +5743,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -6012,44 +5827,89 @@ } }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "engines": { + "node": ">=4.8" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } }, "node_modules/expand-tilde": { "version": "2.0.2", @@ -6063,18 +5923,24 @@ "node": ">=0.10.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -6155,15 +6021,30 @@ "@types/yauzl": "^2.9.1" } }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6201,9 +6082,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -6262,22 +6143,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -6305,9 +6170,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -6379,12 +6244,13 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -6392,9 +6258,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/flora-colossus": { @@ -6421,9 +6287,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -6528,9 +6394,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, "node_modules/fs-temp": { @@ -6564,9 +6430,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -6611,20 +6477,23 @@ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -6660,6 +6529,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "optional": true }, @@ -6667,6 +6537,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "dev": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -6735,14 +6606,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6779,28 +6655,26 @@ "dev": true }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "dependencies": { "pump": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -6809,19 +6683,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gifwrap": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz", - "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==", - "dependencies": { - "image-q": "^4.0.0", - "omggif": "^1.0.10" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -6856,15 +6722,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, "node_modules/global-agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", @@ -6926,27 +6783,21 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7013,15 +6864,15 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/handle-thing": { @@ -7030,17 +6881,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -7060,21 +6900,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -7096,12 +6936,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -7116,6 +6956,17 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -7168,10 +7019,16 @@ "wbuf": "^1.1.0" } }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -7198,11 +7055,21 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, "node_modules/html-minifier-terser": { "version": "6.1.0", @@ -7235,9 +7102,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -7254,7 +7121,16 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/htmlparser2": { @@ -7434,6 +7310,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -7450,27 +7327,14 @@ ] }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" } }, - "node_modules/image-q": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", - "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", - "dependencies": { - "@types/node": "16.9.1" - } - }, - "node_modules/image-q/node_modules/@types/node": { - "version": "16.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", - "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" - }, "node_modules/image-size": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", @@ -7485,9 +7349,9 @@ } }, "node_modules/immer": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", - "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -7546,6 +7410,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -7564,13 +7429,13 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -7586,11 +7451,18 @@ "node": ">=10.13.0" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -7602,14 +7474,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7673,11 +7547,26 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, "dependencies": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7731,11 +7620,6 @@ "node": ">=8" } }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7785,9 +7669,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -7885,27 +7769,27 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/is-string": { @@ -7939,16 +7823,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -8003,9 +7883,9 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "node_modules/isbinaryfile": { @@ -8035,15 +7915,6 @@ "node": ">=0.10.0" } }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -8073,32 +7944,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jimp": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.22.10.tgz", - "integrity": "sha512-lCaHIJAgTOsplyJzC1w/laxSxrbSsEBw4byKwXgUdMmh+ayPsnidTblenQm+IvhIs44Gcuvlb6pd2LQ0wcKaKg==", - "dependencies": { - "@jimp/custom": "^0.22.10", - "@jimp/plugins": "^0.22.10", - "@jimp/types": "^0.22.10", - "regenerator-runtime": "^0.13.3" - } - }, - "node_modules/jpeg-js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", - "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" - }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8115,6 +7960,23 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -8193,9 +8055,9 @@ } }, "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -8210,6 +8072,16 @@ "node": ">=0.10.0" } }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -8229,9 +8101,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/listr2": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.7.tgz", - "integrity": "sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "dependencies": { "cli-truncate": "^2.1.0", @@ -8255,29 +8127,6 @@ } } }, - "node_modules/load-bmfont": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", - "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", - "dependencies": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - } - }, - "node_modules/load-bmfont/node_modules/buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -8348,13 +8197,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "dev": true, - "optional": true - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -8367,27 +8209,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "optional": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "optional": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -8483,32 +8304,14 @@ } }, "node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, - "node_modules/lzma-native": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.6.tgz", - "integrity": "sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.1.0", - "node-gyp-build": "^4.2.1", - "readable-stream": "^3.6.0" - }, - "bin": { - "lzmajs": "bin/lzmajs" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/macos-alias": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", @@ -8604,13 +8407,22 @@ "node": ">=6" } }, + "node_modules/mem/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -8647,12 +8459,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -8663,6 +8475,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -8692,11 +8505,11 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/mimic-response": { @@ -8708,14 +8521,6 @@ "node": ">=4" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dependencies": { - "dom-walk": "^0.1.0" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -8867,8 +8672,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -8896,17 +8700,23 @@ } }, "node_modules/nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", "dev": true, "optional": true }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -8958,9 +8768,9 @@ } }, "node_modules/node-abi": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", - "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==", + "version": "3.63.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.63.0.tgz", + "integrity": "sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -8975,25 +8785,20 @@ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "dev": true }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, "node_modules/node-api-version": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", - "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", + "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", "dev": true, "dependencies": { "semver": "^7.3.5" } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -9019,12 +8824,13 @@ } }, "node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dev": true, "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", @@ -9042,17 +8848,6 @@ "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/node-loader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", @@ -9073,9 +8868,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/nopt": { @@ -9106,9 +8901,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -9136,21 +8931,31 @@ } }, "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "path-key": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" } }, "node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "dev": true, "dependencies": { "are-we-there-yet": "^3.0.0", @@ -9183,9 +8988,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9201,13 +9006,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -9218,15 +9023,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9241,11 +9078,6 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "node_modules/omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -9290,10 +9122,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/onetime/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, "node_modules/open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -9308,9 +9148,9 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { "deep-is": "^0.1.3", @@ -9318,7 +9158,7 @@ "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -9458,11 +9298,6 @@ "node": ">=6" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -9496,25 +9331,6 @@ "node": ">=0.10.0" } }, - "node_modules/parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==" - }, - "node_modules/parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==" - }, - "node_modules/parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "dependencies": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, "node_modules/parse-color": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", @@ -9532,11 +9348,6 @@ "dev": true, "optional": true }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -9628,34 +9439,16 @@ "node": ">=8" } }, - "node_modules/peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, - "node_modules/phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" - }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -9678,25 +9471,6 @@ "node": ">=0.10.0" } }, - "node_modules/pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", - "dependencies": { - "pngjs": "^3.0.0" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, - "node_modules/pixelmatch/node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -9829,12 +9603,12 @@ } }, "node_modules/playwright": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.38.0.tgz", - "integrity": "sha512-fJGw+HO0YY+fU/F1N57DMO+TmXHTrmr905J05zwAQE9xkuwP/QLDk63rVhmyxh03dYnEhnRbsdbH9B0UVVRB3A==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", + "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", "dev": true, "dependencies": { - "playwright-core": "1.38.0" + "playwright-core": "1.44.1" }, "bin": { "playwright": "cli.js" @@ -9847,9 +9621,9 @@ } }, "node_modules/playwright-core": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.38.0.tgz", - "integrity": "sha512-f8z1y8J9zvmHoEhKgspmCvOExF2XdcxMW8jNRuX4vkQFrzV4MlZ55iwb5QeyiFQgOFCUolXiRHgpjSEnqvO48g==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", + "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -9858,31 +9632,47 @@ "node": ">=16" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "dependencies": { + "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" }, "engines": { - "node": ">=6" + "node": ">=10.4.0" } }, - "node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, "engines": { - "node": ">=12.13.0" + "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -9892,21 +9682,25 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { "node": "^10 || ^12 || >= 14" @@ -9916,9 +9710,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -9933,9 +9727,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -9963,9 +9757,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -9981,6 +9775,32 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "optional": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10000,14 +9820,6 @@ "renderkid": "^3.0.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10081,9 +9893,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -10174,9 +9986,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -10189,9 +10001,9 @@ } }, "node_modules/rcedit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.0.1.tgz", - "integrity": "sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", + "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", "dev": true, "dependencies": { "cross-spawn-windows-exe": "^1.1.0" @@ -10201,9 +10013,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -10212,26 +10024,26 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/react-redux": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", - "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", + "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -10246,7 +10058,7 @@ "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0", "react-native": ">=0.59", - "redux": "^4" + "redux": "^4 || ^5.0.0-beta.0" }, "peerDependenciesMeta": { "@types/react": { @@ -10267,29 +10079,29 @@ } }, "node_modules/react-router": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", - "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", "dependencies": { - "@remix-run/router": "1.3.2" + "@remix-run/router": "1.16.1" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8" } }, "node_modules/react-router-dom": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", - "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", "dependencies": { - "@remix-run/router": "1.3.2", - "react-router": "6.8.1" + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8", @@ -10311,6 +10123,18 @@ "react-dom": ">=16.6.0" } }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, "node_modules/read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -10418,9 +10242,10 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10430,21 +10255,6 @@ "node": ">= 6" } }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -10486,19 +10296,20 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -10507,18 +10318,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -10568,13 +10367,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "optional": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -10582,16 +10374,16 @@ "dev": true }, "node_modules/reselect": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -10687,24 +10479,16 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", "dev": true }, - "node_modules/rifm": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz", - "integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==", - "peer": true, - "peerDependencies": { - "react": ">=16.8" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -10758,18 +10542,37 @@ } }, "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "dependencies": { "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -10786,15 +10589,18 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10803,25 +10609,20 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "dev": true }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -10874,11 +10675,12 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -10886,12 +10688,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -10906,17 +10705,6 @@ "dev": true, "optional": true }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -10992,9 +10780,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -11099,6 +10887,38 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -11138,15 +10958,28 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11203,16 +11036,16 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, @@ -11231,18 +11064,17 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -11258,10 +11090,19 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -11269,9 +11110,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -11285,9 +11126,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/spdy": { @@ -11321,11 +11162,10 @@ } }, "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, - "optional": true + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true }, "node_modules/ssri": { "version": "9.0.1", @@ -11362,6 +11202,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -11380,29 +11221,50 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11480,26 +11342,10 @@ "node": ">=0.8.0" } }, - "node_modules/strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -11513,9 +11359,9 @@ } }, "node_modules/stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/sudo-prompt": { "version": "9.2.1", @@ -11568,14 +11414,14 @@ } }, "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -11585,9 +11431,9 @@ } }, "node_modules/tar/node_modules/minipass": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", - "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { "node": ">=8" @@ -11624,6 +11470,7 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "optional": true, "dependencies": { @@ -11634,13 +11481,13 @@ } }, "node_modules/terser": { - "version": "5.16.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", - "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -11652,16 +11499,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -11709,11 +11556,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/timm": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", - "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" - }, "node_modules/tiny-each-async": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", @@ -11721,22 +11563,14 @@ "dev": true, "optional": true }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, "optional": true, - "dependencies": { - "rimraf": "^3.0.0" - }, "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/tmp-promise": { @@ -11793,31 +11627,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, + "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "node": ">=0.6" } }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/trim-repeated": { "version": "1.0.0", @@ -11841,15 +11660,16 @@ } }, "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -11859,10 +11679,19 @@ "webpack": "^5.0.0" } }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -11903,13 +11732,13 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -11927,9 +11756,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, "node_modules/tsutils": { @@ -11966,12 +11795,11 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11990,15 +11818,74 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12032,6 +11919,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unique-filename": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", @@ -12057,9 +11950,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -12085,9 +11978,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -12097,14 +11990,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -12119,9 +12016,9 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -12139,136 +12036,11 @@ "node": ">=8" } }, - "node_modules/username/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/username/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/username/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/username/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/username/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/username/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/username/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/username/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/username/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/username/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/utif2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/utif2/-/utif2-4.1.0.tgz", - "integrity": "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w==", - "dependencies": { - "pako": "^1.0.11" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/utila": { "version": "0.4.0", @@ -12320,9 +12092,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -12353,37 +12125,38 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/webpack": { - "version": "5.76.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", - "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dev": true, "dependencies": { "@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", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -12403,9 +12176,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -12425,28 +12198,16 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -12457,9 +12218,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -12468,7 +12229,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -12481,6 +12242,7 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", @@ -12489,8 +12251,8 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -12506,42 +12268,33 @@ "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { + "webpack": { + "optional": true + }, "webpack-cli": { "optional": true } } }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, "engines": { "node": ">= 10" } }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -12552,9 +12305,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, "engines": { "node": ">=10.0.0" @@ -12573,12 +12326,13 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" }, "engines": { @@ -12617,15 +12371,11 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -12662,25 +12412,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true, - "optional": true - }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12699,15 +12441,15 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -12757,42 +12499,6 @@ } } }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==" - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", @@ -12814,6 +12520,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "optional": true, "engines": { "node": ">=0.4" } @@ -12822,12 +12530,14 @@ "version": "4.19.0", "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.19.0.tgz", "integrity": "sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ==", + "deprecated": "This package is now deprecated. Move to @xterm/xterm instead.", "dev": true }, "node_modules/xterm-addon-fit": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz", "integrity": "sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==", + "deprecated": "This package is now deprecated. Move to @xterm/addon-fit instead.", "dev": true, "peerDependencies": { "xterm": "^4.0.0" @@ -12837,6 +12547,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/xterm-addon-search/-/xterm-addon-search-0.8.2.tgz", "integrity": "sha512-I1863mjn8P6uVrqm/X+btalVsqjAKLhnhpbP7SavAOpEkI1jJhbHU2UTp7NjeRtcKTks6UWk/ycgds5snDSejg==", + "deprecated": "This package is now deprecated. Move to @xterm/addon-search instead.", "dev": true, "peerDependencies": { "xterm": "^4.0.0" @@ -12854,20 +12565,24 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz", + "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } }, "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -12934,9 +12649,9 @@ } }, "node_modules/yarn-or-npm/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" diff --git a/package.json b/package.json index abe2b24a..23992c7e 100644 --- a/package.json +++ b/package.json @@ -17,13 +17,13 @@ "keywords": [], "license": "EPL 2.0", "devDependencies": { - "@electron-forge/cli": "^6.0.5", - "@electron-forge/maker-deb": "^6.0.5", - "@electron-forge/maker-dmg": "^6.0.5", - "@electron-forge/maker-rpm": "^6.0.5", - "@electron-forge/maker-squirrel": "^6.0.5", - "@electron-forge/maker-zip": "^6.0.5", - "@electron-forge/plugin-webpack": "^6.0.5", + "@electron-forge/cli": "^6.4.0", + "@electron-forge/maker-deb": "^6.4.0", + "@electron-forge/maker-dmg": "^6.4.0", + "@electron-forge/maker-rpm": "^6.4.0", + "@electron-forge/maker-squirrel": "^6.4.0", + "@electron-forge/maker-zip": "^6.4.0", + "@electron-forge/plugin-webpack": "^6.4.0", "@playwright/test": "^1.38.0", "@types/flat": "^5.0.2", "@types/js-yaml": "^4.0.5", @@ -32,9 +32,9 @@ "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", - "@vercel/webpack-asset-relocator-loader": "^1.7.3", + "@vercel/webpack-asset-relocator-loader": "1.7.3", "css-loader": "^6.7.3", - "electron": "22.0.0", + "electron": "^26.0.0", "electron-playwright-helpers": "^1.6.0", "eslint": "^8.34.0", "eslint-plugin-header": "^3.1.1", @@ -67,7 +67,6 @@ "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "flat": "^5.0.2", - "jimp": "^0.22.10", "js-yaml": "^4.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", From 10297a8ea31052e5e99e0b6a8ad2032809dd4fc5 Mon Sep 17 00:00:00 2001 From: 1000TurquoisePogs Date: Wed, 5 Jun 2024 16:51:30 +0200 Subject: [PATCH 066/455] Change es target as stated by compile Signed-off-by: 1000TurquoisePogs --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 4064e523..e29e1b36 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "jsx": "react-jsx", - "target": "ES6", + "target": "es2021", "allowJs": true, "module": "commonjs", "skipLibCheck": true, From ad0480aa41da970f9fdf9f959e1a985ed60d0b75 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 12:39:33 -0400 Subject: [PATCH 067/455] Fix next button for init stage Signed-off-by: Timothy Gerstel --- .../stages/installation/Installation.tsx | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index d0050da1..ed6df793 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -182,9 +182,7 @@ const Installation = () => { if(installationType === 'smpe') { const status = getProgress('datasetInstallationStatus'); setStageSkipStatus(!status); - setDsInstallStageStatus(status); - } else { - updateProgress(getProgress('datasetInstallationStatus')); + installProceedActions(status); } return () => { @@ -199,7 +197,6 @@ const Installation = () => { const nextPosition = document.getElementById('installation-progress'); nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end' }); setStateUpdated(!stateUpdated); - dispatch(setDatasetInstallationStatus(false)); } }, [initClicked]); @@ -218,7 +215,7 @@ const Installation = () => { timer = setInterval(() => { window.electron.ipcRenderer.getInstallationProgress().then((res: any) => { setMvsDatasetInitializationProgress(res); - setDatasetInstallationStatus(res) + dispatch(setDatasetInstallationStatus(stageComplete)) }) }, 3000); } @@ -243,13 +240,6 @@ const Installation = () => { stages[STAGE_ID].isSkipped = status; mapAndSetSkipStatus(SUB_STAGE_ID, status); } - - const setDsInstallStageStatus = (status: boolean) => { - dispatch(setNextStepEnabled(status)); - dispatch(setInitializationStatus(status)); - dispatch(setDatasetInstallationStatus(status)); - } - const updateProgress = (status: boolean) => { setStateUpdated(!stateUpdated); setStageSkipStatus(!status); @@ -261,8 +251,8 @@ const Installation = () => { } const allAttributesTrue = Object.values(mvsDatasetInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; - setDsInstallStageStatus(status); - setMvsDatasetInitializationProgress(getDatasetInstallationState()); + installProceedActions(status); + // setMvsDatasetInitializationProgress(getDatasetInstallationState()); } const toggleEditorVisibility = (type: any) => { @@ -302,8 +292,7 @@ const Installation = () => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; clearInterval(timer); } else { - installProceedActions(res.status); - updateProgress(true) + updateProgress(res.status) stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; clearInterval(timer); } From d27cb1cbc38206bfd610c99b630b7cc797bb1b74 Mon Sep 17 00:00:00 2001 From: Sergei Kurnevich Date: Wed, 5 Jun 2024 21:18:20 +0200 Subject: [PATCH 068/455] set of hotfixes Signed-off-by: Sergei Kurnevich --- .../components/stages/LaunchConfig.tsx | 4 ++-- src/renderer/components/stages/Networking.tsx | 20 +++++++++---------- src/renderer/components/stages/Planning.tsx | 2 +- .../stages/connection/Connection.tsx | 3 ++- .../installation/InstallTypeSelection.tsx | 11 +++++----- src/renderer/global.css | 2 +- 6 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 88351356..cd043d3e 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -494,8 +494,8 @@ const LaunchConfig = () => { setStageConfig(false, errPath+' '+errMsg, newData); } else { const newYaml = {...yaml, zowe: {...yaml.zowe, configmgr: newData.configmgr, launchScript: newData.launchScript}}; - await window.electron.ipcRenderer.setConfigByKey("zowe.configmgr", newData.configmgr); - await window.electron.ipcRenderer.setConfigByKey("zowe.launchScript", newData.launchScript); + await window.electron.ipcRenderer.setConfigByKeyAndValidate("zowe.configmgr", newData.configmgr); + await window.electron.ipcRenderer.setConfigByKeyAndValidate("zowe.launchScript", newData.launchScript); dispatch(setYaml(newYaml)); setStageConfig(true, '', newData); } diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index db1c9e9d..8c469da6 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -50,8 +50,8 @@ function PatternPropertiesForm(props: any){ // console.log('matched pattern ' + pattern + ' to ' + toMatch[k] + ' for key' + keys[i]); const matchedProps = Object.keys(yamlValue[toMatch[k]]); if(matchedProps.length > 0) { - newElements.push({toMatch[k]}) - newElements.push(
); + newElements.push({toMatch[k]}) + newElements.push(
); // console.log('matchedProps:', matchedProps); for(let l = 0; l < matchedProps.length && l < LOOP_LIMIT; l++){ // pattern = patterns[j] = current regex pattern from patternProperties @@ -67,22 +67,22 @@ function PatternPropertiesForm(props: any){ // console.log('new yaml:', JSON.stringify({...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}})); const newYaml = {...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}}; setLYaml(newYaml); - await window.electron.ipcRenderer.setConfigByKey(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, !yaml[keys[i]][toMatch[k]][matchedProps[l]]) + await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, !yaml[keys[i]][toMatch[k]][matchedProps[l]]) dispatch(setYaml(newYaml)); }}/>} />) - newElements.push(
); + newElements.push(
); break; case 'number': newElements.push( { const newYaml = {...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: Number(e.target.value)}}}; setLYaml(newYaml); - await window.electron.ipcRenderer.setConfigByKey(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, Number(e.target.value)) + await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, Number(e.target.value)) dispatch(setYaml(newYaml)); }} />) @@ -90,7 +90,7 @@ function PatternPropertiesForm(props: any){ break; } } - newElements.push(
); + newElements.push(
); } } } @@ -103,7 +103,7 @@ function PatternPropertiesForm(props: any){ } }, [yaml]) - return
+ return
{elements}
} @@ -736,7 +736,7 @@ const Networking = () => { dispatch(setYaml(newYaml)) setLYaml(newYaml); }}>

- {yaml.zowe.externalDomains != undefined && yaml.zowe.externalDomains.map((domain: string, index: number) => { @@ -769,7 +769,7 @@ const Networking = () => { dispatch(setYaml(newYaml)) setLYaml(newYaml); // // props.setYaml(newYaml); - // await window.electron.ipcRenderer.setConfigByKey(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, Number(e.target.value)) + // await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, Number(e.target.value)) // // dispatch(setYaml(newYaml)); }} /> diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index d4d1a970..8b126fb7 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -330,7 +330,7 @@ const Planning = () => { alertEmitter.emit('hideAlert'); setLocValidations(true); setPlanningState(true); - setStep(2); + // setStep(2); // This step is meant to show some usefull status, removing for now. } else { dispatch(setPlanningStatus(false)); alertEmitter.emit('showAlert', details.error, 'error'); diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 548560cd..6a938d26 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -43,7 +43,8 @@ const Connection = () => { const stageLabel = 'Connection'; const dispatch = useAppDispatch(); - const zoweCLIVersion = useAppSelector(selectZoweCLIVersion); + // const zoweCLIVersion = useAppSelector(selectZoweCLIVersion); // Remove this feature for now. + const zoweCLIVersion = ''; const [expanded, setExpanded] = React.useState('FTPConn'); const handleChange = (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => { diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index 5f063a41..6f2f1522 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -111,7 +111,8 @@ const InstallationType = () => { {installValue === "download" &&
- {`Zen will download the latest Zowe convenience build in PAX archive format from `} + Zen will download the latest Zowe convenience build in PAX archive format from. + { !agreeLicense &&

Please accept the license agreement to continue.

} {'https://zowe.org'}
@@ -124,10 +125,10 @@ const InstallationType = () => { {showLicense && }
} - {installValue === "upload" && - {`Select a local Zowe PAX file (offline installation).`} - } - {installValue === "upload" && <> - + {/* */}
diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index e141e19f..e0d7ca56 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -287,7 +287,7 @@ const InitApfAuth = () => {
- + {/* */} diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 88351356..56d28280 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -513,7 +513,7 @@ const LaunchConfig = () => {
- + {/* */} diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 4e15234a..94049671 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -722,7 +722,7 @@ const Networking = () => { yaml && schema &&
- + {/* */} diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index adfc2e8e..5186a0d0 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -107,7 +107,7 @@ const ReviewInstallation = () => {
- + {/* */} diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 443a5fef..2a570534 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -277,7 +277,7 @@ const Security = () => {
- + {/* */} diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index f0cb01a7..04f3abb2 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -297,7 +297,7 @@ const Vsam = () => {
- + {/* */} diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index ed6df793..f01e09af 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -354,7 +354,7 @@ const Installation = () => {
- + {/* */} diff --git a/src/renderer/index.html b/src/renderer/index.html index 07712fd7..77be82bd 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -2,7 +2,7 @@ - Zowe Enterprise Necessity + Zowe Server Install Wizard
From 070fb41dd8573e60a97435a45768492db1deec81 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 16:39:59 -0400 Subject: [PATCH 070/455] =?UTF-8?q?Fix=20SMPE=20install=20for=20real=20thi?= =?UTF-8?q?s=20time=F0=9F=AB=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 56 +++++++++++-------- .../stages/installation/Installation.tsx | 12 ++-- .../stages/progress/StageProgressStatus.ts | 2 +- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 5168f49d..f931c7ad 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -19,6 +19,13 @@ import * as fs from 'fs'; import { ConfigurationStore } from '../storage/ConfigurationStore'; import { InstallationArgs } from '../types/stateInterfaces'; +function removeRuntimeFromPath(path: string) +{ + var the_arr = path.split('/'); + the_arr.pop(); + return( the_arr.join('/') ); +} + class Installation { public async downloadUnpax ( @@ -237,7 +244,7 @@ class Installation { try { console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); ProgressStore.set('installation.uploadYaml', uploadYaml.status); if(!uploadYaml.status){ @@ -247,7 +254,7 @@ class Installation { let installation; if (installationArgs.installationType !== "smpe") { console.log("installing..."); - installation = await this.install(connectionArgs, installationArgs.installationDir); + installation = await this.install(connectionArgs, installationArgs); ProgressStore.set('installation.install', installation.status); } else { //If the user has opted to perform an SMPE installation, they must run 'zwe install' manually and therefore we set this to true @@ -262,7 +269,7 @@ class Installation { let initMvs; if(installation.status){ console.log("running zwe init mvs..."); - initMvs = await this.initMVS(connectionArgs, installationArgs.installationDir); + initMvs = await this.initMVS(connectionArgs, installationArgs); ProgressStore.set('installation.initMVS', initMvs.status); } else { initMvs = {status: false, details: `zwe install step failed, unable to run zwe init mvs.`} @@ -280,7 +287,8 @@ class Installation { } public async runApfAuth(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise{ + installationArgs: InstallationArgs, zoweConfig: object): Promise{ + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') await fs.writeFile(filePath, stringify(zoweConfig), (err) => { @@ -291,7 +299,7 @@ class Installation { }); ProgressStore.set('apfAuth.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); if(!uploadYaml.status){ ProgressStore.set('apfAuth.uploadYaml', false); return {status: false, details: 'Failed to upload YAML file'} @@ -299,14 +307,15 @@ class Installation { } ProgressStore.set('apfAuth.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'} && ./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('apfAuth.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} } public async runInitSecurity(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise{ + installationArgs: InstallationArgs, zoweConfig: object): Promise{ + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') await fs.writeFile(filePath, stringify(zoweConfig), (err) => { @@ -318,19 +327,20 @@ class Installation { }); ProgressStore.set('initSecurity.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); if(!uploadYaml.status){ return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } ProgressStore.set('initSecurity.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'} && ./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('initSecurity.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} } - async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string}, zoweConfig: any){ + async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: any){ + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') await fs.writeFile(filePath, stringify(zoweConfig), (err: any) => { @@ -341,21 +351,21 @@ class Installation { }); ProgressStore.set('certificate.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); if(!uploadYaml.status){ return ProgressStore.set('certificate.uploadYaml', false);; } ProgressStore.set('certificate.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'} && ./zwe init certificate --update-config -c ${installationArgs.installationDir}/zowe.yaml`; + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init certificate --update-config -c ${installationArgs.installationDir}/zowe.yaml`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} } public async initVsam(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise{ - + installationArgs: InstallationArgs, zoweConfig: object): Promise{ + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; // Initialize Progress Store For Vsam ProgressStore.set('initVsam.writeYaml', false); ProgressStore.set('initVsam.uploadYaml', false); @@ -372,7 +382,7 @@ class Installation { }); ProgressStore.set('initVsam.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); if(!uploadYaml.status){ return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } @@ -423,11 +433,11 @@ class Installation { return {status: false, details: 'Method not implemented.'} } - async install(connectionArgs: IIpcConnectionArgs, installDir: string): Promise { + async install(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs): Promise { return {status: false, details: 'Method not implemented.'} } - async initMVS(connectionArgs: IIpcConnectionArgs, installDir: string): Promise { + async initMVS(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs): Promise { return {status: false, details: 'Method not implemented.'} } @@ -481,16 +491,16 @@ export class FTPInstallation extends Installation { return {status: result.rc === 0, details: result.jobOutput} } - async install(connectionArgs: IIpcConnectionArgs, installDir: string) { - console.log("Check out this install arg! " + installDir); - const script = `cd ${installDir}/runtime/bin && ./zwe install -c ${installDir}/zowe.yaml --allow-overwritten`; + async install(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; + const script = `cd ${SMPE_INSTALL ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'}; ./zwe install -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir}/zowe.yaml --allow-overwritten`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } - async initMVS(connectionArgs: IIpcConnectionArgs, installDir: string) { - console.log("Check out this install arg! " + installDir); - const script = `cd ${installDir}/runtime/bin && ./zwe init mvs -c ${installDir}/zowe.yaml --allow-overwritten`; + async initMVS(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; + const script = `cd ${SMPE_INSTALL ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'}; ./zwe init mvs -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir}/zowe.yaml --allow-overwritten`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index ed6df793..9616c8c8 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -27,7 +27,7 @@ import {stages} from "../../configuration-wizard/Wizard"; import { setActiveStep } from "../progress/activeStepSlice"; import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK, FALLBACK_SCHEMA, FALLBACK_YAML } from '../../common/Constants'; import { getStageDetails, getSubStageDetails } from "../../../../services/StageDetails"; -import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments } from "../progress/StageProgressStatus"; +import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; import eventDispatcher from '../../../../services/eventDispatcher'; @@ -191,7 +191,7 @@ const Installation = () => { }, []); useEffect(() => { - setShowProgress(installationType!=='smpe' && (initClicked || getProgress('datasetInstallationStatus'))); + setShowProgress((initClicked || getProgress('datasetInstallationStatus'))); if(initClicked) { const nextPosition = document.getElementById('installation-progress'); @@ -205,13 +205,12 @@ const Installation = () => { if(allAttributesTrue) { dispatch(setNextStepEnabled(true)); dispatch(setDatasetInstallationStatus(true)); - setShowProgress(installationType!=='smpe' && (initClicked || getProgress('datasetInstallationStatus'))); } }, [mvsDatasetInitProgress]); useEffect(() => { const stageComplete = mvsDatasetInitProgress.uploadYaml && mvsDatasetInitProgress.initMVS && mvsDatasetInitProgress.install; - if(!getProgress('datasetInstallationStatus') && initClicked) { + if(!stageComplete && showProgress) { timer = setInterval(() => { window.electron.ipcRenderer.getInstallationProgress().then((res: any) => { setMvsDatasetInitializationProgress(res); @@ -222,7 +221,7 @@ const Installation = () => { return () => { clearInterval(timer); }; - }, [showProgress, stateUpdated]); + }, [showProgress, stateUpdated, mvsDatasetInitProgress]); const setMvsDatasetInitializationProgress = (datasetInitState: DatasetInstallationState) => { setMvsDatasetInitProgress(datasetInitState); @@ -276,6 +275,7 @@ const Installation = () => { dispatch(setLoading(false)); setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(true); + setMvsDatasetInitProgress(datasetInstallationStatus) dispatch(setLoading(false)); /* change skipDownload ?? false --> true to skip upload/download steps for quicker development */ window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml).then((res: IResponse) => { // Some parts of Zen pass the response as a string directly into the object @@ -292,7 +292,7 @@ const Installation = () => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; clearInterval(timer); } else { - updateProgress(res.status) + updateProgress(res.status); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; clearInterval(timer); } diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 3292dfad..5809fa28 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -55,7 +55,7 @@ const planningStageStatus: PlanningState = { isLocationValid: false, } -const datasetInstallationStatus: DatasetInstallationState = { +export const datasetInstallationStatus: DatasetInstallationState = { uploadYaml: false, install: false, initMVS: false From 8308d4f2e17b9de8c410b861ffe2bd2b87b0cfb6 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 16:45:48 -0400 Subject: [PATCH 071/455] Only remove runtime dir from path Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index f931c7ad..f889e8c1 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -22,7 +22,9 @@ import { InstallationArgs } from '../types/stateInterfaces'; function removeRuntimeFromPath(path: string) { var the_arr = path.split('/'); - the_arr.pop(); + if(the_arr[the_arr.length - 1].toLowerCase() === 'runtime'){ + the_arr.pop(); + } return( the_arr.join('/') ); } From 3ffdd56deb51f9dfe0583d48de6d8732b6cb8279 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 16:52:15 -0400 Subject: [PATCH 072/455] Not sure how this didnt throw an error or cause the app to crash, but added correct arg type Signed-off-by: Timothy Gerstel --- src/actions/InstallActions.ts | 8 ++++---- .../components/stages/installation/Installation.tsx | 10 ++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index 328389ed..3fabbd39 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -37,7 +37,7 @@ export class InstallActions { } runInitCertificates(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: any){ + installationArgs: InstallationArgs, zoweConfig: any){ return this.strategy.initCertificates(connectionArgs, installationArgs, zoweConfig) } @@ -55,17 +55,17 @@ export class InstallActions { } runInitSecurity(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { + installationArgs: InstallationArgs, zoweConfig: object): Promise { return this.strategy.runInitSecurity(connectionArgs, installationArgs, zoweConfig); } initVsam(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { + installationArgs: InstallationArgs, zoweConfig: object): Promise { return this.strategy.initVsam(connectionArgs, installationArgs, zoweConfig); } runApfAuth(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { + installationArgs: InstallationArgs, zoweConfig: object): Promise { return this.strategy.runApfAuth(connectionArgs, installationArgs, zoweConfig); } diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 9616c8c8..eb59370e 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -87,7 +87,7 @@ const Installation = () => { const nextPosition = document.getElementById('start-installation-progress'); nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start' }); } else { - const nextPosition = document.getElementById('save-installation-progress'); + const nextPosition = document.getElementById('start-installation-progress'); nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' }); } } else { @@ -261,12 +261,11 @@ const Installation = () => { const process = (event: any) => { - if(!(installationType === 'smpe')) { - setInitClicked(true); - updateProgress(false); - } + setInitClicked(true); + updateProgress(false); event.preventDefault(); dispatch(setLoading(true)); + setMvsDatasetInitProgress(datasetInstallationStatus) // FIXME: runtime dir is hardcoded, fix there and in InstallActions.ts - Unpax and Install functions Promise.all([ @@ -275,7 +274,6 @@ const Installation = () => { dispatch(setLoading(false)); setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(true); - setMvsDatasetInitProgress(datasetInstallationStatus) dispatch(setLoading(false)); /* change skipDownload ?? false --> true to skip upload/download steps for quicker development */ window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml).then((res: IResponse) => { // Some parts of Zen pass the response as a string directly into the object From a5fbd549b49d3e308cd979c7d1edacbbb22e4887 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 17:05:15 -0400 Subject: [PATCH 073/455] Auto scrolling is still somewhat wonky, should be improved Signed-off-by: Timothy Gerstel --- .../stages/installation/Installation.tsx | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index eb59370e..3b42cdd3 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -83,13 +83,8 @@ const Installation = () => { useEffect(() => { if(getProgress("datasetInstallationStatus")) { - if(installationType !== 'smpe') { - const nextPosition = document.getElementById('start-installation-progress'); - nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } else { - const nextPosition = document.getElementById('start-installation-progress'); - nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' }); - } + const nextPosition = document.getElementById('save-installation-progress'); + nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end', inline: 'nearest' }); } else { const nextPosition = document.getElementById('container-box-id'); nextPosition.scrollIntoView({behavior: 'smooth'}); @@ -375,12 +370,11 @@ const Installation = () => { - + } - - +
); From 79982f39822f01aaa7950fd72c0d54e538cc09c8 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 5 Jun 2024 19:37:46 -0400 Subject: [PATCH 074/455] Fix elemt id Signed-off-by: Timothy Gerstel --- .../components/stages/installation/Installation.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 3b42cdd3..1a9053b6 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -84,10 +84,10 @@ const Installation = () => { if(getProgress("datasetInstallationStatus")) { const nextPosition = document.getElementById('save-installation-progress'); - nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end', inline: 'nearest' }); + if(nextPosition) nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end', inline: 'nearest' }); } else { const nextPosition = document.getElementById('container-box-id'); - nextPosition.scrollIntoView({behavior: 'smooth'}); + if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); } window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { @@ -189,8 +189,8 @@ const Installation = () => { setShowProgress((initClicked || getProgress('datasetInstallationStatus'))); if(initClicked) { - const nextPosition = document.getElementById('installation-progress'); - nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end' }); + const nextPosition = document.getElementById('save-installation-progress'); + if(nextPosition) nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end' }); setStateUpdated(!stateUpdated); } }, [initClicked]); From 45bb78a4dd44e8bc706351bf48f450647dcb4ad2 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Wed, 5 Jun 2024 21:44:57 -0400 Subject: [PATCH 075/455] Added logging to file Signed-off-by: Leanid Astrakou --- README.md | 2 +- package-lock.json | 9 +++++++++ package.json | 1 + src/main/index.ts | 6 ++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e435baff..e3b5cdc8 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Node version 18.12 or higher is required. ### Developing -Note: `npm run start` may succeed without errors, but `npm run make` will not. It is always advised to run `npm run make` after writing new code, or using the build automation to view errors +Note: `npm run start` may succeed without errors, but `npm run make` may not. It is always advised to run `npm run make` after writing new code, or using the build automation to view errors Run `npm install` to install dependencies diff --git a/package-lock.json b/package-lock.json index 7a84d3e2..39cec205 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "@types/flat": "^5.0.2", "ajv": "^8.12.0", "ajv-formats": "^2.1.1", + "electron-log": "^5.1.5", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "flat": "^5.0.2", @@ -5248,6 +5249,14 @@ "node": ">=10" } }, + "node_modules/electron-log": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.1.5.tgz", + "integrity": "sha512-vuq10faUAxRbILgQx7yHoMObKZDEfj7hMSZrJPsVrDNeCpV/HN11dU7QuY4UDUe055pzBxhSCB3m0+6D3Aktjw==", + "engines": { + "node": ">= 14" + } + }, "node_modules/electron-packager": { "version": "17.1.2", "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.2.tgz", diff --git a/package.json b/package.json index abe2b24a..540464e5 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "@types/flat": "^5.0.2", "ajv": "^8.12.0", "ajv-formats": "^2.1.1", + "electron-log": "^5.1.5", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "flat": "^5.0.2", diff --git a/src/main/index.ts b/src/main/index.ts index 80164997..c5c56859 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -19,6 +19,7 @@ import { ProgressStore } from "../storage/ProgressStore"; import { checkDirExists } from '../services/ServiceUtils'; import { ConfigurationStore } from '../storage/ConfigurationStore'; import { EditorStore } from '../storage/EditorStore'; +import { log, warn, error, info } from 'electron-log/main'; declare const MAIN_WINDOW_WEBPACK_ENTRY: string; declare const MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY: string; @@ -26,6 +27,11 @@ declare const MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY: string; const connectionActions = new ConnectionActions(); const installActions = new InstallActions(); +console.log = log; +console.warn = warn; +console.error = error; +console.info = info; + // REVIEW: electron-squirrel-startup, review the necessity of it, package will have an operation viloation as it is 7 years old. // if (require('electron-squirrel-startup')) { // ? // app.quit(); From bc7120e986258e918154644f302e6aa3fb384e55 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 6 Jun 2024 16:05:26 +0530 Subject: [PATCH 076/455] Reverting the chages --- src/renderer/components/stages/installation/Installation.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index f946f6b7..ddb76dc6 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -247,7 +247,6 @@ const Installation = () => { const setDsInstallStageStatus = (status: boolean) => { dispatch(setNextStepEnabled(status)); - dispatch(setNextStepEnabled(true)); dispatch(setInitializationStatus(status)); dispatch(setDatasetInstallationStatus(status)); } @@ -337,7 +336,6 @@ const Installation = () => { // True - a proceed, False - blocked const installProceedActions = (status: boolean) => { dispatch(setNextStepEnabled(status)); - dispatch(setNextStepEnabled(true)); dispatch(setDatasetInstallationStatus(status)); dispatch(setInitializationStatus(status)); } From c3fe4c40230b9ddf232c549ffb1e30e3e01d2417 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 6 Jun 2024 18:29:18 +0530 Subject: [PATCH 077/455] Updating the form --- src/renderer/components/stages/Stcs.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 529fdcaa..6148b1dd 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -260,8 +260,6 @@ const Stcs = () => { '& .MuiInputBase-root': { height: '60px', minWidth: '72ch', fontFamily: 'monospace' }, }} label="Zowe" - multiline - maxRows={6} value={setupYaml?.zowe ?? DEFAULT_ZOWE} variant="filled" disabled @@ -271,8 +269,6 @@ const Stcs = () => { '& .MuiInputBase-root': { height: '60px', minWidth: '72ch', fontFamily: 'monospace' }, }} label="Zis" - multiline - maxRows={6} value={setupYaml?.zis ?? DEFAULT_ZIS} variant="filled" disabled @@ -282,8 +278,6 @@ const Stcs = () => { '& .MuiInputBase-root': { height: '60px', minWidth: '72ch', fontFamily: 'monospace' }, }} label="Aux" - multiline - maxRows={6} value={setupYaml?.aux ?? DEFAULT_AUX} variant="filled" disabled From 62aa81e1a527e4c9eec09d7bc11d3969642341a9 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 6 Jun 2024 20:22:28 +0530 Subject: [PATCH 078/455] added ds attr --- src/renderer/components/stages/Stcs.tsx | 35 ++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 6148b1dd..a8870222 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -48,6 +48,7 @@ const Stcs = () => { const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); const setupSchema = schema?.properties?.zowe?.properties?.setup?.properties?.security?.properties?.stcs; const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.security?.stcs); + const [setupDsYaml, setSetupDsYaml] = useState(yaml?.zowe?.setup?.dataset); const [showProgress, setShowProgress] = useState(getProgress('stcsStatus')); const [init, setInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); @@ -282,26 +283,36 @@ const Stcs = () => { variant="filled" disabled /> + + {!setupDsYaml?.proclib &&

The `dataset.proclib` is empty. Please ensure it contains the valid dataset name in the installation tab.

} + {!showProgress ? - + : null} - {!showProgress ? null : - - - - - - - } + {!showProgress ? null : + + + + + + + } + - - - +
); From a56465542aa9e1965cac57615a1f04ef3c8bd0e0 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 6 Jun 2024 20:27:20 +0530 Subject: [PATCH 079/455] Updating the valid channels for event listeners --- src/renderer/preload.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 2be92c15..d0c728d2 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -132,7 +132,7 @@ contextBridge.exposeInMainWorld('electron', { }, on(channel: string, func: any) { // REVIEW: Used to have channel validation with ipcRenderer.send, do we need something similar for ipcRenderer.invoke? - const validChannels = ['install-mvs', 'init-security', 'init-vsam', 'init-stcs']; + const validChannels = ['install-mvs', 'init-apf', 'init-certificates', 'init-security', 'init-vsam', 'init-stcs']; if (validChannels.includes(channel)) { ipcRenderer.on(channel, (event, ...args) => func(...args)); } From fadb12825db17bef28d38aa90ddeaefea5b02a0d Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 17:00:34 -0400 Subject: [PATCH 080/455] Use correct yaml path in init commands Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index f889e8c1..c47efa9b 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -309,7 +309,7 @@ class Installation { } ProgressStore.set('apfAuth.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init apfauth -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('apfAuth.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} @@ -335,7 +335,7 @@ class Installation { } ProgressStore.set('initSecurity.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init security -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('initSecurity.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} @@ -359,7 +359,7 @@ class Installation { } ProgressStore.set('certificate.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init certificate --update-config -c ${installationArgs.installationDir}/zowe.yaml`; + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init certificate --update-config -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) :installationArgs.installationDir}/zowe.yaml`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} @@ -389,7 +389,7 @@ class Installation { return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } ProgressStore.set('initVsam.uploadYaml', uploadYaml.status); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init vsam -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init vsam -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) :installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); let errorFound = false; From f7821c713bf6bb368837a97705d84dd17ed1d92a Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Thu, 6 Jun 2024 18:57:32 -0400 Subject: [PATCH 081/455] Changed package name Signed-off-by: Leanid Astrakou --- package-lock.json | 4 ++-- package.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39cec205..2ea13f29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "zowe-enterprise-necessity", + "name": "zowe-install-wizard", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "zowe-enterprise-necessity", + "name": "zowe-install-wizard", "version": "1.0.0", "license": "EPL 2.0", "dependencies": { diff --git a/package.json b/package.json index 540464e5..822ee0dd 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "zowe-enterprise-necessity", + "name": "zowe-install-wizard", "author": "Zowe", - "description": "Zowe Enterprise Necessity", - "productName": "zowe-enterprise-necessity", + "description": "Zowe Server Install Wizard", + "productName": "zowe-install-wizard", "version": "1.0.0", "main": ".webpack/main", "scripts": { From ce97ce277de238462b2a5600a0cad9d2f21be719 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 19:36:46 -0400 Subject: [PATCH 082/455] setConfigByKey -> setConfigByKeyAndValidate Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/LaunchConfig.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 88351356..cd043d3e 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -494,8 +494,8 @@ const LaunchConfig = () => { setStageConfig(false, errPath+' '+errMsg, newData); } else { const newYaml = {...yaml, zowe: {...yaml.zowe, configmgr: newData.configmgr, launchScript: newData.launchScript}}; - await window.electron.ipcRenderer.setConfigByKey("zowe.configmgr", newData.configmgr); - await window.electron.ipcRenderer.setConfigByKey("zowe.launchScript", newData.launchScript); + await window.electron.ipcRenderer.setConfigByKeyAndValidate("zowe.configmgr", newData.configmgr); + await window.electron.ipcRenderer.setConfigByKeyAndValidate("zowe.launchScript", newData.launchScript); dispatch(setYaml(newYaml)); setStageConfig(true, '', newData); } From 0c92d3c3f3ec081fa4798963384068ef29d95853 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 19:37:15 -0400 Subject: [PATCH 083/455] Fix apf auth progress Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/InitApfAuth.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index e141e19f..63596c0b 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -143,10 +143,13 @@ const InitApfAuth = () => { }, [apfAuthInitProgress]); useEffect(() => { - if(!getProgress('apfAuthStatus') && initClicked) { + if(showProgress) { timer = setInterval(() => { window.electron.ipcRenderer.getApfAuthProgress().then((res: any) => { setApfAuthorizationInitProgress(res); + if(res.success){ + clearInterval(timer); + } }) }, 3000); } From f73a549e716d931c73c268cdb6cca9b553c3bcb1 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 20:14:20 -0400 Subject: [PATCH 084/455] subStageProgress doesnt work for some reason Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Stepper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 983d702c..f6c23cac 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -168,7 +168,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages setActiveStep(newActiveStep); const newSubStep = isSubStep ? subStepIndex : 0; - if((subStepIndex > 0 && subStageProgressStatus[0] === true) || subStepIndex === 0){ //only allow substages after installation to be navigated to if init mvs has been completed + if((subStepIndex > 0 && completeProgress.datasetInstallationStatus === true) || subStepIndex === 0){ //only allow substages after installation to be navigated to if init mvs has been completed setActiveSubStep(newSubStep); } } From 6b267c7fa355d60246457d5c30c23715a1c0806e Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 20:18:10 -0400 Subject: [PATCH 085/455] Fix auto scrolling Signed-off-by: Timothy Gerstel --- .../components/stages/installation/Installation.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 1a9053b6..ff8920f9 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -84,7 +84,7 @@ const Installation = () => { if(getProgress("datasetInstallationStatus")) { const nextPosition = document.getElementById('save-installation-progress'); - if(nextPosition) nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end', inline: 'nearest' }); + if(nextPosition) nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start' }); } else { const nextPosition = document.getElementById('container-box-id'); if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); @@ -189,7 +189,7 @@ const Installation = () => { setShowProgress((initClicked || getProgress('datasetInstallationStatus'))); if(initClicked) { - const nextPosition = document.getElementById('save-installation-progress'); + const nextPosition = document.getElementById('installation-progress'); if(nextPosition) nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end' }); setStateUpdated(!stateUpdated); } @@ -210,6 +210,7 @@ const Installation = () => { window.electron.ipcRenderer.getInstallationProgress().then((res: any) => { setMvsDatasetInitializationProgress(res); dispatch(setDatasetInstallationStatus(stageComplete)) + eventDispatcher.emit('initMvsComplete', true); }) }, 3000); } @@ -374,7 +375,8 @@ const Installation = () => { } - + +
); From e6c3886ddb3ab5aeebbb9511143e5546cfb9deb9 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 20:19:12 -0400 Subject: [PATCH 086/455] Fix scrolling Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Security.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 443a5fef..c8e42eec 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -302,7 +302,7 @@ const Security = () => { } - +
From a4886a0b4e2acbd2d65be3c1300d3bcb5e85a71c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 20:23:49 -0400 Subject: [PATCH 087/455] Make scrolling better Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index cc0cd0e7..bf9358f8 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -300,7 +300,7 @@ const Certificates = () => { } - +
); From e9e86688de231199353e897aafdc9d13e5280232 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 20:26:14 -0400 Subject: [PATCH 088/455] Fix dom validation error Signed-off-by: Timothy Gerstel --- .../components/stages/installation/InstallTypeSelection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index e9c43bc8..d22219fa 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -111,7 +111,7 @@ const InstallationType = () => {
Zen will download the latest Zowe convenience build in PAX archive format from. - { !agreeLicense &&

Please accept the license agreement to continue.

} + { !agreeLicense && <>
Please accept the license agreement to continue.
} {'https://zowe.org'}
From 14eebf7c044dbee0f7b2921dbd176676ad80e7cf Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 20:29:59 -0400 Subject: [PATCH 089/455] Dont set null config Signed-off-by: Timothy Gerstel --- src/storage/ConfigurationStore.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/storage/ConfigurationStore.ts b/src/storage/ConfigurationStore.ts index 6e7eec3d..d3a7a8a5 100644 --- a/src/storage/ConfigurationStore.ts +++ b/src/storage/ConfigurationStore.ts @@ -31,6 +31,8 @@ export class ConfigurationStore extends DefaultStore { } public static setConfig(value: any) { + if(value === undefined || value === null || typeof value === "object") + return false return this.set(KEY_CONFIG, value); } From 1edfdcf454fb50428079fd705a3f538d4d2cf5a0 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 22:27:20 -0400 Subject: [PATCH 090/455] remove check preventing console warning Signed-off-by: Timothy Gerstel --- src/storage/ConfigurationStore.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/storage/ConfigurationStore.ts b/src/storage/ConfigurationStore.ts index d3a7a8a5..6e7eec3d 100644 --- a/src/storage/ConfigurationStore.ts +++ b/src/storage/ConfigurationStore.ts @@ -31,8 +31,6 @@ export class ConfigurationStore extends DefaultStore { } public static setConfig(value: any) { - if(value === undefined || value === null || typeof value === "object") - return false return this.set(KEY_CONFIG, value); } From 9658337ea257d3553afef103717093ef600a64e3 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 22:33:57 -0400 Subject: [PATCH 091/455] fix setYaml Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/connection/Connection.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 6a938d26..72d45517 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -43,8 +43,7 @@ const Connection = () => { const stageLabel = 'Connection'; const dispatch = useAppDispatch(); - // const zoweCLIVersion = useAppSelector(selectZoweCLIVersion); // Remove this feature for now. - const zoweCLIVersion = ''; + const zoweCLIVersion = useAppSelector(selectZoweCLIVersion); const [expanded, setExpanded] = React.useState('FTPConn'); const handleChange = (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => { @@ -152,7 +151,7 @@ const FTPConnectionForm = () => { const setYamlAndConfig = () => { window.electron.ipcRenderer.getConfig().then((res: IResponse) => { if (res && res.status && res.details) { - dispatch(setYaml(res.details.config)); + dispatch(setYaml(res.details)); const schema = res.details.schema; dispatch(setSchema(schema)); } else { From 7b3e5ac8b74e2d50701018a57616687fbcfe0022 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 6 Jun 2024 22:38:07 -0400 Subject: [PATCH 092/455] Dont set schema here Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/connection/Connection.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 72d45517..8c3a42c7 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -152,17 +152,11 @@ const FTPConnectionForm = () => { window.electron.ipcRenderer.getConfig().then((res: IResponse) => { if (res && res.status && res.details) { dispatch(setYaml(res.details)); - const schema = res.details.schema; - dispatch(setSchema(schema)); } else { dispatch(setYaml(FALLBACK_YAML)); - dispatch(setSchema(FALLBACK_SCHEMA)); window.electron.ipcRenderer.setConfig(FALLBACK_YAML).then((res: IResponse) => { // yaml response }); - window.electron.ipcRenderer.setSchema(FALLBACK_SCHEMA).then((res: IResponse) => { - // schema response - }); } const { activeStepIndex, isSubStep, activeSubStepIndex } = getActiveStage(); From d16dc60076e381dd3bfeed251444f01f3f12ca88 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 7 Jun 2024 12:25:53 +0530 Subject: [PATCH 093/455] Pass through --- src/renderer/components/stages/installation/Installation.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index ff14bcad..df4a6d38 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -244,6 +244,7 @@ const Installation = () => { const setDsInstallStageStatus = (status: boolean) => { dispatch(setNextStepEnabled(status)); + dispatch(setNextStepEnabled(true)); dispatch(setInitializationStatus(status)); dispatch(setDatasetInstallationStatus(status)); } @@ -333,6 +334,7 @@ const Installation = () => { // True - a proceed, False - blocked const installProceedActions = (status: boolean) => { dispatch(setNextStepEnabled(status)); + dispatch(setNextStepEnabled(true)); dispatch(setDatasetInstallationStatus(status)); dispatch(setInitializationStatus(status)); } From b660058fc77ff98bcdb91d90c0bd0f67ace40a11 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 7 Jun 2024 14:09:33 +0530 Subject: [PATCH 094/455] Regression fixing --- src/renderer/components/common/Stepper.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index f8de43ef..dbca25e1 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -316,8 +316,8 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages } {stages[activeStep] && stages[activeStep].isSkippable && - } {stages[activeStep] && stages[activeStep].isSkippable && -
diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index bbbf6fd3..a94b45be 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -22,6 +22,8 @@ import { selectInitializationStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; +import { selectConnectionArgs } from "./connection/connectionSlice"; +import { getInstallationArguments } from "./progress/StageProgressStatus"; function PatternPropertiesForm(props: any){ const [elements, setElements] = useState([]); @@ -633,6 +635,8 @@ const Networking = () => { const [isFormValid, setIsFormValid] = useState(false); const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); + const [installationArgs, setInstArgs] = useState(getInstallationArguments()); + const connectionArgs = useAppSelector(selectConnectionArgs); @@ -774,6 +778,10 @@ const Networking = () => { }} /> +
diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 1f378e82..b68a326d 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -10,6 +10,7 @@ import { contextBridge, ipcRenderer } from 'electron'; import { IIpcConnectionArgs } from '../types/interfaces'; +import { InstallationArgs } from '../types/stateInterfaces'; contextBridge.exposeInMainWorld('electron', { ipcRenderer: { @@ -28,6 +29,9 @@ contextBridge.exposeInMainWorld('electron', { getConfig() { return ipcRenderer.invoke("get-config"); }, + uploadLatestYaml(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + return ipcRenderer.invoke("upload-latest-yaml", connectionArgs, installationArgs); + }, getConfigByKey(key: string, value: any) { return ipcRenderer.invoke("get-config-by-key", key); }, From dc4e101bc7f7af109bab6802b5c6f4af47309c06 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 10 Jun 2024 18:20:36 -0400 Subject: [PATCH 105/455] Updating editor no longer crashes Zen. Updating components now updates UI properly Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Networking.tsx | 1031 +++++++++-------- 1 file changed, 525 insertions(+), 506 deletions(-) diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index a94b45be..98a83b0a 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -25,10 +25,520 @@ import { IResponse } from "../../../types/interfaces"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { getInstallationArguments } from "./progress/StageProgressStatus"; +// const schema = useAppSelector(selectSchema); +const schema = { + "$id": "https://zowe.org/schemas/v2/server-base", + "title": "Zowe configuration file", + "description": "Configuration file for Zowe (zowe.org) version 2.", + "type": "object", + "additionalProperties": true, + "properties": { + "zowe": { + "type": "object", + "additionalProperties": true, + "properties": { + "externalDomains": { + "type": "array", + "description": "List of domain names of how you access Zowe from your local computer.", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": ["string"] + } + }, + "externalPort": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Port number of how you access Zowe APIML Gateway from your local computer." + } + } + }, + "components": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether to enable or disable this component", + "default": false + }, + "port": { + "type": "integer", + "description": "Optional, port number for component if applicable.", + }, + "debug": { + "type": "boolean", + "description": "Whether to enable or disable debug tracing for this component", + "default": false + }, + "certificate": { + "$ref": "#/$defs/certificate", + "description": "Certificate for current component." + }, + "launcher": { + "type": "object", + "description": "Set behavior of how the Zowe launcher will handle this particular component", + "additionalProperties": true, + "properties": { + "restartIntervals": { + "type": "array", + "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", + "items": { + "type": "integer" + } + }, + "minUptime": { + "type": "integer", + "default": 90, + "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." + }, + "shareAs": { + "type": "string", + "description": "Determines which SHAREAS mode should be used when starting a component", + "enum": ["no", "yes", "must", ""], + "default": "yes" + } + } + }, + "zowe": { + "type": "object", + "description": "Component level overrides for top level Zowe network configuration.", + "additionalProperties": false, + "properties": { + "network": { + "$ref": "#/$defs/networkSettings" + }, + "job": { + "$ref": "#/$defs/componentJobSettings" + } + } + } + } + } + } + }, + "haInstances": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "description": "Configuration of Zowe high availability instance.", + "required": ["hostname", "sysname"], + "properties": { + "hostname": { + "type": "string", + "description": "Host name of the Zowe high availability instance. This is hostname for internal communications." + }, + "sysname": { + "type": "string", + "description": "z/OS system name of the Zowe high availability instance. Some JES command will be routed to this system name." + }, + "components": { + "type": "object", + "patternProperties": { + "^.*$": { + "$ref": "#/$defs/component" + } + } + } + } + } + } + } + }, + "$defs": { + "port": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "scheme": { + "type": "string", + "enum": [ + "http", + "https" + ], + "default": "https" + }, + "certificate": { + "oneOf": [ + { "$ref": "#/$defs/pkcs12-certificate" }, + { "$ref": "#/$defs/keyring-certificate" } + ] + }, + "pkcs12-certificate": { + "type": "object", + "additionalProperties": false, + "required": ["keystore", "truststore", "pem"], + "properties": { + "keystore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate keystore.", + "required": ["type", "file", "alias"], + "properties": { + "type": { + "type": "string", + "description": "Keystore type.", + "const": "PKCS12" + }, + "file": { + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Path to your PKCS#12 keystore." + }, + "password": { + "type": "string", + "description": "Password of your PKCS#12 keystore." + }, + "alias": { + "type": "string", + "description": "Certificate alias name of defined in your PKCS#12 keystore" + } + } + }, + "truststore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate truststore.", + "required": ["type", "file"], + "properties": { + "type": { + "type": "string", + "description": "Truststore type.", + "const": "PKCS12" + }, + "file": { + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Path to your PKCS#12 keystore." + }, + "password": { + "type": "string", + "description": "Password of your PKCS#12 keystore." + } + } + }, + "pem": { + "type": "object", + "additionalProperties": false, + "description": "Certificate in PEM format.", + "required": ["key", "certificate"], + "properties": { + "key": { + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Path to the certificate private key stored in PEM format." + }, + "certificate": { + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Path to the certificate stored in PEM format." + }, + "certificateAuthorities": { + "description": "List of paths to the certificate authorities stored in PEM format.", + "oneOf": [{ + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." + }, + { + "type": "array", + "description": "Path to the certificate authority stored in PEM format.", + "items": { + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + } + } + ] + } + } + } + } + }, + "keyring-certificate": { + "type": "object", + "additionalProperties": false, + "required": ["keystore", "truststore"], + "properties": { + "keystore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate keystore.", + "required": ["type", "file", "alias"], + "properties": { + "type": { + "type": "string", + "description": "Keystore type.", + "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] + }, + "file": { + "type": "string", + "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", + "pattern": "^safkeyring:\/\/.*" + }, + "password": { + "type": "string", + "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", + "enum": ["", "password"] + }, + "alias": { + "type": "string", + "description": "Certificate label of z/OS keyring. Case sensitivity and spaces matter." + } + } + }, + "truststore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate truststore.", + "required": ["type", "file"], + "properties": { + "type": { + "type": "string", + "description": "Truststore type.", + "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] + }, + "file": { + "type": "string", + "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", + "pattern": "^safkeyring:\/\/.*" + }, + "password": { + "type": "string", + "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", + "enum": ["", "password"] + } + } + }, + "pem": { + "type": "object", + "additionalProperties": false, + "description": "Certificate in PEM format.", + "properties": { + "key": { + "type": "string", + "description": "Path to the certificate private key stored in PEM format." + }, + "certificate": { + "type": "string", + "description": "Path to the certificate stored in PEM format." + }, + "certificateAuthorities": { + "description": "List of paths to the certificate authorities stored in PEM format.", + "oneOf": [{ + "type": "string", + "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." + }, + { + "type": "array", + "description": "Path to the certificate authority stored in PEM format.", + "items": { + "type": "string" + } + } + ] + } + } + } + } + }, + "component": { + "$anchor": "zoweComponent", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether to enable or disable this component", + "default": false + }, + "certificate": { + "$ref": "#/$defs/certificate", + "description": "Certificate for current component." + }, + "launcher": { + "type": "object", + "description": "Set behavior of how the Zowe launcher will handle this particular component", + "additionalProperties": true, + "properties": { + "restartIntervals": { + "type": "array", + "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", + "items": { + "type": "integer" + } + }, + "minUptime": { + "type": "integer", + "default": 90, + "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." + }, + "shareAs": { + "type": "string", + "description": "Determines which SHAREAS mode should be used when starting a component", + "enum": ["no", "yes", "must", ""], + "default": "yes" + } + } + }, + "zowe": { + "type": "object", + "description": "Component level overrides for top level Zowe network configuration.", + "additionalProperties": false, + "properties": { + "network": { + "$ref": "#/$defs/networkSettings" + }, + "job": { + "$ref": "#/$defs/componentJobSettings" + } + } + } + } + }, + "componentJobSettings": { + "$anchor": "componentJobSettings", + "type": "object", + "description": "Component level overrides for job execution behavior", + "properties": { + "suffix": { + "type": "string", + "description": "Can be used by components to declare a jobname suffix to append to their job. This is not currently used by Zowe itself, it is up to components to use this value if desired. Zowe may use this value in the future." + } + } + }, + "tlsSettings": { + "$anchor": "tlsSettings", + "type": "object", + "properties": { + "ciphers": { + "type": "array", + "description": "Acceptable TLS cipher suites for network connections, in IANA format.", + "items": { + "type": "string" + } + }, + "curves": { + "type": "array", + "description": "Acceptable key exchange elliptic curves for network connections.", + "items": { + "type": "string" + } + }, + "maxTls": { + "type": "string", + "enum": ["TLSv1.2", "TLSv1.3"], + "default": "TLSv1.3", + "description": "Maximum TLS version allowed for network connections." + }, + "minTls": { + "type": "string", + "enum": ["TLSv1.2", "TLSv1.3"], + "default": "TLSv1.2", + "description": "Minimum TLS version allowed for network connections, and less than or equal to network.maxTls." + } + } + }, + "networkSettings": { + "type": "object", + "$anchor": "networkSettings", + "additionalProperties": false, + "description": "Optional, advanced network configuration parameters", + "properties": { + "server": { + "type": "object", + "additionalProperties": false, + "description": "Optional, advanced network configuration parameters for Zowe servers", + "properties": { + "tls": { + "$ref": "#/$defs/tlsSettings" + }, + "listenAddresses": { + "type": "array", + "description": "The IP addresses which all of the Zowe servers will be binding on and listening to. Some servers may only support listening on the first element.", + "items": { + "type": "string", + "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" + } + }, + "vipaIp": { + "type": "string", + "description": "The IP address which all of the Zowe servers will be binding to. If you are using multiple DIPVA addresses, do not use this option." + }, + "validatePortFree": { + "type": "boolean", + "default": true, + "description": "Whether or not to ensure that the port a server is about to use is available. Usually, servers will know this when they attempt to bind to a port, so this option allows you to disable the additional verification step." + } + } + }, + "client": { + "type": "object", + "additionalProperties": false, + "description": "Optional, advanced network configuration parameters for Zowe servers when sending requests as clients.", + "properties": { + "tls": { + "$ref": "#/$defs/tlsSettings" + } + } + } + } + }, + "registryHandler": { + "$anchor": "registryHandler", + "type": "object", + "required": ["registry", "path"], + "properties": { + "registry": { + "type": "string", + "description": "The location of the default registry for this handler. It could be a URL, path, dataset, whatever this handler supports" + }, + "path": { + "$ref": "/schemas/v2/server-common#zowePath", + "description": "Unix file path to the configmgr-compatible JS file which implements the handler API" + } + } + } + } +} + function PatternPropertiesForm(props: any){ const [elements, setElements] = useState([]); const [yaml, setLYaml] = useState(props.yaml); const dispatch = useAppDispatch(); + + useEffect(() => { + const ajv = new Ajv(); + ajv.addKeyword("$anchor"); + let validate: any; + + if(schema) { + validate = ajv.compile(schema); + } + if(props.yaml && validate) { + validate(props.yaml); + if(!validate.errors) { + setLYaml(props.yaml); + } else { + // console.log("validate errors:", JSON.stringify(validate.errors)); + } + } + }, [props]); useEffect(() => { if(yaml){ @@ -138,497 +648,6 @@ const Networking = () => { const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; const dispatch = useAppDispatch(); -// const schema = useAppSelector(selectSchema); - const schema = { - "$id": "https://zowe.org/schemas/v2/server-base", - "title": "Zowe configuration file", - "description": "Configuration file for Zowe (zowe.org) version 2.", - "type": "object", - "additionalProperties": true, - "properties": { - "zowe": { - "type": "object", - "additionalProperties": true, - "properties": { - "externalDomains": { - "type": "array", - "description": "List of domain names of how you access Zowe from your local computer.", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": ["string"] - } - }, - "externalPort": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "description": "Port number of how you access Zowe APIML Gateway from your local computer." - } - } - }, - "components": { - "type": "object", - "patternProperties": { - "^.*$": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether to enable or disable this component", - "default": false - }, - "port": { - "type": "integer", - "description": "Optional, port number for component if applicable.", - }, - "debug": { - "type": "boolean", - "description": "Whether to enable or disable debug tracing for this component", - "default": false - }, - "certificate": { - "$ref": "#/$defs/certificate", - "description": "Certificate for current component." - }, - "launcher": { - "type": "object", - "description": "Set behavior of how the Zowe launcher will handle this particular component", - "additionalProperties": true, - "properties": { - "restartIntervals": { - "type": "array", - "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", - "items": { - "type": "integer" - } - }, - "minUptime": { - "type": "integer", - "default": 90, - "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." - }, - "shareAs": { - "type": "string", - "description": "Determines which SHAREAS mode should be used when starting a component", - "enum": ["no", "yes", "must", ""], - "default": "yes" - } - } - }, - "zowe": { - "type": "object", - "description": "Component level overrides for top level Zowe network configuration.", - "additionalProperties": false, - "properties": { - "network": { - "$ref": "#/$defs/networkSettings" - }, - "job": { - "$ref": "#/$defs/componentJobSettings" - } - } - } - } - } - } - }, - "haInstances": { - "type": "object", - "patternProperties": { - "^.*$": { - "type": "object", - "description": "Configuration of Zowe high availability instance.", - "required": ["hostname", "sysname"], - "properties": { - "hostname": { - "type": "string", - "description": "Host name of the Zowe high availability instance. This is hostname for internal communications." - }, - "sysname": { - "type": "string", - "description": "z/OS system name of the Zowe high availability instance. Some JES command will be routed to this system name." - }, - "components": { - "type": "object", - "patternProperties": { - "^.*$": { - "$ref": "#/$defs/component" - } - } - } - } - } - } - } - }, - "$defs": { - "port": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "scheme": { - "type": "string", - "enum": [ - "http", - "https" - ], - "default": "https" - }, - "certificate": { - "oneOf": [ - { "$ref": "#/$defs/pkcs12-certificate" }, - { "$ref": "#/$defs/keyring-certificate" } - ] - }, - "pkcs12-certificate": { - "type": "object", - "additionalProperties": false, - "required": ["keystore", "truststore", "pem"], - "properties": { - "keystore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate keystore.", - "required": ["type", "file", "alias"], - "properties": { - "type": { - "type": "string", - "description": "Keystore type.", - "const": "PKCS12" - }, - "file": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - "description": "Path to your PKCS#12 keystore." - }, - "password": { - "type": "string", - "description": "Password of your PKCS#12 keystore." - }, - "alias": { - "type": "string", - "description": "Certificate alias name of defined in your PKCS#12 keystore" - } - } - }, - "truststore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate truststore.", - "required": ["type", "file"], - "properties": { - "type": { - "type": "string", - "description": "Truststore type.", - "const": "PKCS12" - }, - "file": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - "description": "Path to your PKCS#12 keystore." - }, - "password": { - "type": "string", - "description": "Password of your PKCS#12 keystore." - } - } - }, - "pem": { - "type": "object", - "additionalProperties": false, - "description": "Certificate in PEM format.", - "required": ["key", "certificate"], - "properties": { - "key": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - "description": "Path to the certificate private key stored in PEM format." - }, - "certificate": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - "description": "Path to the certificate stored in PEM format." - }, - "certificateAuthorities": { - "description": "List of paths to the certificate authorities stored in PEM format.", - "oneOf": [{ - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." - }, - { - "type": "array", - "description": "Path to the certificate authority stored in PEM format.", - "items": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - } - } - ] - } - } - } - } - }, - "keyring-certificate": { - "type": "object", - "additionalProperties": false, - "required": ["keystore", "truststore"], - "properties": { - "keystore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate keystore.", - "required": ["type", "file", "alias"], - "properties": { - "type": { - "type": "string", - "description": "Keystore type.", - "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] - }, - "file": { - "type": "string", - "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", - "pattern": "^safkeyring:\/\/.*" - }, - "password": { - "type": "string", - "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", - "enum": ["", "password"] - }, - "alias": { - "type": "string", - "description": "Certificate label of z/OS keyring. Case sensitivity and spaces matter." - } - } - }, - "truststore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate truststore.", - "required": ["type", "file"], - "properties": { - "type": { - "type": "string", - "description": "Truststore type.", - "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] - }, - "file": { - "type": "string", - "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", - "pattern": "^safkeyring:\/\/.*" - }, - "password": { - "type": "string", - "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", - "enum": ["", "password"] - } - } - }, - "pem": { - "type": "object", - "additionalProperties": false, - "description": "Certificate in PEM format.", - "properties": { - "key": { - "type": "string", - "description": "Path to the certificate private key stored in PEM format." - }, - "certificate": { - "type": "string", - "description": "Path to the certificate stored in PEM format." - }, - "certificateAuthorities": { - "description": "List of paths to the certificate authorities stored in PEM format.", - "oneOf": [{ - "type": "string", - "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." - }, - { - "type": "array", - "description": "Path to the certificate authority stored in PEM format.", - "items": { - "type": "string" - } - } - ] - } - } - } - } - }, - "component": { - "$anchor": "zoweComponent", - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether to enable or disable this component", - "default": false - }, - "certificate": { - "$ref": "#/$defs/certificate", - "description": "Certificate for current component." - }, - "launcher": { - "type": "object", - "description": "Set behavior of how the Zowe launcher will handle this particular component", - "additionalProperties": true, - "properties": { - "restartIntervals": { - "type": "array", - "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", - "items": { - "type": "integer" - } - }, - "minUptime": { - "type": "integer", - "default": 90, - "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." - }, - "shareAs": { - "type": "string", - "description": "Determines which SHAREAS mode should be used when starting a component", - "enum": ["no", "yes", "must", ""], - "default": "yes" - } - } - }, - "zowe": { - "type": "object", - "description": "Component level overrides for top level Zowe network configuration.", - "additionalProperties": false, - "properties": { - "network": { - "$ref": "#/$defs/networkSettings" - }, - "job": { - "$ref": "#/$defs/componentJobSettings" - } - } - } - } - }, - "componentJobSettings": { - "$anchor": "componentJobSettings", - "type": "object", - "description": "Component level overrides for job execution behavior", - "properties": { - "suffix": { - "type": "string", - "description": "Can be used by components to declare a jobname suffix to append to their job. This is not currently used by Zowe itself, it is up to components to use this value if desired. Zowe may use this value in the future." - } - } - }, - "tlsSettings": { - "$anchor": "tlsSettings", - "type": "object", - "properties": { - "ciphers": { - "type": "array", - "description": "Acceptable TLS cipher suites for network connections, in IANA format.", - "items": { - "type": "string" - } - }, - "curves": { - "type": "array", - "description": "Acceptable key exchange elliptic curves for network connections.", - "items": { - "type": "string" - } - }, - "maxTls": { - "type": "string", - "enum": ["TLSv1.2", "TLSv1.3"], - "default": "TLSv1.3", - "description": "Maximum TLS version allowed for network connections." - }, - "minTls": { - "type": "string", - "enum": ["TLSv1.2", "TLSv1.3"], - "default": "TLSv1.2", - "description": "Minimum TLS version allowed for network connections, and less than or equal to network.maxTls." - } - } - }, - "networkSettings": { - "type": "object", - "$anchor": "networkSettings", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters", - "properties": { - "server": { - "type": "object", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters for Zowe servers", - "properties": { - "tls": { - "$ref": "#/$defs/tlsSettings" - }, - "listenAddresses": { - "type": "array", - "description": "The IP addresses which all of the Zowe servers will be binding on and listening to. Some servers may only support listening on the first element.", - "items": { - "type": "string", - "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" - } - }, - "vipaIp": { - "type": "string", - "description": "The IP address which all of the Zowe servers will be binding to. If you are using multiple DIPVA addresses, do not use this option." - }, - "validatePortFree": { - "type": "boolean", - "default": true, - "description": "Whether or not to ensure that the port a server is about to use is available. Usually, servers will know this when they attempt to bind to a port, so this option allows you to disable the additional verification step." - } - } - }, - "client": { - "type": "object", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters for Zowe servers when sending requests as clients.", - "properties": { - "tls": { - "$ref": "#/$defs/tlsSettings" - } - } - } - } - }, - "registryHandler": { - "$anchor": "registryHandler", - "type": "object", - "required": ["registry", "path"], - "properties": { - "registry": { - "type": "string", - "description": "The location of the default registry for this handler. It could be a URL, path, dataset, whatever this handler supports" - }, - "path": { - "$ref": "/schemas/v2/server-common#zowePath", - "description": "Unix file path to the configmgr-compatible JS file which implements the handler API" - } - } - } - } - } const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); const [isFormInit, setIsFormInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); @@ -696,24 +715,24 @@ const Networking = () => { }; const handleFormChange = async (data: any, isYamlUpdated?: boolean) => { + if(validate) { + validate(data); + if(validate.errors) { + const errPath = validate.errors[0].schemaPath; + const errMsg = validate.errors[0].message; + setStageConfig(false, errPath+' '+errMsg, data.zowe); - if (data.zowe.externalDomains || data.zowe.externalPort || data.components) { - - if(validate) { - validate(data); - if(validate.errors) { - const errPath = validate.errors[0].schemaPath; - const errMsg = validate.errors[0].message; - setStageConfig(false, errPath+' '+errMsg, data.zowe); - - } else { - const newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: data.zowe.externalDomains, externalPort: data.zowe.externalPort}, components: data.components}; - // console.log("new yaml", JSON.stringify(newYaml)); - window.electron.ipcRenderer.setConfig(newYaml) - setStageConfig(true, '', newYaml); - } } } + let newYaml; + if ((data.zowe && (data.zowe.externalDomains || data.zowe.externalPort))) { + newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: data.zowe.externalDomains, externalPort: data.zowe.externalPort}}; + } + if(data.components){ + newYaml = {...newYaml, components: data.components}; + } + window.electron.ipcRenderer.setConfig(newYaml) + setStageConfig(true, '', newYaml); }; const setStageConfig = (isValid: boolean, errorMsg: string, data: any) => { From 7610db6b83c895a5998c7f16261d24ec8c54b582 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 10 Jun 2024 22:00:04 -0400 Subject: [PATCH 106/455] More robust conditional Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Networking.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 98a83b0a..6d48e427 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -725,7 +725,7 @@ const Networking = () => { } } let newYaml; - if ((data.zowe && (data.zowe.externalDomains || data.zowe.externalPort))) { + if (data.zowe && data.zowe.externalDomains && data.zowe.externalPort) { newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: data.zowe.externalDomains, externalPort: data.zowe.externalPort}}; } if(data.components){ From cad0e74f4174bd2477928814e29026a865dd850c Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Mon, 10 Jun 2024 22:25:02 -0400 Subject: [PATCH 107/455] Create recursive dirs Signed-off-by: Leanid Astrakou --- src/services/ServiceUtils.ts | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index d979e441..49d8d371 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -19,6 +19,12 @@ export const JCL_UNIX_SCRIPT_CHARS = 70; export const JCL_JOBNAME_DEFAULT = "ZENJOB"; +export const MKDIR_ERROR_PARENT = "EDC5129I"; // when MKDIR tries to create top-level dir in a dir that doesn't exist + +export const MKDIR_ERROR_EXISTS = "EDC5117I"; // when dir already exist + +export const LIST_ERROR_NOTFOUND = "FSUM6785"; // when dir doesn't exist + export async function connectFTPServer(config: IIpcConnectionArgs): Promise { const client = new zos(); @@ -36,7 +42,9 @@ export async function checkDirExists(config: IIpcConnectionArgs, dir: string): P const list = await client.listDataset(dir); return !!list; } catch (error) { - console.warn(error); + if (error.toString().includes(LIST_ERROR_NOTFOUND) == false) { // List cmd returns an error for not found, so hide that one + console.warn(error); + } return false; } finally { client.close(); @@ -49,12 +57,32 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< await client.makeDirectory(dir); return true; } catch (error) { + if (error.toString().includes(MKDIR_ERROR_PARENT)) { + let parentDir = reducePath(dir); + if (parentDir !== "/") { + console.info("Wasn't able to create: " + dir + " . Will attempt to create: " + parentDir); + await makeDir(config, parentDir); + return makeDir(config, dir); + } + } + if (error.toString().includes(MKDIR_ERROR_EXISTS)) { + return true; + } + console.warn(error); return false; } finally { client.close(); } } +// /u/tsxxx/blaa --> /u/tsxxx +export function reducePath(path: string): string { + if (path.lastIndexOf('/') > 0) { + path = path.slice(0, path.lastIndexOf('/')); + } + return path; // stops at "/" +} + // This adds a "\n" inside Unix commands separated by ";" if char limit reached export function parseUnixScriptByNumOfChars(script: string, charCount: number = JCL_UNIX_SCRIPT_CHARS): string { const parts: string[] = []; From 8f01cc6b0bb7e5b930ddc15e892b610350b167cc Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 11 Jun 2024 09:15:57 -0400 Subject: [PATCH 108/455] Update stage status when uploading yaml Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/LaunchConfig.tsx | 10 ++++++++-- src/renderer/components/stages/Networking.tsx | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index fe94f34c..af880be8 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -19,7 +19,7 @@ import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; -import { selectInitializationStatus } from "./progress/progressSlice"; +import { selectInitializationStatus, setLaunchConfigStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_YAML } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; @@ -527,7 +527,13 @@ const LaunchConfig = () => {
diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 6d48e427..836e72cc 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -18,7 +18,7 @@ import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; -import { selectInitializationStatus } from "./progress/progressSlice"; +import { selectInitializationStatus, setNetworkingStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; @@ -799,7 +799,13 @@ const Networking = () => { From df554af515fe8c1b0894077ae18baf3822f78fd9 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 11 Jun 2024 20:37:35 +0530 Subject: [PATCH 109/455] Persisting the status for the networking and the launch config stage --- .../components/stages/LaunchConfig.tsx | 23 ++++++++++++------- src/renderer/components/stages/Networking.tsx | 23 ++++++++++++------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index fe94f34c..4b4b760a 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -19,11 +19,11 @@ import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; -import { selectInitializationStatus } from "./progress/progressSlice"; +import { selectInitializationStatus, setLaunchConfigStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_YAML } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; -import { getInstallationArguments } from "./progress/StageProgressStatus"; +import { getInstallationArguments, getProgress } from "./progress/StageProgressStatus"; import { selectConnectionArgs } from "./connection/connectionSlice"; const LaunchConfig = () => { @@ -469,7 +469,7 @@ const LaunchConfig = () => { const nextPosition = document.getElementById('container-box-id'); nextPosition.scrollIntoView({behavior: 'smooth'}); - dispatch(setNextStepEnabled(true)); + dispatch(setNextStepEnabled(getProgress('launchConfigStatus'))); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = false; stages[STAGE_ID].isSkipped = isInitializationSkipped; setIsFormInit(true); @@ -511,7 +511,17 @@ const LaunchConfig = () => { setIsFormValid(isValid); setFormError(errorMsg); setSetupYaml(data); - } + } + + const onSaveYaml = (e: any) => { + e.preventDefault(); + window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { + if(res && res.status) { + dispatch(setNextStepEnabled(true)); + dispatch(setLaunchConfigStatus(true)); + } + }); + } return (
@@ -525,10 +535,7 @@ const LaunchConfig = () => { {!isFormValid &&
{formError}
} - +
diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index a94b45be..09b7aa6b 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -18,12 +18,12 @@ import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; -import { selectInitializationStatus } from "./progress/progressSlice"; +import { selectInitializationStatus, setNetworkingStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; import { selectConnectionArgs } from "./connection/connectionSlice"; -import { getInstallationArguments } from "./progress/StageProgressStatus"; +import { getInstallationArguments, getProgress } from "./progress/StageProgressStatus"; function PatternPropertiesForm(props: any){ const [elements, setElements] = useState([]); @@ -680,7 +680,7 @@ const Networking = () => { const nextPosition = document.getElementById('container-box-id'); if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); - dispatch(setNextStepEnabled(true)); + dispatch(setNextStepEnabled(getProgress('networkingStatus'))); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = false; stages[STAGE_ID].isSkipped = isInitializationSkipped; setIsFormInit(true); @@ -720,7 +720,17 @@ const Networking = () => { setIsFormValid(isValid); setFormError(errorMsg); setLYaml(data); - } + } + + const onSaveYaml = (e: any) => { + e.preventDefault(); + window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { + if(res && res.status) { + dispatch(setNextStepEnabled(true)); + dispatch(setNetworkingStatus(true)); + } + }); + } return ( yaml && schema &&
@@ -778,10 +788,7 @@ const Networking = () => { }} /> - +
From 9e27e48de838eec247731a8359a50e3c6376e722 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 11 Jun 2024 21:11:26 +0530 Subject: [PATCH 110/455] Skip button handling --- src/renderer/components/common/Stepper.tsx | 24 +++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index d3402ccd..2840e679 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -216,6 +216,28 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const isNextStepEnabled = useAppSelector(selectNextStepEnabled); + const skipButtonDisabled = (stages: any, activeStep: number, activeSubStep: number) => { + if(stages[activeStep]) { + if(stages[activeStep].isSkippable && !stages[activeStep].subStages) { + if(getProgress(stages[activeStep].statusKey)) { + return true; + } else { + return false; + } + } else if(stages[activeStep].subStages) { + if(stages[activeStep].subStages[activeSubStep].label === ("Installation")) { + return true; + } else if(getProgress(stages[activeStep].subStages[activeSubStep].statusKey)) { + return true; + } else { + return false; + } + } + } else { + return true; + } + } + return ( @@ -311,7 +333,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages } {stages[activeStep] && stages[activeStep].isSkippable && + } diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index ee35ba7c..81053532 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -26,20 +26,18 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; -import { FALLBACK_SCHEMA, FALLBACK_YAML } from "../common/Constants"; +import { FALLBACK_SCHEMA, FALLBACK_YAML, INIT_STAGE_LABEL, ajv } from "../common/Constants"; const Stcs = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - - const stageLabel = 'Initialization'; const subStageLabel = 'Stcs'; - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); + const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); + const [SUB_STAGE_ID] = useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0); - const theme = createTheme(); + const [theme] = useState(createTheme()); const dispatch = useAppDispatch(); const [schema, setLocalSchema] = useState(useAppSelector(selectSchema)); @@ -56,52 +54,19 @@ const Stcs = () => { const [stateUpdated, setStateUpdated] = useState(false); const [initClicked, setInitClicked] = useState(false); - const installationArgs = getInstallationArguments(); - const connectionArgs = useAppSelector(selectConnectionArgs); + const [installationArgs] = useState(getInstallationArguments()); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); let timer: any; - const DEFAULT_ZOWE = 'ZWESLSTC'; - const DEFAULT_ZIS = 'ZWESISTC'; - const DEFAULT_AUX = 'ZWESASTC'; - - const defaultErrorMessage = "Please ensure that the values for security.stcs attributes and dataset.proclib are accurate."; - - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let stcsSchema; - let validate: any; - if(schema) { - stcsSchema = schema?.properties?.zowe?.properties?.setup?.properties?.security?.properties?.stcs; - } - - if(stcsSchema) { - validate = ajv.compile(stcsSchema); - } + const [DEFAULT_ZOWE] = useState('ZWESLSTC'); + const [DEFAULT_ZIS] = useState('ZWESISTC'); + const [DEFAULT_AUX] = useState('ZWESASTC'); - useEffect(() => { + const [defaultErrorMessage] = useState("Please ensure that the values for security.stcs attributes and dataset.proclib are accurate."); - if(!yaml){ - window.electron.ipcRenderer.getConfig().then((res: IResponse) => { - if (res.status) { - dispatch(setYaml(res.details)); - setLYaml(res.details); - } else { - dispatch(setYaml(FALLBACK_YAML)); - setLYaml(FALLBACK_YAML); - } - }) - } + const [stcsSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.security?.properties?.stcs); + const [validate] = useState(() => ajv.compile(stcsSchema)) - if(!schema){ - window.electron.ipcRenderer.getSchema().then((res: IResponse) => { - if (res.status) { - dispatch(setSchema(res.details)); - setLocalSchema(res.details); - } else { - dispatch(setSchema(FALLBACK_SCHEMA)); - setLocalSchema(FALLBACK_SCHEMA); - } - }) - } + useEffect(() => { setShowProgress(initClicked || getProgress('stcsStatus')); let nextPosition; diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 053f157c..297335fe 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -16,7 +16,6 @@ import { setInitializationStatus, setVsamStatus } from './progress/progressSlice import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { IResponse } from "../../../types/interfaces"; import ProgressCard from "../common/ProgressCard"; @@ -25,27 +24,27 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { setProgress, getProgress, setVsamInitState, mapAndSetSkipStatus, getInstallationArguments, getVsamInitState } from "./progress/StageProgressStatus"; +import { getProgress, setVsamInitState, mapAndSetSkipStatus, getInstallationArguments, getVsamInitState } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; +import { INIT_STAGE_LABEL, ajv } from "../common/Constants"; const Vsam = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - const stageLabel = 'Initialization'; const subStageLabel = 'Vsam'; - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); + const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); + const [SUB_STAGE_ID] = useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0); - const theme = createTheme(); + const [theme] = useState(createTheme()); const dispatch = useAppDispatch(); - const schema = useAppSelector(selectSchema); + const [schema] = useState(useAppSelector(selectSchema)); const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const setupSchema = schema?.properties?.zowe?.properties?.setup?.properties?.vsam; + const [setupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.vsam); const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.vsam); const [showProgress, setShowProgress] = useState(getProgress('vsamStatus')); const [init, setInit] = useState(false); @@ -56,30 +55,15 @@ const Vsam = () => { const [vsamInitProgress, setVsamInitProgress] = useState(getVsamInitState()); const [stateUpdated, setStateUpdated] = useState(false); const [initClicked, setInitClicked] = useState(false); - const [reinit, setReinit] = useState(false); - - const [vsamDatasetName, setVsamDatasetName] = useState(""); const [isDsNameValid, setIsDsNameValid] = useState(true); - const [initError, setInitError] = useState(false); - const [initErrorMsg, setInitErrorMsg] = useState(''); - const installationArgs = getInstallationArguments(); - const connectionArgs = useAppSelector(selectConnectionArgs); + const [installationArgs] = useState(getInstallationArguments()); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); let timer: any; - const defaultErrorMessage = "Please ensure that the volume, storage class & dataset values are accurate."; - - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let vsamSchema; - let validate: any; - if(schema) { - vsamSchema = schema?.properties?.zowe?.properties?.setup?.properties?.vsam; - } + const [defaultErrorMessage] = useState("Please ensure that the volume, storage class & dataset values are accurate."); - if(vsamSchema) { - validate = ajv.compile(vsamSchema); - } + const [validate] = useState(() => ajv.compile(setupSchema)) useEffect(() => { @@ -184,11 +168,6 @@ const Vsam = () => { setEditorVisible(!editorVisible); }; - const reinitialize = (event: any) => { - setReinit(true); - process(event); - } - const process = async (event: any) => { alertEmitter.emit('hideAlert'); @@ -198,8 +177,6 @@ const Vsam = () => { window.electron.ipcRenderer.initVsamButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { updateProgress(res.status); if(res.error) { - setInitError(true); - setInitErrorMsg(`${res ? res.errorMsg : ''} ${defaultErrorMessage}`); alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); } clearInterval(timer); @@ -336,7 +313,7 @@ const Vsam = () => { - + } diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index d22219fa..11810d5c 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -21,14 +21,15 @@ import LicenseDialog from "./LicenseDialog"; import { setActiveStep } from "../progress/activeStepSlice"; import { getStageDetails } from "../../../../services/StageDetails"; import { getInstallationTypeStatus } from "../progress/StageProgressStatus"; +import { INSTALLATION_TYPE_STAGE_LABEL } from "../../common/Constants"; const InstallationType = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - const stageLabel = 'Installation Type'; + const [stageLabel] = useState(INSTALLATION_TYPE_STAGE_LABEL); - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; + const [STAGE_ID] = useState(getStageDetails(stageLabel).id); + const [SUB_STAGES] = useState(!!getStageDetails(stageLabel).subStages); const dispatch = useAppDispatch(); const connectionArgs = useAppSelector(selectConnectionArgs); diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 74cafd2c..29d88449 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -25,7 +25,7 @@ import { alertEmitter } from "../../Header"; import { createTheme } from '@mui/material/styles'; import {stages} from "../../configuration-wizard/Wizard"; import { setActiveStep } from "../progress/activeStepSlice"; -import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK} from '../../common/Constants'; +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, INSTALL_STAGE_LABEL, ajv2019} from '../../common/Constants'; import { getStageDetails, getSubStageDetails } from "../../../../services/StageDetails"; import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; @@ -33,14 +33,14 @@ import eventDispatcher from '../../../../services/eventDispatcher'; const Installation = () => { - const stageLabel = 'Initialization'; - const subStageLabel = 'Installation'; + const [stageLabel] = useState(INIT_STAGE_LABEL); + const [subStageLabel] = useState(INSTALL_STAGE_LABEL); - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + const [STAGE_ID] = useState(getStageDetails(stageLabel).id); + const [SUB_STAGES] = useState(!!getStageDetails(stageLabel).subStages); + const [SUB_STAGE_ID]= useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0); - const theme = createTheme(); + const [theme] = useState(createTheme()); // TODO: Display granular details of installation - downloading - unpacking - running zwe command const dispatch = useAppDispatch(); @@ -49,7 +49,7 @@ const Installation = () => { const [schema] = useState(useAppSelector(selectSchema)); const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const connectionArgs = useAppSelector(selectConnectionArgs); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset); const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset); const [showProgress, setShowProgress] = useState(getProgress('datasetInstallationStatus')); @@ -63,9 +63,11 @@ const Installation = () => { const [initClicked, setInitClicked] = useState(false); const [installationArgs, setInstArgs] = useState(getInstallationArguments()); - const version = useAppSelector(selectZoweVersion); + const [version] = useState(useAppSelector(selectZoweVersion)); let timer: any; - const installationType = getInstallationTypeStatus().installationType; + const [installationType] = useState(getInstallationTypeStatus().installationType); + + const [validate] = useState(() => ajv.compile(setupSchema)); useEffect(() => { @@ -133,7 +135,7 @@ const Installation = () => { return yamlObj; } if(res.details.zowe === undefined){ - //for fallback scenario where user does NOT download or upload a pax and clicks "skip" on the installation stage. sets in redux but not on disk + //for fallback scenario where user does NOT download or upload a pax and clicks "skip" on the installation stage. sets in redux but not on disk. This should never occur let yamlObj = mergeInstallationArgsAndYaml(FALLBACK_YAML); // console.log('setting yaml:', yamlObj); setLYaml(yamlObj) @@ -153,13 +155,6 @@ const Installation = () => { setIsFormInit(true); - window.electron.ipcRenderer.getSchema().then((res: IResponse) => { - if(res.details === undefined){ - //for fallback scenario where user does NOT download or upload a pax and clicks "skip" on the installation stage. sets in redux - dispatch(setSchema(FALLBACK_SCHEMA)); - } - }) - dispatch(setNextStepEnabled(getProgress('datasetInstallationStatus'))); if(installationType === 'smpe') { @@ -250,6 +245,7 @@ const Installation = () => { event.preventDefault(); dispatch(setLoading(true)); setMvsDatasetInitProgress(datasetInstallationStatus) + dispatch(setDatasetInstallationStatus(false)); // FIXME: runtime dir is hardcoded, fix there and in InstallActions.ts - Unpax and Install functions Promise.all([ @@ -353,7 +349,7 @@ const Installation = () => { {/* */} : null} - + {!showProgress ? null : @@ -364,7 +360,7 @@ const Installation = () => { } - +
); diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index b68a326d..2242ff2c 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -38,6 +38,12 @@ contextBridge.exposeInMainWorld('electron', { setConfig(completeZoweYamlObj: any) { return ipcRenderer.invoke("set-config", completeZoweYamlObj); }, + setInstallationArgs(installationArgs: any) { + return ipcRenderer.invoke("set-installation-args", installationArgs); + }, + getInstallationArgs() { + return ipcRenderer.invoke("get-installation-args"); + }, setConfigByKeyAndValidate(key: string, value: any) { return ipcRenderer.invoke("set-config-by-key", key, value); }, From 1558d048d94d4d7c41056f092c429e3dee4d3e19 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 19:41:26 -0400 Subject: [PATCH 117/455] Better AJV implementation Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Constants.tsx | 7 ++++--- .../components/common/EditorDialog.tsx | 18 ++++++------------ .../components/stages/Certificates.tsx | 2 +- src/renderer/components/stages/InitApfAuth.tsx | 2 +- .../components/stages/LaunchConfig.tsx | 2 +- src/renderer/components/stages/Networking.tsx | 14 +++----------- src/renderer/components/stages/Security.tsx | 5 ++--- src/renderer/components/stages/Stcs.tsx | 2 +- .../stages/installation/Installation.tsx | 2 +- 9 files changed, 20 insertions(+), 34 deletions(-) diff --git a/src/renderer/components/common/Constants.tsx b/src/renderer/components/common/Constants.tsx index f1b0f169..bf78262d 100644 --- a/src/renderer/components/common/Constants.tsx +++ b/src/renderer/components/common/Constants.tsx @@ -36,8 +36,9 @@ export const FINISH_INSTALL_STAGE_LABEL = "Finish Installation"; import Ajv2019 from "ajv/dist/2019" import Ajv from "ajv"; +import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json"; -const server_common = { +export const SERVER_COMMON = { "$schema": "https://json-schema.org/draft/2019-09/schema", "$id": "https://zowe.org/schemas/v2/server-common", "title": "Common types", @@ -1111,11 +1112,11 @@ export const FALLBACK_SCHEMA = { //these two consts allow the whole schema to be validated -export const ajv2019 = new Ajv2019({schemas: [FALLBACK_SCHEMA, server_common]}).addKeyword("$anchor") +export const ajv2019 = new Ajv2019({schemas: [FALLBACK_SCHEMA, SERVER_COMMON]}).addKeyword("$anchor") export const schemaValidate = ajv2019.getSchema("https://zowe.org/schemas/v2/server-base") -export const ajv = new Ajv().addKeyword("$anchor"); +export const ajv = new Ajv2019().addKeyword("$anchor").addSchema(SERVER_COMMON); export const FALLBACK_YAML = { "node": { diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index bd6ff05f..2abc7aa2 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -14,10 +14,9 @@ import { Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/ import { selectYaml, selectOutput, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import Ajv2019 from "ajv/dist/2019" import MonacoEditorComponent from "../common/MonacoEditor"; -import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json"; import { parse, stringify } from "yaml"; import { IResponse } from "../../../types/interfaces"; -import { DEF_NO_OUTPUT } from "./Constants"; +import { DEF_NO_OUTPUT, schemaValidate } from "./Constants"; import { alertEmitter } from "../Header"; const test_jcl = ` @@ -87,18 +86,13 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC jsonData = newCode; } - const ajv = new Ajv2019() - ajv.addKeyword("$anchor"); - ajv.addMetaSchema(draft7MetaSchema) - const validate = ajv.compile(schema); - // To validate the javascript object against the schema - const isValid = validate(jsonData); - setIsSchemaValid(isValid); + schemaValidate(jsonData); + setIsSchemaValid(!schemaValidate.errors); - if(validate.errors && jsonData) { - const errPath = validate.errors[0].schemaPath; - const errMsg = validate.errors[0].message; + if(schemaValidate.errors && jsonData) { + const errPath = schemaValidate.errors[0].schemaPath; + const errMsg = schemaValidate.errors[0].message; setSchemaError(`Invalid Schema: ${errPath}. ${errMsg} `, ); jsonData = jsonData ? jsonData : ""; setSetupYaml(jsonData); diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 1d214953..7fdc4546 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -28,7 +28,7 @@ import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { setProgress, getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { CertInitSubStepsState } from "../../../types/stateInterfaces"; -import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv } from "../common/Constants"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv, SERVER_COMMON } from "../common/Constants"; const Certificates = () => { diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 64ed6249..6f274381 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -25,7 +25,7 @@ import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { getProgress, setApfAuthState, getApfAuthState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; -import { JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, INIT_STAGE_LABEL, APF_AUTH_STAGE_LABEL, ajv } from "../common/Constants"; +import { JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, INIT_STAGE_LABEL, APF_AUTH_STAGE_LABEL, ajv, SERVER_COMMON } from "../common/Constants"; const InitApfAuth = () => { diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index eb384a88..d4ce5539 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -21,7 +21,7 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { stages } from "../configuration-wizard/Wizard"; import { selectInitializationStatus, setLaunchConfigStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; -import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_YAML, ajv } from "../common/Constants"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_YAML, ajv, SERVER_COMMON } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; import { getInstallationArguments, getProgress } from "./progress/StageProgressStatus"; import { selectConnectionArgs } from "./connection/connectionSlice"; diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 46e9458c..86d4e08b 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -20,7 +20,7 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { stages } from "../configuration-wizard/Wizard"; import { selectInitializationStatus, setNetworkingStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; -import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from "../common/Constants"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML, ajv } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { getInstallationArguments, getProgress } from "./progress/StageProgressStatus"; @@ -555,17 +555,9 @@ const Networking = () => { const [installationArgs, setInstArgs] = useState(getInstallationArguments()); const [elements, setElements] = useState([]); const connectionArgs = useAppSelector(selectConnectionArgs); + const [validate] = useState(() => ajv.compile(schema)); - - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let validate: any; - - if(schema) { - validate = ajv.compile(schema); - } - // useEffect(() => { // // dispatch(setYaml(yaml)); // setModdedYaml(createModdedYaml(yaml)); @@ -696,7 +688,7 @@ const Networking = () => { setElements(newElements); } }, [yaml]) - + const onSaveYaml = (e: any) => { e.preventDefault(); alertEmitter.emit('showAlert', 'Uploading yaml...', 'info'); diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 30858a30..f64e4d30 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -27,7 +27,7 @@ import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { setProgress, getProgress, setSecurityInitState, getSecurityInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; -import { JCL_UNIX_SCRIPT_OK, INIT_STAGE_LABEL, SECURITY_STAGE_LABEL, ajv } from '../common/Constants'; +import { JCL_UNIX_SCRIPT_OK, INIT_STAGE_LABEL, SECURITY_STAGE_LABEL, ajv, SERVER_COMMON } from '../common/Constants'; import { alertEmitter } from "../Header"; const Security = () => { @@ -59,8 +59,7 @@ const Security = () => { const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); let timer: any; - const [securitySchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.security); - const [validate] = useState(() => ajv.compile(securitySchema)); + const [validate] = useState(() => ajv.compile(setupSchema)); useEffect(() => { diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 81053532..97676544 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -26,7 +26,7 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; -import { FALLBACK_SCHEMA, FALLBACK_YAML, INIT_STAGE_LABEL, ajv } from "../common/Constants"; +import { FALLBACK_SCHEMA, FALLBACK_YAML, INIT_STAGE_LABEL, SERVER_COMMON, ajv } from "../common/Constants"; const Stcs = () => { diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 29d88449..60998f19 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -25,7 +25,7 @@ import { alertEmitter } from "../../Header"; import { createTheme } from '@mui/material/styles'; import {stages} from "../../configuration-wizard/Wizard"; import { setActiveStep } from "../progress/activeStepSlice"; -import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, INSTALL_STAGE_LABEL, ajv2019} from '../../common/Constants'; +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, INSTALL_STAGE_LABEL, ajv2019, SERVER_COMMON} from '../../common/Constants'; import { getStageDetails, getSubStageDetails } from "../../../../services/StageDetails"; import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; From 0660889307c3e90adc6166addbc81e8907aa8914 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 19:46:50 -0400 Subject: [PATCH 118/455] use useState Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Constants.tsx | 1 - src/renderer/components/stages/LaunchConfig.tsx | 14 +++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/common/Constants.tsx b/src/renderer/components/common/Constants.tsx index bf78262d..c8c89817 100644 --- a/src/renderer/components/common/Constants.tsx +++ b/src/renderer/components/common/Constants.tsx @@ -36,7 +36,6 @@ export const FINISH_INSTALL_STAGE_LABEL = "Finish Installation"; import Ajv2019 from "ajv/dist/2019" import Ajv from "ajv"; -import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json"; export const SERVER_COMMON = { "$schema": "https://json-schema.org/draft/2019-09/schema", diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index d4ce5539..adfd50aa 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -21,7 +21,7 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { stages } from "../configuration-wizard/Wizard"; import { selectInitializationStatus, setLaunchConfigStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; -import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_YAML, ajv, SERVER_COMMON } from "../common/Constants"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_YAML, ajv, SERVER_COMMON, INIT_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; import { getInstallationArguments, getProgress } from "./progress/StageProgressStatus"; import { selectConnectionArgs } from "./connection/connectionSlice"; @@ -30,13 +30,9 @@ import { alertEmitter } from "../Header"; const LaunchConfig = () => { const [theme] = useState(createTheme()); - - const stageLabel = 'Initialization'; - const subStageLabel = 'Launch Config'; - - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); + const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); + const [SUB_STAGE_ID] = useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, LAUNCH_CONFIG_STAGE_LABEL).id : 0); const dispatch = useAppDispatch(); // const schema = useAppSelector(selectSchema); @@ -445,7 +441,7 @@ const LaunchConfig = () => { const [validate] = useState(() => ajv.compile(setupSchema)); - const isInitializationSkipped = !useAppSelector(selectInitializationStatus); + const [isInitializationSkipped] = useState(!useAppSelector(selectInitializationStatus)); useEffect(() => { From f05d9d7d42cb2e9e1f2b3f47a40eb90db1d32169 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 19:47:15 -0400 Subject: [PATCH 119/455] useState Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/LaunchConfig.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index adfd50aa..df24b0dd 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -437,7 +437,7 @@ const LaunchConfig = () => { const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); const [installationArgs, setInstArgs] = useState(getInstallationArguments()); - const connectionArgs = useAppSelector(selectConnectionArgs); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); const [validate] = useState(() => ajv.compile(setupSchema)); From 989cbe313f0f60648e01bb936d0e69740d2a6657 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 19:59:58 -0400 Subject: [PATCH 120/455] Update verbage Signed-off-by: Timothy Gerstel --- .../components/stages/installation/InstallTypeSelection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index 11810d5c..b9d5a4bd 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -106,7 +106,7 @@ const InstallationType = () => { {installValue === "smpe" && - {`SMP/E installation must be done outside of ZEN. Return to ZEN and input the location Zowe was installed to before continuing.`} + {`SMP/E installation must be done outside of ZEN. Return to ZEN after completing the SMP/E installation process.`} } {installValue === "download" &&
From 3427101fbf44663952b98d27b1eda8cd47c0293e Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 20:19:25 -0400 Subject: [PATCH 121/455] Update initialization status properly when all substages are complete Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 6 +++--- src/renderer/components/stages/InitApfAuth.tsx | 9 +++------ src/renderer/components/stages/LaunchConfig.tsx | 5 +++-- src/renderer/components/stages/Networking.tsx | 6 ++++-- src/renderer/components/stages/Security.tsx | 8 ++++---- src/renderer/components/stages/Stcs.tsx | 6 +++--- src/renderer/components/stages/Vsam.tsx | 6 +++--- .../stages/installation/Installation.tsx | 6 +++--- .../stages/progress/StageProgressStatus.ts | 10 ++++++++++ .../components/stages/progress/progressSlice.ts | 17 ++--------------- 10 files changed, 38 insertions(+), 41 deletions(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 7fdc4546..d0e960f3 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -26,7 +26,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { setProgress, getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { setProgress, getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments, getCompleteProgress, isInitComplete } from "./progress/StageProgressStatus"; import { CertInitSubStepsState } from "../../../types/stateInterfaces"; import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv, SERVER_COMMON } from "../common/Constants"; @@ -63,7 +63,7 @@ const Certificates = () => { const [validate] = useState(() => ajv.compile(certificateSchema)) useEffect(() => { - + dispatch(setInitializationStatus(isInitComplete())); if(getProgress('certificateStatus')) { const nextPosition = document.getElementById('start-certificate-progress'); nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start' }); @@ -148,7 +148,7 @@ const Certificates = () => { const allAttributesTrue = Object.values(certificateInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; dispatch(setNextStepEnabled(status)); - dispatch(setInitializationStatus(status)); + dispatch(setInitializationStatus(isInitComplete())); dispatch(setCertificateStatus(status)); setCertificateInitializationProgress(getCertificateInitState()); } diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 6f274381..06d2e74c 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -23,7 +23,7 @@ import { alertEmitter } from "../Header"; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { getProgress, setApfAuthState, getApfAuthState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { getProgress, setApfAuthState, getApfAuthState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, INIT_STAGE_LABEL, APF_AUTH_STAGE_LABEL, ajv, SERVER_COMMON } from "../common/Constants"; @@ -59,13 +59,11 @@ const InitApfAuth = () => { const [validate] = useState(() => ajv.compile(datasetSchema)); useEffect(() => { + dispatch(setInitializationStatus(isInitComplete())); let nextPosition; if(getProgress('apfAuthStatus')) { nextPosition = document.getElementById('start-apf-progress'); nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } else { - nextPosition = document.getElementById('container-box-id'); - nextPosition?.scrollIntoView({behavior: 'smooth'}); } updateProgress(getProgress('apfAuthStatus')); @@ -149,7 +147,7 @@ const InitApfAuth = () => { const allAttributesTrue = Object.values(apfAuthInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; dispatch(setNextStepEnabled(status)); - dispatch(setInitializationStatus(status)); + dispatch(setInitializationStatus(isInitComplete())); dispatch(setApfAuthStatus(status)); setApfAuthorizationInitProgress(getApfAuthState()); } @@ -208,7 +206,6 @@ const InitApfAuth = () => { const apfAuthProceedActions = (status: boolean) => { dispatch(setNextStepEnabled(status)); dispatch(setApfAuthStatus(status)); - dispatch(setInitializationStatus(status)); } const formChangeHandler = (data: any, isYamlUpdated?: boolean) => { diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index df24b0dd..d303835d 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -19,11 +19,11 @@ import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; -import { selectInitializationStatus, setLaunchConfigStatus } from "./progress/progressSlice"; +import { selectInitializationStatus, setInitializationStatus, setLaunchConfigStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_YAML, ajv, SERVER_COMMON, INIT_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; -import { getInstallationArguments, getProgress } from "./progress/StageProgressStatus"; +import { getInstallationArguments, getProgress, isInitComplete } from "./progress/StageProgressStatus"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { alertEmitter } from "../Header"; @@ -517,6 +517,7 @@ const LaunchConfig = () => { alertEmitter.emit('showAlert', res.details, 'error'); } }); + dispatch(setInitializationStatus(isInitComplete())); } return ( diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 86d4e08b..d5133374 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -18,12 +18,12 @@ import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; -import { selectInitializationStatus, setNetworkingStatus } from "./progress/progressSlice"; +import { selectInitializationStatus, setInitializationStatus, setNetworkingStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML, ajv } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; import { selectConnectionArgs } from "./connection/connectionSlice"; -import { getInstallationArguments, getProgress } from "./progress/StageProgressStatus"; +import { getInstallationArguments, getProgress, isInitComplete } from "./progress/StageProgressStatus"; import { alertEmitter } from "../Header"; // const schema = useAppSelector(selectSchema); @@ -570,6 +570,7 @@ const Networking = () => { if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); dispatch(setNextStepEnabled(getProgress('networkingStatus'))); + dispatch(setInitializationStatus(isInitComplete())); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = false; stages[STAGE_ID].isSkipped = isInitializationSkipped; setIsFormInit(true); @@ -701,6 +702,7 @@ const Networking = () => { dispatch(setNetworkingStatus(false)); alertEmitter.emit('showAlert', res.details, 'error'); } + dispatch(setInitializationStatus(isInitComplete())); }); } diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index f64e4d30..73e264e8 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -25,7 +25,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { setProgress, getProgress, setSecurityInitState, getSecurityInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { setProgress, getProgress, setSecurityInitState, getSecurityInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { JCL_UNIX_SCRIPT_OK, INIT_STAGE_LABEL, SECURITY_STAGE_LABEL, ajv, SERVER_COMMON } from '../common/Constants'; import { alertEmitter } from "../Header"; @@ -62,7 +62,7 @@ const Security = () => { const [validate] = useState(() => ajv.compile(setupSchema)); useEffect(() => { - + dispatch(setInitializationStatus(isInitComplete())); setShowProgress(initClicked || getProgress('securityStatus')); let nextPosition; @@ -147,7 +147,7 @@ const Security = () => { } const allAttributesTrue = Object.values(securityInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; - dispatch(setInitializationStatus(status)); + dispatch(setInitializationStatus(isInitComplete())); dispatch(setSecurityStatus(status)); dispatch(setNextStepEnabled(status)); setSecurityInitializationProgress(getSecurityInitState()); @@ -202,7 +202,7 @@ const Security = () => { const securityProceedActions = (status: boolean) => { dispatch(setNextStepEnabled(status)); dispatch(setSecurityStatus(status)); - dispatch(setInitializationStatus(status)); + dispatch(setInitializationStatus(isInitComplete())); } const handleFormChange = (data: any) => { diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 97676544..02909293 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -23,7 +23,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; import { FALLBACK_SCHEMA, FALLBACK_YAML, INIT_STAGE_LABEL, SERVER_COMMON, ajv } from "../common/Constants"; @@ -67,7 +67,7 @@ const Stcs = () => { const [validate] = useState(() => ajv.compile(stcsSchema)) useEffect(() => { - + dispatch(setInitializationStatus(isInitComplete())); setShowProgress(initClicked || getProgress('stcsStatus')); let nextPosition; @@ -161,7 +161,7 @@ const Stcs = () => { } const allAttributesTrue = Object.values(stcsInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; - dispatch(setInitializationStatus(status)); + dispatch(setInitializationStatus(isInitComplete())); dispatch(setStcsStatus(status)); dispatch(setNextStepEnabled(status)); setStcsInitializationProgress(getStcsInitState()); diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 297335fe..2cd4b15a 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -24,7 +24,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { getProgress, setVsamInitState, mapAndSetSkipStatus, getInstallationArguments, getVsamInitState } from "./progress/StageProgressStatus"; +import { getProgress, setVsamInitState, mapAndSetSkipStatus, getInstallationArguments, getVsamInitState, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; import { INIT_STAGE_LABEL, ajv } from "../common/Constants"; @@ -66,7 +66,7 @@ const Vsam = () => { const [validate] = useState(() => ajv.compile(setupSchema)) useEffect(() => { - + dispatch(setInitializationStatus(isInitComplete())); setShowProgress(initClicked || getProgress('vsamStatus')); let nextPosition; @@ -157,7 +157,7 @@ const Vsam = () => { } const allAttributesTrue = Object.values(vsamInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; - dispatch(setInitializationStatus(status)); + dispatch(setInitializationStatus(isInitComplete())); dispatch(setVsamStatus(status)); dispatch(setNextStepEnabled(status)); setVsamInitializationProgress(getVsamInitState()); diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 60998f19..1b13155b 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -27,7 +27,7 @@ import {stages} from "../../configuration-wizard/Wizard"; import { setActiveStep } from "../progress/activeStepSlice"; import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, INSTALL_STAGE_LABEL, ajv2019, SERVER_COMMON} from '../../common/Constants'; import { getStageDetails, getSubStageDetails } from "../../../../services/StageDetails"; -import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus } from "../progress/StageProgressStatus"; +import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus, isInitComplete } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; import eventDispatcher from '../../../../services/eventDispatcher'; @@ -71,7 +71,7 @@ const Installation = () => { useEffect(() => { - + dispatch(setInitializationStatus(isInitComplete())); if(getProgress("datasetInstallationStatus")) { const nextPosition = document.getElementById('save-installation-progress'); if(nextPosition) nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start' }); @@ -294,7 +294,7 @@ const Installation = () => { const installProceedActions = (status: boolean) => { dispatch(setNextStepEnabled(status)); dispatch(setDatasetInstallationStatus(status)); - dispatch(setInitializationStatus(status)); + dispatch(setInitializationStatus(isInitComplete())); } const debouncedChange = useCallback( diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index de54efb9..d184e99f 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -509,6 +509,16 @@ export const getCompleteProgress = () : ProgressState => { } } +export const isInitComplete = (): boolean => { + const progress = localStorage.getItem(progressStateKey); + if(progress) { + const data:any = unflatten(JSON.parse(progress)); + return data.datasetInstallationStatus && data.networkingStatus && data.apfAuthStatus && data.securityStatus && data.stcsStatus && data.certificateStatus && data.vsamStatus && data.launchConfigStatus; + } else { + return false; + } +} + export const setActiveStage = (stageId: number, isSubStage: boolean, date: string, subStageId?: number): void => { activeStatus.activeStepIndex = stageId; activeStatus.isSubStep = isSubStage; diff --git a/src/renderer/components/stages/progress/progressSlice.ts b/src/renderer/components/stages/progress/progressSlice.ts index 0fd60a0d..841a0934 100644 --- a/src/renderer/components/stages/progress/progressSlice.ts +++ b/src/renderer/components/stages/progress/progressSlice.ts @@ -50,21 +50,8 @@ export const progressSlice = createSlice({ setProgress('downloadUnpaxStatus', action.payload); }, setInitializationStatus: (state, action: PayloadAction) => { - if ( - state.datasetInstallationStatus && - state.networkingStatus && - state.apfAuthStatus && - state.securityStatus && - state.stcsStatus && - state.certificateStatus && - state.launchConfigStatus - ) { - state.initializationStatus = true; - setProgress('initializationStatus', true); - } else { - state.initializationStatus = false; - setProgress('initializationStatus', false); - } + state.initializationStatus = action.payload; + setProgress('initializationStatus', action.payload); }, setDatasetInstallationStatus: (state, action: PayloadAction) => { state.datasetInstallationStatus = action.payload; From 91f3e9b001b30837741592ce938c166ce8553d46 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 20:20:25 -0400 Subject: [PATCH 122/455] Reset stage status when uploading yaml Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/LaunchConfig.tsx | 1 + src/renderer/components/stages/Networking.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index d303835d..a438b7dc 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -506,6 +506,7 @@ const LaunchConfig = () => { const onSaveYaml = (e: any) => { e.preventDefault(); + dispatch(setLaunchConfigStatus(false)); alertEmitter.emit('showAlert', 'Uploading yaml...', 'info'); window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { if(res && res.status) { diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index d5133374..d5bde50d 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -693,6 +693,7 @@ const Networking = () => { const onSaveYaml = (e: any) => { e.preventDefault(); alertEmitter.emit('showAlert', 'Uploading yaml...', 'info'); + dispatch(setNetworkingStatus(false)); window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { if(res && res.status) { dispatch(setNextStepEnabled(true)); From 0dd8f706384d5ce5eb3f1e1be27de30ef694c708 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 21:26:03 -0400 Subject: [PATCH 123/455] Fix crash on first run of Zen, fix installation args not setting peroperly, remove unneeded ipcRenderer hooks Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 1 + src/main/index.ts | 12 ------------ src/renderer/components/Home.tsx | 15 ++++++--------- .../configuration-wizard/wizardSlice.ts | 3 --- .../stages/installation/Installation.tsx | 2 ++ src/renderer/preload.ts | 6 ------ 6 files changed, 9 insertions(+), 30 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 1455f5d2..f91cb413 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -219,6 +219,7 @@ class Installation { const jobOutputSplit = inputString.split(`cat ${catPath}\\r\\n`) if(jobOutputSplit[1]){ const trimmedYamlSchema = jobOutputSplit[1].split(`Script finished.`)[0].split(`Script finished.`); + // console.log("trimmed schema:", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`)) return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`); } return ""; diff --git a/src/main/index.ts b/src/main/index.ts index 16ade77b..06e2367f 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -20,8 +20,6 @@ import { checkDirExists } from '../services/ServiceUtils'; import { ConfigurationStore } from '../storage/ConfigurationStore'; import { EditorStore } from '../storage/EditorStore'; import { log, warn, error, info } from 'electron-log/main'; -import { getInstallationArguments } from '../renderer/components/stages/progress/StageProgressStatus'; -import { setInstallationArguments } from '../renderer/components/stages/progress/StageProgressStatus'; declare const MAIN_WINDOW_WEBPACK_ENTRY: string; declare const MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY: string; @@ -110,16 +108,6 @@ const createWindow = (): void => { return res; }); - ipcMain.handle('get-installation-args', async (event) => { - const res: any = await getInstallationArguments(); - return {status: true, details: res}; - }); - - ipcMain.handle('set-installation-args', async (event, installationArgs) => { - const res: any = await setInstallationArguments(installationArgs); - return {status: true}; - }); - ipcMain.handle('get-schema', async (event, schema: any) => { const res: any = await ConfigurationStore.getSchema(); return {status: true, details: res}; diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 594ed916..34196e76 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -93,7 +93,6 @@ const Home = () => { const [showLoginDialog, setShowLogin] = useState(false); const [yaml] = useState(useAppSelector(selectYaml)); const [schema, setLocalSchema] = useState(useAppSelector(selectSchema)); - const [installationArgs] = useState(useAppSelector(selectInstallationArgs)); const { activeStepIndex, isSubStep, activeSubStepIndex, lastActiveDate } = getPreviousInstallation(); @@ -130,7 +129,7 @@ const Home = () => { //SCHEMA LOADING - necessary for JsonForms if(schema == undefined || (typeof schema === "object" && Object.keys(yaml).length === 0)){ window.electron.ipcRenderer.getSchema().then((res: IResponse) => { - if (res.status) { + if (res.status && res.details !== undefined) { dispatch(setSchema(res.details)); } else { dispatch(setSchema(FALLBACK_SCHEMA)); @@ -139,13 +138,11 @@ const Home = () => { } //Load installation args - if(installationArgs == undefined){ - window.electron.ipcRenderer.getInstallationArgs().then((res: IResponse) => { - if (res.status) { - dispatch(setInstallationArgs(res.details)); - } - }) - } + window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { + if(res != undefined){ + dispatch(setInstallationArgs(res)); + } + }) diff --git a/src/renderer/components/configuration-wizard/wizardSlice.ts b/src/renderer/components/configuration-wizard/wizardSlice.ts index 28771228..d03bf27f 100644 --- a/src/renderer/components/configuration-wizard/wizardSlice.ts +++ b/src/renderer/components/configuration-wizard/wizardSlice.ts @@ -42,9 +42,6 @@ export const wizardSlice = createSlice({ }, setYaml: (state, action: PayloadAction) => { state.yaml = action.payload; - window.electron.ipcRenderer.setConfig(action.payload).then((res: IResponse) => { - // Response - }); }, setSchema: (state, action: PayloadAction) => { state.schema = action.payload; diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 1b13155b..c547fa99 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -80,6 +80,8 @@ const Installation = () => { if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); } + console.log('installationArgs:', JSON.stringify(installationArgs)); + window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { if(res != undefined){ // console.log("got installation args:", JSON.stringify(res)); diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 2242ff2c..b68a326d 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -38,12 +38,6 @@ contextBridge.exposeInMainWorld('electron', { setConfig(completeZoweYamlObj: any) { return ipcRenderer.invoke("set-config", completeZoweYamlObj); }, - setInstallationArgs(installationArgs: any) { - return ipcRenderer.invoke("set-installation-args", installationArgs); - }, - getInstallationArgs() { - return ipcRenderer.invoke("get-installation-args"); - }, setConfigByKeyAndValidate(key: string, value: any) { return ipcRenderer.invoke("set-config-by-key", key, value); }, From e88acf3911576beb3d91bdfa2476509bf1e81009 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 21:47:18 -0400 Subject: [PATCH 124/455] Original fallback schema is needed because of AJVs inability to resolve refs properly Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Constants.tsx | 996 +++++++++++++++++- .../stages/installation/Installation.tsx | 4 +- 2 files changed, 995 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/common/Constants.tsx b/src/renderer/components/common/Constants.tsx index c8c89817..6531d9d7 100644 --- a/src/renderer/components/common/Constants.tsx +++ b/src/renderer/components/common/Constants.tsx @@ -133,7 +133,7 @@ export const SERVER_COMMON = { } -export const FALLBACK_SCHEMA = { +export const BASE_SCHEMA = { "$schema": "https://json-schema.org/draft/2019-09/schema", "$id": "https://zowe.org/schemas/v2/server-base", "title": "Zowe configuration file", @@ -1110,8 +1110,1000 @@ export const FALLBACK_SCHEMA = { } +//this schema fixes ajv not resolving references properly +export const FALLBACK_SCHEMA = { + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "https://zowe.org/schemas/v2/server-base", + "title": "Zowe configuration file", + "description": "Configuration file for Zowe (zowe.org) version 2.", + "type": "object", + "additionalProperties": true, + "properties": { + "zowe": { + "type": "object", + "additionalProperties": false, + "properties": { + "setup": { + "type": "object", + "additionalProperties": false, + "description": "Zowe setup configurations used by \"zwe install\" and \"zwe init\" commands.", + "properties": { + "dataset": { + "type": "object", + "additionalProperties": false, + "description": "MVS data set related configurations", + "properties": { + "prefix": { + "type": "string", + "description": "Where Zowe MVS data sets will be installed" + }, + "proclib": { + "type": "string", + "description": "PROCLIB where Zowe STCs will be copied over" + }, + "parmlib": { + "type": "string", + "description": "Zowe PARMLIB" + }, + "parmlibMembers": { + "type": "object", + "additionalProperties": false, + "description": "Holds Zowe PARMLIB members for plugins", + "properties": { + "zis": { + "description": "PARMLIB member used by ZIS", + "type": "string", + "pattern": "^([A-Z$#@]){1}([A-Z0-9$#@]){0,7}$", + "minLength": 1, + "maxLength": 8 + } + } + }, + "jcllib": { + "type": "string", + "description": "JCL library where Zowe will store temporary JCLs during initialization" + }, + "loadlib": { + "type": "string", + "description": "States the dataset where Zowe executable utilities are located", + "default": ".SZWELOAD" + }, + "authLoadlib": { + "type": "string", + "description": "The dataset that contains any Zowe core code that needs to run APF-authorized, such as ZIS", + "default": ".SZWEAUTH" + }, + "authPluginLib": { + "type": "string", + "description": "APF authorized LOADLIB for Zowe ZIS Plugins" + } + } + }, + "zis": { + "type": "object", + "additionalProperties": false, + "description": "ZIS related configurations. This setup is optional.", + "properties": { + "parmlib": { + "type": "object", + "additionalProperties": false, + "description": "ZIS related PARMLIB configurations. This setup is optional.", + "properties": { + "keys": { + "type": "object", + "additionalProperties": true, + "description": "Used to specify special ZIS key types with key-value pairs", + "examples": [ + "key.sample.1: list", + "key.sample.2: list" + ] + } + } + } + } + }, + "security": { + "type": "object", + "additionalProperties": false, + "description": "Security related configurations. This setup is optional.", + "properties": { + "product": { + "type": "string", + "description": "Security product name. Can be RACF, ACF2 or TSS", + "enum": ["RACF", "ACF2", "TSS"], + "default": "RACF" + }, + "groups": { + "type": "object", + "additionalProperties": false, + "description": "security group name", + "properties": { + "admin": { + "type": "string", + "description": "Zowe admin user group", + "default": "ZWEADMIN" + }, + "stc": { + "type": "string", + "description": "Zowe STC group", + "default": "ZWEADMIN" + }, + "sysProg": { + "type": "string", + "description": "Zowe SysProg group", + "default": "ZWEADMIN" + } + } + }, + "users": { + "type": "object", + "additionalProperties": false, + "description": "security user name", + "properties": { + "zowe": { + "type": "string", + "description": "Zowe runtime user name of main service", + "default": "ZWESVUSR" + }, + "zis": { + "type": "string", + "description": "Zowe runtime user name of ZIS", + "default": "ZWESIUSR" + } + } + }, + "stcs": { + "type": "object", + "additionalProperties": false, + "description": "STC names", + "properties": { + "zowe": { + "type": "string", + "description": "STC name of main service", + "default": "ZWESLSTC" + }, + "zis": { + "type": "string", + "description": "STC name of ZIS", + "default": "ZWESISTC" + }, + "aux": { + "type": "string", + "description": "STC name of Auxiliary Service", + "default": "ZWESASTC" + } + } + } + } + }, + "certificate": { + "type": "object", + "additionalProperties": false, + "if": { + "properties": { + "type": { + "const": "PKCS12" + } + } + }, + "then": { + "required": ["pkcs12"] + }, + "else": { + "required": ["keyring"] + }, + "description": "Certificate related configurations", + "properties": { + "type": { + "type": "string", + "description": "Type of certificate storage method.", + "enum": ["PKCS12", "JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"], + "default": "PKCS12" + }, + "pkcs12": { + "type": "object", + "additionalProperties": false, + "description": "PKCS#12 keystore settings", + "properties": { + "directory": { + "description": "Keystore directory", + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024 + }, + "name": { + "type": "string", + "description": "Certificate alias name. Note: please use all lower cases as alias.", + "default": "localhost" + }, + "password": { + "type": "string", + "description": "Keystore password", + "default": "password" + }, + "caAlias": { + "type": "string", + "description": "Alias name of self-signed certificate authority. Note: please use all lower cases as alias.", + "default": "local_ca" + }, + "caPassword": { + "type": "string", + "description": "Password of keystore stored self-signed certificate authority.", + "default": "local_ca_password" + }, + "lock": { + "type": "boolean", + "description": "Whether to restrict the permissions of the keystore after creation" + }, + "import": { + "type": "object", + "additionalProperties": false, + "description": "Configure this section if you want to import certificate from another PKCS#12 keystore.", + "properties": { + "keystore": { + "type": "string", + "description": "Existing PKCS#12 keystore which holds the certificate issued by external CA." + }, + "password": { + "type": "string", + "description": "Password of the above keystore" + }, + "alias": { + "type": "string", + "description": "Certificate alias will be imported. Note: please use all lower cases as alias." + } + } + } + } + }, + "keyring": { + "type": "object", + "additionalProperties": false, + "description": "Configure this section if you are using z/OS keyring", + "properties": { + "owner": { + "type": "string", + "description": "keyring owner. If this is empty, Zowe will use the user ID defined as zowe.setup.security.users.zowe." + }, + "name": { + "type": "string", + "description": "keyring name" + }, + "label": { + "type": "string", + "description": "Label of Zowe certificate.", + "default": "localhost" + }, + "caLabel": { + "type": "string", + "description": "label of Zowe CA certificate.", + "default": "localca" + }, + "connect": { + "type": "object", + "additionalProperties": false, + "description": "Configure this section if you want to connect existing certificate in keyring to Zowe.", + "properties": { + "user": { + "type": "string", + "description": "Current owner of the existing certificate, can be SITE or an user ID." + }, + "label": { + "type": "string", + "description": "Label of the existing certificate will be connected to Zowe keyring." + } + } + }, + "import": { + "type": "object", + "additionalProperties": false, + "description": "Configure this section if you want to import existing certificate stored in data set to Zowe.", + "properties": { + "dsName": { + "type": "string", + "description": "Name of the data set holds the certificate issued by other CA. This data set should be in PKCS12 format and contain private key." + }, + "password": { + "type": "string", + "description": "Password for the PKCS12 data set." + } + } + }, + "zOSMF": { + "type": "object", + "additionalProperties": false, + "description": "Configure this section if you want to trust z/OSMF certificate authority in Zowe keyring.", + "properties": { + "ca": { + "type": "string", + "description": "z/OSMF certificate authority alias" + }, + "user": { + "type": "string", + "description": "z/OSMF user. Zowe initialization utility can detect alias of z/OSMF CA for RACF security system. The automated detection requires this z/OSMF user as input." + } + } + } + } + }, + "dname": { + "type": "object", + "additionalProperties": false, + "description": "Certificate distinguish name", + "properties": { + "caCommonName": { + "type": "string", + "description": "Common name of certificate authority generated by Zowe." + }, + "commonName": { + "type": "string", + "description": "Common name of certificate generated by Zowe." + }, + "orgUnit": { + "type": "string", + "description": "Organization unit of certificate generated by Zowe." + }, + "org": { + "type": "string", + "description": "Organization of certificate generated by Zowe." + }, + "locality": { + "type": "string", + "description": "Locality of certificate generated by Zowe. This is usually the city name." + }, + "state": { + "type": "string", + "description": "State of certificate generated by Zowe. You can also put province name here." + }, + "country": { + "type": "string", + "description": "2 letters country code of certificate generated by Zowe." + } + } + }, + "validity": { + "type": "integer", + "description": "Validity days for Zowe generated certificates", + "default": 3650 + }, + "san": { + "type": "array", + "description": "Domain names and IPs should be added into certificate SAN. If this field is not defined, `zwe init` command will use `zowe.externalDomains`.", + "items": { + "type": "string" + } + }, + "importCertificateAuthorities": { + "type": "array", + "description": "PEM format certificate authorities will also be imported and trusted. If you have other certificate authorities want to be trusted in Zowe keyring, list the certificate labels here. **NOTE**, due to the limitation of RACDCERT command, this field should contain maximum 2 entries.", + "items": { + "type": "string" + } + } + } + }, + "vsam": { + "type": "object", + "additionalProperties": false, + "description": "VSAM configurations if you are using VSAM as Caching Service storage", + "properties": { + "mode": { + "type": "string", + "description": "VSAM data set with Record-Level-Sharing enabled or not", + "enum": ["NONRLS", "RLS"], + "default": "NONRLS" + }, + "volume": { + "type": "string", + "description": "Volume name if you are using VSAM in NONRLS mode" + }, + "storageClass": { + "type": "string", + "description": "Storage class name if you are using VSAM in RLS mode" + } + } + } + } + }, + "runtimeDirectory": { + "$ref": "#/$defs/zowePath", + "description": "Path to where you installed Zowe." + }, + "logDirectory": { + "$ref": "#/$defs/zowePath", + "description": "Path to where you want to store Zowe log files." + }, + "workspaceDirectory": { + "$ref": "#/$defs/zowePath", + "description": "Path to where you want to store Zowe workspace files. Zowe workspace are used by Zowe component runtime to store temporary files." + }, + "extensionDirectory": { + "$ref": "#/$defs/zowePath", + "description": "Path to where you want to store Zowe extensions. \"zwe components install\" will install new extensions into this directory." + }, + "job": { + "type": "object", + "additionalProperties": false, + "description": "Customize your Zowe z/OS JES job.", + "properties": { + "name": { + "type": "string", + "description": "Job name of Zowe primary ZWESLSTC started task." + }, + "prefix": { + "type": "string", + "description": "A short prefix to customize address spaces created by Zowe job." + } + } + }, + "network": { + "$ref": "#/$defs/networkSettings" + }, + "extensionRegistry": { + "type": "object", + "description": "Defines optional configuration for downloading extensions from an online or offline registry", + "required": ["defaultHandler", "handlers"], + "properties": { + "defaultHandler": { + "type": "string", + "description": "The name of a handler specified in the handlers section. Will be used as the default for 'zwe components' commands" + }, + "handlers": { + "type": "object", + "patternProperties": { + "^.*$": { + "$ref": "#/$defs/registryHandler" + } + } + } + } + }, + "launcher": { + "type": "object", + "description": "Set default behaviors of how the Zowe launcher will handle components", + "additionalProperties": false, + "properties": { + "restartIntervals": { + "type": "array", + "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", + "items": { + "type": "integer" + } + }, + "minUptime": { + "type": "integer", + "default": 90, + "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." + }, + "shareAs": { + "type": "string", + "description": "Determines which SHAREAS mode should be used when starting a component", + "enum": ["no", "yes", "must", ""], + "default": "yes" + }, + "unsafeDisableZosVersionCheck": { + "type": "boolean", + "description": "Used to allow Zowe to warn, instead of error, when running on a version of z/OS that this version of Zowe hasn't been verified as working with", + "default": false + } + } + }, + "rbacProfileIdentifier": { + "type": "string", + "description": "An ID used for determining resource names used in RBAC authorization checks" + }, + "cookieIdentifier": { + "type": "string", + "description": "An ID that can be used by servers that distinguish their cookies from unrelated Zowe installs" + }, + "externalDomains": { + "type": "array", + "description": "List of domain names of how you access Zowe from your local computer.", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": ["string"] + } + }, + "externalPort": { + "$ref": "#/$defs/port", + "description": "Port number of how you access Zowe APIML Gateway from your local computer." + }, + "environments": { + "type": "object", + "description": "Global environment variables can be applied to all Zowe high availability instances." + }, + "launchScript": { + "type": "object", + "description": "Customize Zowe launch scripts (zwe commands) behavior.", + "properties": { + "logLevel": { + "type": "string", + "description": "Log level for Zowe launch scripts.", + "enum": ["", "info", "debug", "trace"] + }, + "onComponentConfigureFail": { + "type": "string", + "description": "Chooses how 'zwe start' behaves if a component configure script fails", + "enum": ["warn", "exit"], + "default": "warn" + } + } + }, + "certificate": { + "$ref": "#/$defs/certificate", + "description": "Zowe certificate setup." + }, + "verifyCertificates": { + "type": "string", + "description": "Customize how Zowe should validate certificates used by components or other services.", + "enum": ["STRICT", "NONSTRICT", "DISABLED"] + }, + "sysMessages": { + "type": "array", + "description": "List of Zowe message portions when matched will be additionally logged into the system's log (such as syslog on z/OS). Note: Some messages extremely early in the Zowe lifecycle may not be added to the system's log", + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "useConfigmgr": { + "type": "boolean", + "default": false, + "description": "Determines whether or not to use the features of configmgr such as multi-config, parmlib config, config templates, and schema validation. This effects the zwe command." + }, + "configmgr": { + "type": "object", + "description": "Controls how configmgr will be used by zwe", + "required": ["validation"], + "properties": { + "validation": { + "type": "string", + "enum": ["STRICT", "COMPONENT-COMPAT"], + "description": "States how configmgr will do validation: Will it quit on any error (STRICT) or quit on any error except the case of a component not having a schema file (COMPONENT-COMPAT)" + } + } + } + } + }, + "java": { + "type": "object", + "properties": { + "home": { + "$ref": "#/$defs/zowePath", + "description": "Path to Java home directory." + } + } + }, + "node": { + "type": "object", + "properties": { + "home": { + "$ref": "#/$defs/zowePath", + "description": "Path to node.js home directory." + } + } + }, + "zOSMF": { + "type": "object", + "additionalProperties": false, + "properties": { + "host": { + "type": "string", + "description": "Host or domain name of your z/OSMF instance." + }, + "port": { + "$ref": "#/$defs/port", + "description": "Port number of your z/OSMF instance." + }, + "scheme": { + "$ref" : "#/$defs/scheme", + "description": "Scheme used to connect to z/OSMF instance. Optional for outbout AT-TLS, defaults to https" + }, + "applId": { + "type": "string", + "description": "Appl ID of your z/OSMF instance." + } + } + }, + "components": { + "type": "object", + "patternProperties": { + "^.*$": { + "$ref": "#/$defs/component" + } + } + }, + "haInstances": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "description": "Configuration of Zowe high availability instance.", + "required": ["hostname", "sysname"], + "properties": { + "hostname": { + "type": "string", + "description": "Host name of the Zowe high availability instance. This is hostname for internal communications." + }, + "sysname": { + "type": "string", + "description": "z/OS system name of the Zowe high availability instance. Some JES command will be routed to this system name." + }, + "components": { + "type": "object", + "patternProperties": { + "^.*$": { + "$ref": "#/$defs/component" + } + } + } + } + } + } + } + }, + "$defs": { + "port": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "scheme": { + "type": "string", + "enum": [ + "http", + "https" + ], + "default": "https" + }, + "certificate": { + "oneOf": [ + { "$ref": "#/$defs/pkcs12-certificate" }, + { "$ref": "#/$defs/keyring-certificate" } + ] + }, + "pkcs12-certificate": { + "type": "object", + "additionalProperties": false, + "required": ["keystore", "truststore", "pem"], + "properties": { + "keystore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate keystore.", + "required": ["type", "file", "alias"], + "properties": { + "type": { + "type": "string", + "description": "Keystore type.", + "const": "PKCS12" + }, + "file": { + "$ref": "#/$defs/zowePath", + "description": "Path to your PKCS#12 keystore." + }, + "password": { + "type": "string", + "description": "Password of your PKCS#12 keystore." + }, + "alias": { + "type": "string", + "description": "Certificate alias name of defined in your PKCS#12 keystore" + } + } + }, + "truststore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate truststore.", + "required": ["type", "file"], + "properties": { + "type": { + "type": "string", + "description": "Truststore type.", + "const": "PKCS12" + }, + "file": { + "$ref": "#/$defs/zowePath", + "description": "Path to your PKCS#12 keystore." + }, + "password": { + "type": "string", + "description": "Password of your PKCS#12 keystore." + } + } + }, + "pem": { + "type": "object", + "additionalProperties": false, + "description": "Certificate in PEM format.", + "required": ["key", "certificate"], + "properties": { + "key": { + "$ref": "#/$defs/zowePath", + "description": "Path to the certificate private key stored in PEM format." + }, + "certificate": { + "$ref": "#/$defs/zowePath", + "description": "Path to the certificate stored in PEM format." + }, + "certificateAuthorities": { + "description": "List of paths to the certificate authorities stored in PEM format.", + "oneOf": [{ + "$ref": "#/$defs/zowePath", + "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." + }, + { + "type": "array", + "description": "Path to the certificate authority stored in PEM format.", + "items": { + "$ref": "#/$defs/zowePath" + } + } + ] + } + } + } + } + }, + "keyring-certificate": { + "type": "object", + "additionalProperties": false, + "required": ["keystore", "truststore"], + "properties": { + "keystore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate keystore.", + "required": ["type", "file", "alias"], + "properties": { + "type": { + "type": "string", + "description": "Keystore type.", + "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] + }, + "file": { + "type": "string", + "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", + "pattern": "^safkeyring:\/\/.*" + }, + "password": { + "type": "string", + "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", + "enum": ["", "password"] + }, + "alias": { + "type": "string", + "description": "Certificate label of z/OS keyring. Case sensitivity and spaces matter." + } + } + }, + "truststore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate truststore.", + "required": ["type", "file"], + "properties": { + "type": { + "type": "string", + "description": "Truststore type.", + "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] + }, + "file": { + "type": "string", + "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", + "pattern": "^safkeyring:\/\/.*" + }, + "password": { + "type": "string", + "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", + "enum": ["", "password"] + } + } + }, + "pem": { + "type": "object", + "additionalProperties": false, + "description": "Certificate in PEM format.", + "properties": { + "key": { + "type": "string", + "description": "Path to the certificate private key stored in PEM format." + }, + "certificate": { + "type": "string", + "description": "Path to the certificate stored in PEM format." + }, + "certificateAuthorities": { + "description": "List of paths to the certificate authorities stored in PEM format.", + "oneOf": [{ + "type": "string", + "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." + }, + { + "type": "array", + "description": "Path to the certificate authority stored in PEM format.", + "items": { + "type": "string" + } + } + ] + } + } + } + } + }, + "component": { + "$anchor": "zoweComponent", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether to enable or disable this component", + "default": false + }, + "certificate": { + "$ref": "#/$defs/certificate", + "description": "Certificate for current component." + }, + "launcher": { + "type": "object", + "description": "Set behavior of how the Zowe launcher will handle this particular component", + "additionalProperties": true, + "properties": { + "restartIntervals": { + "type": "array", + "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", + "items": { + "type": "integer" + } + }, + "minUptime": { + "type": "integer", + "default": 90, + "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." + }, + "shareAs": { + "type": "string", + "description": "Determines which SHAREAS mode should be used when starting a component", + "enum": ["no", "yes", "must", ""], + "default": "yes" + } + } + }, + "zowe": { + "type": "object", + "description": "Component level overrides for top level Zowe network configuration.", + "additionalProperties": true, + "properties": { + "network": { + "$ref": "#/$defs/networkSettings" + }, + "job": { + "$ref": "#/$defs/componentJobSettings" + } + } + } + } + }, + "componentJobSettings": { + "$anchor": "componentJobSettings", + "type": "object", + "description": "Component level overrides for job execution behavior", + "properties": { + "suffix": { + "type": "string", + "description": "Can be used by components to declare a jobname suffix to append to their job. This is not currently used by Zowe itself, it is up to components to use this value if desired. Zowe may use this value in the future." + } + } + }, + "tlsSettings": { + "$anchor": "tlsSettings", + "type": "object", + "properties": { + "ciphers": { + "type": "array", + "description": "Acceptable TLS cipher suites for network connections, in IANA format.", + "items": { + "type": "string" + } + }, + "curves": { + "type": "array", + "description": "Acceptable key exchange elliptic curves for network connections.", + "items": { + "type": "string" + } + }, + "maxTls": { + "type": "string", + "enum": ["TLSv1.2", "TLSv1.3"], + "default": "TLSv1.3", + "description": "Maximum TLS version allowed for network connections." + }, + "minTls": { + "type": "string", + "enum": ["TLSv1.2", "TLSv1.3"], + "default": "TLSv1.2", + "description": "Minimum TLS version allowed for network connections, and less than or equal to network.maxTls." + } + } + }, + "networkSettings": { + "type": "object", + "$anchor": "networkSettings", + "additionalProperties": false, + "description": "Optional, advanced network configuration parameters", + "properties": { + "server": { + "type": "object", + "additionalProperties": false, + "description": "Optional, advanced network configuration parameters for Zowe servers", + "properties": { + "tls": { + "$ref": "#/$defs/tlsSettings" + }, + "listenAddresses": { + "type": "array", + "description": "The IP addresses which all of the Zowe servers will be binding on and listening to. Some servers may only support listening on the first element.", + "items": { + "type": "string", + "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" + } + }, + "vipaIp": { + "type": "string", + "description": "The IP address which all of the Zowe servers will be binding to. If you are using multiple DIPVA addresses, do not use this option." + }, + "validatePortFree": { + "type": "boolean", + "default": true, + "description": "Whether or not to ensure that the port a server is about to use is available. Usually, servers will know this when they attempt to bind to a port, so this option allows you to disable the additional verification step." + } + } + }, + "client": { + "type": "object", + "additionalProperties": false, + "description": "Optional, advanced network configuration parameters for Zowe servers when sending requests as clients.", + "properties": { + "tls": { + "$ref": "#/$defs/tlsSettings" + } + } + } + } + }, + "registryHandler": { + "$anchor": "registryHandler", + "type": "object", + "required": ["registry", "path"], + "properties": { + "registry": { + "type": "string", + "description": "The location of the default registry for this handler. It could be a URL, path, dataset, whatever this handler supports" + }, + "path": { + "$ref": "#/$defs/zowePath", + "description": "Unix file path to the configmgr-compatible JS file which implements the handler API" + } + } + }, + "zowePath": { + "$anchor": "zowePath", + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024 + }, + } +} + + //these two consts allow the whole schema to be validated -export const ajv2019 = new Ajv2019({schemas: [FALLBACK_SCHEMA, SERVER_COMMON]}).addKeyword("$anchor") +export const ajv2019 = new Ajv2019({schemas: [BASE_SCHEMA, SERVER_COMMON]}).addKeyword("$anchor") export const schemaValidate = ajv2019.getSchema("https://zowe.org/schemas/v2/server-base") diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index c547fa99..64f5a4d2 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -51,7 +51,7 @@ const Installation = () => { const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset); - const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset); + const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset || FALLBACK_YAML?.zowe?.setup?.dataset); const [showProgress, setShowProgress] = useState(getProgress('datasetInstallationStatus')); const [isFormInit, setIsFormInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); @@ -80,8 +80,6 @@ const Installation = () => { if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); } - console.log('installationArgs:', JSON.stringify(installationArgs)); - window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { if(res != undefined){ // console.log("got installation args:", JSON.stringify(res)); From 85a3672a5c6b021a4b51d7d7d17b4bc68035ea8d Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 21:57:34 -0400 Subject: [PATCH 125/455] Fix schema errors Signed-off-by: Timothy Gerstel --- src/renderer/components/common/EditorDialog.tsx | 4 +--- src/renderer/components/stages/Certificates.tsx | 2 +- src/renderer/components/stages/InitApfAuth.tsx | 2 +- src/renderer/components/stages/LaunchConfig.tsx | 2 +- src/renderer/components/stages/Networking.tsx | 2 +- src/renderer/components/stages/Security.tsx | 2 +- src/renderer/components/stages/Stcs.tsx | 2 +- src/renderer/components/stages/Vsam.tsx | 2 +- src/renderer/components/stages/installation/Installation.tsx | 2 +- 9 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index 2abc7aa2..fa8868ed 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -16,7 +16,7 @@ import Ajv2019 from "ajv/dist/2019" import MonacoEditorComponent from "../common/MonacoEditor"; import { parse, stringify } from "yaml"; import { IResponse } from "../../../types/interfaces"; -import { DEF_NO_OUTPUT, schemaValidate } from "./Constants"; +import { DEF_NO_OUTPUT, FALLBACK_SCHEMA, ajv, schemaValidate } from "./Constants"; import { alertEmitter } from "../Header"; const test_jcl = ` @@ -34,7 +34,6 @@ const test_op = "WARNING: 'Some Warning'\nERROR: 'Some Error'\nINFO: 'Some Info' const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onChange, content, readOnlyYaml} : {contentType: any, isEditorVisible: boolean, toggleEditorVisibility: any, onChange?: any, content?: any, readOnlyYaml?: boolean}) => { const dispatch = useAppDispatch(); - const schema = useAppSelector(selectSchema); const [setupYaml, setSetupYaml] = useState(useAppSelector(selectYaml)); const [setupOutput, setSetupOutput] = useState(useAppSelector(selectOutput)); const [editorVisible, setEditorVisible] = useState(false); @@ -87,7 +86,6 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC } // To validate the javascript object against the schema - schemaValidate(jsonData); setIsSchemaValid(!schemaValidate.errors); if(schemaValidate.errors && jsonData) { diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index d0e960f3..14d6a2e0 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -60,7 +60,7 @@ const Certificates = () => { let timer: any; const [certificateSchema] = useState( schema?.properties?.zowe?.properties?.setup?.properties?.certificate) - const [validate] = useState(() => ajv.compile(certificateSchema)) + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)) useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 06d2e74c..4f5f1797 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -56,7 +56,7 @@ const InitApfAuth = () => { let timer: any; const [datasetSchema] = useState(schema.properties.zowe.properties.setup.properties.dataset); - const [validate] = useState(() => ajv.compile(datasetSchema)); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index a438b7dc..f7ef6589 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -439,7 +439,7 @@ const LaunchConfig = () => { const [installationArgs, setInstArgs] = useState(getInstallationArguments()); const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); - const [validate] = useState(() => ajv.compile(setupSchema)); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); const [isInitializationSkipped] = useState(!useAppSelector(selectInitializationStatus)); diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index d5bde50d..08d1d057 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -555,7 +555,7 @@ const Networking = () => { const [installationArgs, setInstArgs] = useState(getInstallationArguments()); const [elements, setElements] = useState([]); const connectionArgs = useAppSelector(selectConnectionArgs); - const [validate] = useState(() => ajv.compile(schema)); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); // useEffect(() => { diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 73e264e8..862d7f87 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -59,7 +59,7 @@ const Security = () => { const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); let timer: any; - const [validate] = useState(() => ajv.compile(setupSchema)); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 02909293..5838fa67 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -64,7 +64,7 @@ const Stcs = () => { const [defaultErrorMessage] = useState("Please ensure that the values for security.stcs attributes and dataset.proclib are accurate."); const [stcsSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.security?.properties?.stcs); - const [validate] = useState(() => ajv.compile(stcsSchema)) + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)) useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 2cd4b15a..abc8ec6a 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -63,7 +63,7 @@ const Vsam = () => { const [defaultErrorMessage] = useState("Please ensure that the volume, storage class & dataset values are accurate."); - const [validate] = useState(() => ajv.compile(setupSchema)) + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)) useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 64f5a4d2..1e84f2ba 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -67,7 +67,7 @@ const Installation = () => { let timer: any; const [installationType] = useState(getInstallationTypeStatus().installationType); - const [validate] = useState(() => ajv.compile(setupSchema)); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); useEffect(() => { From 08f2b40c1038093c8bf90c3858152b77f2c9e66a Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 21:59:36 -0400 Subject: [PATCH 126/455] Fix init apf auth weird scrolling Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/InitApfAuth.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 4f5f1797..9a5c195e 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -302,7 +302,7 @@ const InitApfAuth = () => { } - +
From 6d5eeee31755ff447fb5c40fdfc30152fc5ba4e5 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 22:23:23 -0400 Subject: [PATCH 127/455] Fix launch config status resetting Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/LaunchConfig.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index f7ef6589..7cdeafe4 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -475,6 +475,9 @@ const LaunchConfig = () => { }; const handleFormChange = async (data: any, isYamlUpdated?: boolean) => { + if(isFormInit){ + setLaunchConfigStatus(false) + } let newData = isFormInit ? (Object.keys(setupYaml).length > 0 ? setupYaml : data.zowe) : (data.zowe ? data.zowe : data); setIsFormInit(false); @@ -493,7 +496,6 @@ const LaunchConfig = () => { dispatch(setYaml(newYaml)); setStageConfig(true, '', newData); } - dispatch(setLaunchConfigStatus(false)); } } }; From 107c0e55e84185197929ba83aeacd2473af5b267 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 22:57:12 -0400 Subject: [PATCH 128/455] Fix edge case of zowe.job not being set??? shouldnt be possible Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/LaunchConfig.tsx | 2 +- src/renderer/components/stages/Security.tsx | 3 --- .../components/stages/installation/Installation.tsx | 9 +++++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 7cdeafe4..49f4c6e1 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -519,8 +519,8 @@ const LaunchConfig = () => { dispatch(setLaunchConfigStatus(false)); alertEmitter.emit('showAlert', res.details, 'error'); } + dispatch(setInitializationStatus(isInitComplete())); }); - dispatch(setInitializationStatus(isInitComplete())); } return ( diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 862d7f87..a985983a 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -69,9 +69,6 @@ const Security = () => { if(getProgress('securityStatus')) { nextPosition = document.getElementById('security-progress'); nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'end' }); - } else { - nextPosition = document.getElementById('container-box-id'); - nextPosition?.scrollIntoView({behavior: 'smooth'}); } updateProgress(getProgress('securityStatus')); diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 1e84f2ba..e20de89e 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -109,7 +109,13 @@ const Installation = () => { yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; } if ((yamlObj.zowe.job?.name === undefined || yamlObj.zowe.job?.name === '') && installationArgs.jobName) { //this undefined check is necessary because InstallationStage.jobName has a defualt, and therefore this would always overwrite the value in the config - yamlObj.zowe.job.name = installationArgs.jobName; + if(yamlObj.zowe.job === undefined){ + yamlObj.zowe.job = { + name: installationArgs.jobName + } + } else { + yamlObj.zowe.job.name = installationArgs.jobName; + } } if ((yamlObj.zowe.job?.prefix === undefined || yamlObj.zowe.job?.prefix === '') && installationArgs.jobPrefix) { yamlObj.zowe.job.prefix = installationArgs.jobPrefix; @@ -141,7 +147,6 @@ const Installation = () => { setLYaml(yamlObj) dispatch(setYaml(yamlObj)) } else { - // console.log('got config:', JSON.stringify(res.details)); let yamlObj = mergeInstallationArgsAndYaml(res.details); if(res.details.zowe?.setup?.dataset === undefined){ dispatch(setYaml({...yamlObj, zowe: {...yamlObj.zowe, setup: {...yamlObj.zowe.setup, dataset: FALLBACK_YAML.zowe.setup.dataset}} })); From 4a4c3e5cad0cc125d0b4ddff388ed1ccc2a4357b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 23:06:19 -0400 Subject: [PATCH 129/455] Fix installation type not being saved Signed-off-by: Timothy Gerstel --- .../components/stages/installation/InstallTypeSelection.tsx | 1 + src/renderer/components/stages/installation/Installation.tsx | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index b9d5a4bd..b29e4da4 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -96,6 +96,7 @@ const InstallationType = () => { name="radio-buttons-group" onChange={(e) => { dispatch(setInstallationArgs({...installationArgs, installationType: e.target.value})); + window.electron.ipcRenderer.setConfigByKeyNoValidate("installationArgs", {...installationArgs, installationType: e.target.value}); dispatch(setInstallationType(e.target.value)) installTypeChangeHandler(e.target.value) }} diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index e20de89e..b785e5b1 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -82,7 +82,8 @@ const Installation = () => { window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { if(res != undefined){ - // console.log("got installation args:", JSON.stringify(res)); + console.log("got installation args:", JSON.stringify(res)); + console.log("getInstallationArguments():", JSON.stringify(getInstallationArguments())); setInstArgs((res as any)); } window.electron.ipcRenderer.getConfig().then((res: IResponse) => { From d4aa5801bf502e232273f77a4a83666122e3217f Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 23:07:18 -0400 Subject: [PATCH 130/455] remove console logs Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index b785e5b1..8c07eed6 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -82,8 +82,6 @@ const Installation = () => { window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { if(res != undefined){ - console.log("got installation args:", JSON.stringify(res)); - console.log("getInstallationArguments():", JSON.stringify(getInstallationArguments())); setInstArgs((res as any)); } window.electron.ipcRenderer.getConfig().then((res: IResponse) => { From 461530fb946320505498a4868d2e51f2945d5bf5 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 12 Jun 2024 23:15:55 -0400 Subject: [PATCH 131/455] Use correct installation args Signed-off-by: Timothy Gerstel --- .../components/stages/installation/Installation.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 8c07eed6..342d4689 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -80,10 +80,7 @@ const Installation = () => { if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); } - window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { - if(res != undefined){ - setInstArgs((res as any)); - } + if(installationArgs != undefined){ window.electron.ipcRenderer.getConfig().then((res: IResponse) => { function mergeInstallationArgsAndYaml(yaml: any){ let yamlObj = JSON.parse(JSON.stringify(yaml)); @@ -155,7 +152,7 @@ const Installation = () => { } } }) - }) + } setIsFormInit(true); From 4d2afc593840ed9e38e1976804c73442b8ee4c69 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 00:48:46 -0400 Subject: [PATCH 132/455] Add button to retrieve example-zowe.yaml and schemas when using SMPE mode Signed-off-by: Timothy Gerstel --- src/actions/InstallActions.ts | 4 + src/actions/InstallationHandler.ts | 233 +++++++++++++++++------ src/main/index.ts | 5 + src/renderer/components/Home.tsx | 2 + src/renderer/components/stages/Unpax.tsx | 49 ++++- src/renderer/preload.ts | 3 + 6 files changed, 229 insertions(+), 67 deletions(-) diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index a546ade7..9843fae7 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -64,6 +64,10 @@ export class InstallActions { return this.strategy.uploadLatestYaml(connectionArgs, installationArgs); } + smpeGetExampleYamlAndSchemas(connectionArgs: IIpcConnectionArgs, installArgs: InstallationArgs): Promise { + return this.strategy.smpeGetExampleYamlAndSchemas(connectionArgs, installArgs); + } + initStcs(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: object): Promise { return this.strategy.initStcs(connectionArgs, installationArgs, zoweConfig); diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index f91cb413..4f1316b7 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -56,6 +56,173 @@ class Installation { } } + parseExampleYamlFromPax = function(catPath: string, yaml: any){ + const jobOutputSplit = JSON.stringify(yaml).split(`cat ${catPath}\\r\\n`) + if(jobOutputSplit[1]){ + const trimmedYamlSchema = jobOutputSplit[1].split(`+ echo 'Script finished.'`)[0].split(`Script finished.`); + // console.log("\n\n *** trimmedYamlSchema[0]: ", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`)); + return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`); + } + return ""; + } + + parseSchemaFromPax = function(inputString: string, catPath: string){ + const jobOutputSplit = inputString.split(`cat ${catPath}\\r\\n`) + if(jobOutputSplit[1]){ + const trimmedYamlSchema = jobOutputSplit[1].split(`Script finished.`)[0].split(`Script finished.`); + // console.log("trimmed schema:", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`)) + return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`); + } + return ""; + } + + mergeYamlAndInstallationArgs = function(yamlObj: any, installationArgs: InstallationArgs){ + if (yamlObj.zowe.runtimeDirectory === undefined && installationArgs.installationDir) { + yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; + } + if (yamlObj.zowe.workspaceDirectory === undefined && installationArgs.workspaceDir) { + yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; + } + if (yamlObj.zowe.logDirectory === undefined && installationArgs.logDir) { + yamlObj.zowe.logDirectory = installationArgs.logDir; + } + if (yamlObj.zowe.extensionDirectory === undefined && installationArgs.extensionDir) { + yamlObj.zowe.extensionDirectory = installationArgs.extensionDir; + } + if (yamlObj.zowe.rbacProfileIdentifier === undefined && installationArgs.rbacProfile) { + yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; + } + if (yamlObj.zowe.job.name === undefined && installationArgs.jobName) { + yamlObj.zowe.job.name = installationArgs.jobName; + } + if (yamlObj.zowe.job.prefix === undefined && installationArgs.jobPrefix) { + yamlObj.zowe.job.prefix = installationArgs.jobPrefix; + } + if (yamlObj.zowe.cookieIdentifier === undefined && installationArgs.cookieId) { + yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; + } + if (yamlObj.java.home === undefined && installationArgs.javaHome) { + yamlObj.java.home = installationArgs.javaHome; + } + if (yamlObj.node.home === undefined && installationArgs.nodeHome) { + yamlObj.node.home = installationArgs.nodeHome; + } + if (yamlObj.zOSMF.host === undefined && installationArgs.zosmfHost) { + yamlObj.zOSMF.host = installationArgs.zosmfHost; + } + if (yamlObj.zOSMF.port === undefined && installationArgs.zosmfPort) { + yamlObj.zOSMF.port = installationArgs.zosmfPort; + } + if (yamlObj.zOSMF.applId === undefined && installationArgs.zosmfApplId) { + yamlObj.zOSMF.applId = installationArgs.zosmfApplId; + } + } + + public async smpeGetExampleYamlAndSchemas ( + connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs, + ): Promise { + try{ + const currentConfig: any = ConfigurationStore.getConfig(); + let yamlObj + const zoweRuntimePath = installationArgs.installationDir; + let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); + let parsedSchema = false, parsedYaml = false; + if(readPaxYamlAndSchema.details.yaml){ + const yamlFromPax = this.parseExampleYamlFromPax(`${zoweRuntimePath}/example-zowe.yaml`, readPaxYamlAndSchema.details.yaml); + if(yamlFromPax){ + try { + yamlObj = parse(yamlFromPax); + if (currentConfig) { + // console.log("currentConfig: ", JSON.stringify(currentConfig)); + yamlObj = Object.assign({}, currentConfig, yamlObj); + } + if (installationArgs.installationDir) { + yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; + } + if (installationArgs.workspaceDir) { + yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; + } + if (installationArgs.logDir) { + yamlObj.zowe.logDirectory = installationArgs.logDir; + } + if (installationArgs.extensionDir) { + yamlObj.zowe.extensionDirectory = installationArgs.extensionDir; + } + if (installationArgs.rbacProfile) { + yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; + } + if (installationArgs.jobName) { + yamlObj.zowe.job.name = installationArgs.jobName; + } + if (installationArgs.jobPrefix) { + yamlObj.zowe.job.prefix = installationArgs.jobPrefix; + } + if (installationArgs.cookieId) { + yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; + } + if (installationArgs.javaHome) { + yamlObj.java.home = installationArgs.javaHome; + } + if (installationArgs.nodeHome) { + yamlObj.node.home = installationArgs.nodeHome; + } + if (installationArgs.zosmfHost) { + yamlObj.zOSMF.host = installationArgs.zosmfHost; + } + if (installationArgs.zosmfPort) { + yamlObj.zOSMF.port = installationArgs.zosmfPort; + } + if (installationArgs.zosmfApplId) { + yamlObj.zOSMF.applId = installationArgs.zosmfApplId; + } + // console.log('Setting merged yaml:', JSON.stringify(yamlObj)); + ConfigurationStore.setConfig(yamlObj); + ProgressStore.set('downloadUnpax.getExampleYaml', true); + parsedYaml = true; + } catch(e) { + console.log('error parsing example-zowe.yaml:', e); + ProgressStore.set('downloadUnpax.getExampleYaml', false); + return {status: false, details: {message: e.message}} + } + } else { + console.log("no yaml found from pax"); + ProgressStore.set('downloadUnpax.getExampleYaml', false); + return {status: false, details: {message: "no yaml found from pax"}} + } + + //No reason not to always set schema to latest if user is re-running installation + if(readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ + try { + let yamlSchema = JSON.parse(this.parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); + const serverCommon = JSON.parse(this.parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); + if(yamlSchema && serverCommon){ + yamlSchema.additionalProperties = true; + yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = serverCommon.$defs.datasetMember; + yamlSchema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverCommon.$defs.path; + if(yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items){ + delete yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; + yamlSchema.$defs.networkSettings.properties.server.properties.listenAddresses.items = serverCommon.$defs.ipv4 + } + // console.log('Setting schema from runtime dir:', JSON.stringify(yamlSchema)); + ConfigurationStore.setSchema(yamlSchema); + parsedSchema = true; + ProgressStore.set('downloadUnpax.getSchemas', true); + } + } catch (e) { + console.log('error setting schema from pax:', e); + ProgressStore.set('downloadUnpax.getSchemas', false); + return {status: false, details: {message: e.message}} + } + } + return {status: parsedSchema && parsedYaml, details: {message: "Successfully retrieved example-zowe.yaml and schemas", mergedYaml: yamlObj}} + } + } catch (e) { + return {status: false, details: e.message}; + } + + } + public async downloadUnpax ( connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, @@ -140,64 +307,17 @@ class Installation { let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); let parsedSchema = false, parsedYaml = false; if(readPaxYamlAndSchema.details.yaml){ - const parseExampleYamlFromPax = function(catPath: string){ - const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat ${catPath}\\r\\n`) - if(jobOutputSplit[1]){ - const trimmedYamlSchema = jobOutputSplit[1].split(`+ echo 'Script finished.'`)[0].split(`Script finished.`); - // console.log("\n\n *** trimmedYamlSchema[0]: ", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`)); - return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`); - } - return ""; - } - const yamlFromPax = parseExampleYamlFromPax(`${zoweRuntimePath}/example-zowe.yaml`); + const yamlFromPax = this.parseExampleYamlFromPax(`${zoweRuntimePath}/example-zowe.yaml`, readPaxYamlAndSchema.details.yaml); if(yamlFromPax){ try { yamlObj = parse(yamlFromPax); if (currentConfig) { // console.log("current config:", JSON.stringify(currentConfig)); // console.log("yamlObj: ", JSON.stringify(yamlObj)); - yamlObj = {...currentConfig, ...yamlObj} + yamlObj = yamlObj = Object.assign({}, yamlObj, currentConfig); // console.log("merged yamlObj: ", JSON.stringify(yamlObj)); } - if (yamlObj.zowe.runtimeDirectory === undefined && installationArgs.installationDir) { - yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; - } - if (yamlObj.zowe.workspaceDirectory === undefined && installationArgs.workspaceDir) { - yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; - } - if (yamlObj.zowe.logDirectory === undefined && installationArgs.logDir) { - yamlObj.zowe.logDirectory = installationArgs.logDir; - } - if (yamlObj.zowe.extensionDirectory === undefined && installationArgs.extensionDir) { - yamlObj.zowe.extensionDirectory = installationArgs.extensionDir; - } - if (yamlObj.zowe.rbacProfileIdentifier === undefined && installationArgs.rbacProfile) { - yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; - } - if (yamlObj.zowe.job.name === undefined && installationArgs.jobName) { - yamlObj.zowe.job.name = installationArgs.jobName; - } - if (yamlObj.zowe.job.prefix === undefined && installationArgs.jobPrefix) { - yamlObj.zowe.job.prefix = installationArgs.jobPrefix; - } - if (yamlObj.zowe.cookieIdentifier === undefined && installationArgs.cookieId) { - yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; - } - if (yamlObj.java.home === undefined && installationArgs.javaHome) { - yamlObj.java.home = installationArgs.javaHome; - } - if (yamlObj.node.home === undefined && installationArgs.nodeHome) { - yamlObj.node.home = installationArgs.nodeHome; - } - if (yamlObj.zOSMF.host === undefined && installationArgs.zosmfHost) { - yamlObj.zOSMF.host = installationArgs.zosmfHost; - } - if (yamlObj.zOSMF.port === undefined && installationArgs.zosmfPort) { - yamlObj.zOSMF.port = installationArgs.zosmfPort; - } - if (yamlObj.zOSMF.applId === undefined && installationArgs.zosmfApplId) { - yamlObj.zOSMF.applId = installationArgs.zosmfApplId; - } + this.mergeYamlAndInstallationArgs(yamlObj, installationArgs); if (zoweConfig) { yamlObj = {...yamlObj, ...zoweConfig}; } @@ -215,18 +335,9 @@ class Installation { //No reason not to always set schema to latest if user is re-running installation if(readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ - const parseSchemaFromPax = function(inputString: string, catPath: string){ - const jobOutputSplit = inputString.split(`cat ${catPath}\\r\\n`) - if(jobOutputSplit[1]){ - const trimmedYamlSchema = jobOutputSplit[1].split(`Script finished.`)[0].split(`Script finished.`); - // console.log("trimmed schema:", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`)) - return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`); - } - return ""; - } try { - let yamlSchema = JSON.parse(parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); - const serverCommon = JSON.parse(parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); + let yamlSchema = JSON.parse(this.parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); + const serverCommon = JSON.parse(this.parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); // console.log('yaml schema:', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); // console.log('server common', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); if(yamlSchema && serverCommon){ diff --git a/src/main/index.ts b/src/main/index.ts index 06e2367f..7e652d80 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -204,6 +204,11 @@ const createWindow = (): void => { return res; }); + ipcMain.handle('get-yaml-schema', async (event, connectionArgs, installationArgs) => { + const res = await installActions.smpeGetExampleYamlAndSchemas(connectionArgs, installationArgs); + return res; + }); + ipcMain.handle('init-certificates', async (event, connectionArgs, installationArgs, zoweConfig) => { const res = await installActions.runInitCertificates(connectionArgs, installationArgs, zoweConfig); return res; diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 34196e76..e6045d91 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -141,6 +141,8 @@ const Home = () => { window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { if(res != undefined){ dispatch(setInstallationArgs(res)); + } else { + dispatch(setInstallationArgs({...getInstallationArguments()})); } }) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 25b4e616..1daa6cce 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -19,7 +19,7 @@ import CheckCircle from '@mui/icons-material/CheckCircle'; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails } from "../../../services/StageDetails"; import { setDownloadUnpaxStatus } from './progress/progressSlice'; -import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationTypeStatus, getProgress, setDownloadUnpaxState } from "./progress/StageProgressStatus"; +import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationArguments, getInstallationTypeStatus, getProgress, setDownloadUnpaxState } from "./progress/StageProgressStatus"; import React from "react"; import ProgressCard from "../common/ProgressCard"; import { alertEmitter } from "../Header"; @@ -44,7 +44,7 @@ const Unpax = () => { const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); const version = useAppSelector(selectZoweVersion); - const [installationArgs, setInstArgs] = useState(useAppSelector(selectInstallationArgs)); + const [installationArgs, setInstArgs] = useState(getInstallationArguments()); let timer: any; useEffect(() => { @@ -60,7 +60,7 @@ const Unpax = () => { clearInterval(timer); } }) - }, 3000); + }, 3000) } return () => { clearInterval(timer); @@ -90,6 +90,29 @@ const Unpax = () => { }); } + const fetchExampleYaml = (event: any) => { + event.preventDefault(); + setShowProgress(true); + dispatch(setDownloadUnpaxStatus(false)); + setDownloadUnpaxProgress(downloadUnpaxStatus); + dispatch(setNextStepEnabled(false)); + window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + if(!res.status){ //errors during runInstallation() + alertEmitter.emit('showAlert', res.details.message ? res.details.message : res.details, 'error'); + } + if(res.details?.mergedYaml != undefined){ + dispatch(setYaml(res.details.mergedYaml)); + window.electron.ipcRenderer.setConfig(res.details.mergedYaml); + } + dispatch(setNextStepEnabled(res.status)); + dispatch(setDownloadUnpaxStatus(res.status)); + clearInterval(timer); + }).catch(() => { + clearInterval(timer); + dispatch(setNextStepEnabled(false)); + }); + } + useEffect(() => { window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { if(res != undefined){ @@ -101,8 +124,8 @@ const Unpax = () => { nextPosition = document.getElementById('download-progress-card'); nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); } - dispatch(setNextStepEnabled(getProgress('downloadUnpaxStatus') || installValue === "smpe")); - dispatch(setDownloadUnpaxStatus(getProgress('downloadUnpaxStatus') || installValue === "smpe")); + dispatch(setNextStepEnabled(getProgress('downloadUnpaxStatus'))); + dispatch(setDownloadUnpaxStatus(getProgress('downloadUnpaxStatus'))); return () => { dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: 0 })); } @@ -111,8 +134,22 @@ const Unpax = () => { return (<> {installValue === "smpe" && - {`The SMP/E process has already downloaded the required Zowe runtime files. Please click skip or continue.`} + {`The SMP/E process has already downloaded the required Zowe runtime files. Zen will now retrieve the example-zowe.yaml and schemas for the yaml. Skip this step if you have already fetched these files.`} + {!showProgress && + + } + {showProgress && + + + + + + } } {installValue === "download" && diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index b68a326d..8408f6e9 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -104,6 +104,9 @@ contextBridge.exposeInMainWorld('electron', { downloadButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string, javaHome: string, nodeHome: string, installationType: string, userUploadedPaxPath: string}, version: string, zoweConfig: any) { return ipcRenderer.invoke("download-unpax", connectionArgs, installationArgs, version, zoweConfig); }, + fetchExampleYamlBtnOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + return ipcRenderer.invoke("get-yaml-schema", connectionArgs, installationArgs); + }, initCertsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { return ipcRenderer.invoke("init-certificates", connectionArgs, installationArgs, zoweConfig); }, From cb793791b34dd2e0d613c9b1af28badfbac51cf2 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 01:04:09 -0400 Subject: [PATCH 133/455] Always use installation args Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 69 ++++++++---------------------- 1 file changed, 17 insertions(+), 52 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 4f1316b7..1c5df7a5 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -18,6 +18,7 @@ import { ProgressStore } from "../storage/ProgressStore"; import * as fs from 'fs'; import { ConfigurationStore } from '../storage/ConfigurationStore'; import { InstallationArgs } from '../types/stateInterfaces'; +import { FALLBACK_SCHEMA } from '../renderer/components/common/Constants'; function removeRuntimeFromPath(path: string) { @@ -77,43 +78,43 @@ class Installation { } mergeYamlAndInstallationArgs = function(yamlObj: any, installationArgs: InstallationArgs){ - if (yamlObj.zowe.runtimeDirectory === undefined && installationArgs.installationDir) { + if (installationArgs.installationDir) { yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; } - if (yamlObj.zowe.workspaceDirectory === undefined && installationArgs.workspaceDir) { + if (installationArgs.workspaceDir) { yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; } - if (yamlObj.zowe.logDirectory === undefined && installationArgs.logDir) { + if (installationArgs.logDir) { yamlObj.zowe.logDirectory = installationArgs.logDir; } - if (yamlObj.zowe.extensionDirectory === undefined && installationArgs.extensionDir) { + if (installationArgs.extensionDir) { yamlObj.zowe.extensionDirectory = installationArgs.extensionDir; } - if (yamlObj.zowe.rbacProfileIdentifier === undefined && installationArgs.rbacProfile) { + if (installationArgs.rbacProfile) { yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; } - if (yamlObj.zowe.job.name === undefined && installationArgs.jobName) { + if (installationArgs.jobName) { yamlObj.zowe.job.name = installationArgs.jobName; } - if (yamlObj.zowe.job.prefix === undefined && installationArgs.jobPrefix) { + if (installationArgs.jobPrefix) { yamlObj.zowe.job.prefix = installationArgs.jobPrefix; } - if (yamlObj.zowe.cookieIdentifier === undefined && installationArgs.cookieId) { + if (installationArgs.cookieId) { yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; } - if (yamlObj.java.home === undefined && installationArgs.javaHome) { + if (installationArgs.javaHome) { yamlObj.java.home = installationArgs.javaHome; } - if (yamlObj.node.home === undefined && installationArgs.nodeHome) { + if (installationArgs.nodeHome) { yamlObj.node.home = installationArgs.nodeHome; } - if (yamlObj.zOSMF.host === undefined && installationArgs.zosmfHost) { + if (installationArgs.zosmfHost) { yamlObj.zOSMF.host = installationArgs.zosmfHost; } - if (yamlObj.zOSMF.port === undefined && installationArgs.zosmfPort) { + if (installationArgs.zosmfPort) { yamlObj.zOSMF.port = installationArgs.zosmfPort; } - if (yamlObj.zOSMF.applId === undefined && installationArgs.zosmfApplId) { + if (installationArgs.zosmfApplId) { yamlObj.zOSMF.applId = installationArgs.zosmfApplId; } } @@ -137,45 +138,7 @@ class Installation { // console.log("currentConfig: ", JSON.stringify(currentConfig)); yamlObj = Object.assign({}, currentConfig, yamlObj); } - if (installationArgs.installationDir) { - yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; - } - if (installationArgs.workspaceDir) { - yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; - } - if (installationArgs.logDir) { - yamlObj.zowe.logDirectory = installationArgs.logDir; - } - if (installationArgs.extensionDir) { - yamlObj.zowe.extensionDirectory = installationArgs.extensionDir; - } - if (installationArgs.rbacProfile) { - yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; - } - if (installationArgs.jobName) { - yamlObj.zowe.job.name = installationArgs.jobName; - } - if (installationArgs.jobPrefix) { - yamlObj.zowe.job.prefix = installationArgs.jobPrefix; - } - if (installationArgs.cookieId) { - yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; - } - if (installationArgs.javaHome) { - yamlObj.java.home = installationArgs.javaHome; - } - if (installationArgs.nodeHome) { - yamlObj.node.home = installationArgs.nodeHome; - } - if (installationArgs.zosmfHost) { - yamlObj.zOSMF.host = installationArgs.zosmfHost; - } - if (installationArgs.zosmfPort) { - yamlObj.zOSMF.port = installationArgs.zosmfPort; - } - if (installationArgs.zosmfApplId) { - yamlObj.zOSMF.applId = installationArgs.zosmfApplId; - } + this.mergeYamlAndInstallationArgs(yamlObj, installationArgs); // console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); ProgressStore.set('downloadUnpax.getExampleYaml', true); @@ -212,12 +175,14 @@ class Installation { } catch (e) { console.log('error setting schema from pax:', e); ProgressStore.set('downloadUnpax.getSchemas', false); + ConfigurationStore.setSchema(FALLBACK_SCHEMA); return {status: false, details: {message: e.message}} } } return {status: parsedSchema && parsedYaml, details: {message: "Successfully retrieved example-zowe.yaml and schemas", mergedYaml: yamlObj}} } } catch (e) { + ConfigurationStore.setSchema(FALLBACK_SCHEMA); return {status: false, details: e.message}; } From a5a0e247435a7ce720b039468edc2c2c395264c2 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 02:52:18 -0400 Subject: [PATCH 134/455] Rewrite all of pattern properties so port input doesnt jump to end lol Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Networking.tsx | 147 ++++++++---------- 1 file changed, 65 insertions(+), 82 deletions(-) diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 08d1d057..ab28c12c 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -547,15 +547,14 @@ const Networking = () => { const dispatch = useAppDispatch(); const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const [isFormInit, setIsFormInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); const [isFormValid, setIsFormValid] = useState(false); const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); const [installationArgs, setInstArgs] = useState(getInstallationArguments()); - const [elements, setElements] = useState([]); const connectionArgs = useAppSelector(selectConnectionArgs); const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); + const [LOOP_LIMIT] = useState(1024); // useEffect(() => { @@ -573,7 +572,6 @@ const Networking = () => { dispatch(setInitializationStatus(isInitComplete())); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = false; stages[STAGE_ID].isSkipped = isInitializationSkipped; - setIsFormInit(true); return () => { dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); @@ -612,84 +610,6 @@ const Networking = () => { setLYaml(data); } - useEffect(() => { - if(yaml){ - const keys = Object.keys(schema.properties); - - //note on this nested for loop: it will only run on keys that have "patternProperties" as a child so it shouldnt be expensive - let newElements = []; - const LOOP_LIMIT = 1024; - for (let i = 0; i < keys.length && i < LOOP_LIMIT; i++) { //i = go through each property of the yaml - if (schema.properties[keys[i]].patternProperties != undefined) { //only for rendering patternProperties - if(typeof yaml[keys[i]] === "object" && Object.keys(yaml[keys[i]]).length > 0) { - newElements.push(

{keys[i]}

); - const patterns = Object.keys(schema.properties[keys[i]].patternProperties); //get all user defined regex patterns - for(let j = 0; j < patterns.length && j < LOOP_LIMIT; j++){ //j = go through each pattern - const pattern = new RegExp(patterns[j]); - const yamlValue = yaml[keys[i]]; - if(yamlValue){ - const toMatch = Object.keys(yamlValue); - for(let k = 0; k < toMatch.length && k < LOOP_LIMIT; k++){ - if(pattern.test(toMatch[k])){ - // console.log('matched pattern ' + pattern + ' to ' + toMatch[k] + ' for key' + keys[i]); - const matchedProps = Object.keys(yamlValue[toMatch[k]]); - if(matchedProps.length > 0) { - newElements.push({toMatch[k]}) - newElements.push(
); - // console.log('matchedProps:', matchedProps); - for(let l = 0; l < matchedProps.length && l < LOOP_LIMIT; l++){ - // pattern = patterns[j] = current regex pattern from patternProperties - // keys[i] = parent object that contains pattern properties (likely components or haInstances) - // toMatch[k] = regex matched child of keys[i], likely a component name such as app-server, gateway, etc - // matchedProps[l] = properties of toMatch[k] - switch (typeof yamlValue[toMatch[k]][matchedProps[l]]){ - case 'boolean': - newElements.push( { - // console.log('new yaml:', JSON.stringify({...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}})); - const newYaml = {...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}}; - setLYaml(newYaml); - await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, !yaml[keys[i]][toMatch[k]][matchedProps[l]]) - dispatch(setYaml(newYaml)); - }}/>} - />) - newElements.push(
); - break; - case 'number': - newElements.push( { - if(!Number.isNaN(Number(e.target.value))){ - const newYaml = {...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: Number(e.target.value)}}}; - setLYaml(newYaml); - await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, Number(e.target.value)) - dispatch(setYaml(newYaml)); - } - }} - />) - default: - break; - } - } - newElements.push(
); - } - } - } - } - } - } - } - } - setElements(newElements); - } - }, [yaml]) - const onSaveYaml = (e: any) => { e.preventDefault(); alertEmitter.emit('showAlert', 'Uploading yaml...', 'info'); @@ -763,7 +683,70 @@ const Networking = () => { }} />
- {elements} + {Object.keys(schema.properties).map((schemaKey, index) => { + if(index < LOOP_LIMIT){ + if (schema.properties[schemaKey].patternProperties != undefined) { //only for rendering patternProperties + if(typeof yaml[schemaKey] === "object" && Object.keys(yaml[schemaKey]).length > 0) { + return
+

{schemaKey}

+ {Object.keys(schema.properties[schemaKey].patternProperties).map((regexPattern, rIndex) => { + const pattern = new RegExp(regexPattern); + if(rIndex < LOOP_LIMIT && yaml[schemaKey]) { + return Object.keys(yaml[schemaKey]).map((matchedPattern, mIndex) => { + if(mIndex < LOOP_LIMIT && pattern.test(matchedPattern)){ + return
+ + {matchedPattern} +
+
+ {Object.keys(yaml[schemaKey][matchedPattern]).map((schemaProperty, sIndex) => { + + if(sIndex < LOOP_LIMIT && schemaProperty.length > 0){ + return
+ + {typeof yaml[schemaKey][matchedPattern][schemaProperty] === "boolean" && { + // console.log('new yaml:', JSON.stringify({...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}})); + const newYaml = {...yaml, [schemaKey]: {...yaml[schemaKey], [matchedPattern]: {...yaml[schemaKey][matchedPattern], [schemaProperty]: !yaml[schemaKey][matchedPattern][schemaProperty]}}}; + setLYaml(newYaml); + await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${schemaKey}.${matchedPattern}.${schemaProperty}`, !yaml[schemaKey][matchedPattern][schemaProperty]) + dispatch(setYaml(newYaml)); + }}/>} + />} + {typeof yaml[schemaKey][matchedPattern][schemaProperty] === "number" && { + if(!Number.isNaN(Number(e.target.value))){ + const newYaml = {...yaml, [schemaKey]: {...yaml[schemaKey], [matchedPattern]: {...yaml[schemaKey][matchedPattern], [schemaProperty]: Number(e.target.value)}}}; + setLYaml(newYaml); + await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${schemaKey}.${matchedPattern}.${schemaProperty}`, Number(e.target.value)) + dispatch(setYaml(newYaml)); + } + }} + />} +
+ } + return null; + })}
+ } + return null; + }) + } + return null; + }) + } +
+ } + } + } + return null; + })}
From a9890239e852e05a2a4016be3c01944280d903e0 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 10:03:47 -0400 Subject: [PATCH 135/455] Fix next button: Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 342d4689..4c8e0b19 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -273,6 +273,7 @@ const Installation = () => { } else { updateProgress(res.status); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; + setNextStepEnabled(true); clearInterval(timer); } }).catch((err: any) => { From eeec11ad6c749dda6539e9b9730ec85121d5c516 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 17:33:33 -0400 Subject: [PATCH 136/455] Dont extract files to installationDir/runtime, just extact to installationDir Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 50 ++++++++++-------------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 1c5df7a5..384e8c2a 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -20,15 +20,6 @@ import { ConfigurationStore } from '../storage/ConfigurationStore'; import { InstallationArgs } from '../types/stateInterfaces'; import { FALLBACK_SCHEMA } from '../renderer/components/common/Constants'; -function removeRuntimeFromPath(path: string) -{ - var the_arr = path.split('/'); - if(the_arr[the_arr.length - 1].toLowerCase() === 'runtime'){ - the_arr.pop(); - } - return( the_arr.join('/') ); -} - class Installation { public async uploadLatestYaml ( @@ -36,7 +27,6 @@ class Installation { installationArgs: InstallationArgs, ): Promise { const currentConfig: any = ConfigurationStore.getConfig(); - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; const savingResult = await this.generateYamlFile(currentConfig); if (!savingResult.status) { console.log("failed to save yaml"); @@ -45,7 +35,7 @@ class Installation { try { console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs,installationArgs.installationDir); ProgressStore.set('downloadUnpax.uploadYaml', uploadYaml.status); if(!uploadYaml.status){ @@ -268,7 +258,7 @@ class Installation { } } let yamlObj - let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; + let zoweRuntimePath = installationArgs.installationDir; let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); let parsedSchema = false, parsedYaml = false; if(readPaxYamlAndSchema.details.yaml){ @@ -340,7 +330,6 @@ class Installation { zoweConfig: any, ): Promise { const currentConfig: any = ConfigurationStore.getConfig(); - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; const savingResult = await this.generateYamlFile(zoweConfig); if (!savingResult.status) { console.log("failed to save yaml"); @@ -349,7 +338,7 @@ class Installation { try { console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); ProgressStore.set('installation.uploadYaml', uploadYaml.status); if(!uploadYaml.status){ @@ -393,7 +382,6 @@ class Installation { public async runApfAuth(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: object): Promise{ - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') await fs.writeFile(filePath, stringify(zoweConfig), (err) => { @@ -404,7 +392,7 @@ class Installation { }); ProgressStore.set('apfAuth.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs,installationArgs.installationDir); if(!uploadYaml.status){ ProgressStore.set('apfAuth.uploadYaml', false); return {status: false, details: 'Failed to upload YAML file'} @@ -412,7 +400,7 @@ class Installation { } ProgressStore.set('apfAuth.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${SMPE_INSTALL ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init apfauth -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationDir};./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('apfAuth.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} @@ -420,7 +408,6 @@ class Installation { public async runInitSecurity(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: object): Promise{ - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') await fs.writeFile(filePath, stringify(zoweConfig), (err) => { @@ -432,13 +419,13 @@ class Installation { }); ProgressStore.set('initSecurity.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); if(!uploadYaml.status){ return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } ProgressStore.set('initSecurity.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${SMPE_INSTALL ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init security -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationDir};./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('initSecurity.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} @@ -451,7 +438,6 @@ class Installation { ProgressStore.set('initStcs.writeYaml', false); ProgressStore.set('initStcs.uploadYaml', false); ProgressStore.set('initStcs.success', false); - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') @@ -464,12 +450,12 @@ class Installation { }); ProgressStore.set('initStcs.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); if(!uploadYaml.status){ return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } ProgressStore.set('initStcs.uploadYaml', uploadYaml.status); - const script = `cd ${SMPE_INSTALL ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init stc -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) :installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationDir + '/bin'};./zwe init stc -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); let errorFound = false; let errorMessage = ''; @@ -489,7 +475,6 @@ class Installation { } async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: any){ - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') await fs.writeFile(filePath, stringify(zoweConfig), (err: any) => { @@ -500,13 +485,13 @@ class Installation { }); ProgressStore.set('certificate.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); if(!uploadYaml.status){ return ProgressStore.set('certificate.uploadYaml', false);; } ProgressStore.set('certificate.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${SMPE_INSTALL ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init certificate --update-config -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) :installationArgs.installationDir}/zowe.yaml`; + const script = `cd ${installationArgs.installationDir + '/bin'};./zwe init certificate --update-config -c ${installationArgs.installationDir}/zowe.yaml`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} @@ -514,7 +499,6 @@ class Installation { public async initVsam(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: object): Promise{ - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; // Initialize Progress Store For Vsam ProgressStore.set('initVsam.writeYaml', false); ProgressStore.set('initVsam.uploadYaml', false); @@ -531,12 +515,12 @@ class Installation { }); ProgressStore.set('initVsam.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); if(!uploadYaml.status){ return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } ProgressStore.set('initVsam.uploadYaml', uploadYaml.status); - const script = `cd ${SMPE_INSTALL ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init vsam -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) :installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationDir + '/bin'};./zwe init vsam -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); let errorFound = false; @@ -635,21 +619,19 @@ export class FTPInstallation extends Installation { // TODO: Is this necessary adding "/runtime" ? User already specifies /runtime directory - removes 8 chars from max limit. See Planning.tsx async unpax(connectionArgs: IIpcConnectionArgs, installDir: string) { - const script = `mkdir ${installDir}/runtime;cd ${installDir}/runtime && pax -ppx -rf ../zowe.pax;rm -rf ../zowe.pax`; + const script = `mkdir ${installDir};cd ${installDir} && pax -ppx -rf ../zowe.pax;rm -rf ../zowe.pax`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } async install(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; - const script = `cd ${SMPE_INSTALL ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'}; ./zwe install -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir}/zowe.yaml --allow-overwritten`; + const script = `cd ${installationArgs.installationDir + '/bin' }; ./zwe install -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } async initMVS(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; - const script = `cd ${SMPE_INSTALL ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'}; ./zwe init mvs -c ${SMPE_INSTALL ? removeRuntimeFromPath(installationArgs.installationDir) : installationArgs.installationDir}/zowe.yaml --allow-overwritten`; + const script = `cd ${installationArgs.installationDir }; ./zwe init mvs -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } From 9b599a00ea495ac18aaae255a39a97e249a3e0c5 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 18:16:27 -0400 Subject: [PATCH 137/455] fix wrong dir for unpax Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 384e8c2a..5f72e8d5 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -619,7 +619,7 @@ export class FTPInstallation extends Installation { // TODO: Is this necessary adding "/runtime" ? User already specifies /runtime directory - removes 8 chars from max limit. See Planning.tsx async unpax(connectionArgs: IIpcConnectionArgs, installDir: string) { - const script = `mkdir ${installDir};cd ${installDir} && pax -ppx -rf ../zowe.pax;rm -rf ../zowe.pax`; + const script = `mkdir ${installDir};cd ${installDir} && pax -ppx -rf ../zowe.pax;rm -rf ./zowe.pax`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } From 772d9227d246dcc6d4e0f5033d0697544f394ed1 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 18:31:01 -0400 Subject: [PATCH 138/455] fix unpax relative path again lol Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 5f72e8d5..b21a9260 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -619,7 +619,7 @@ export class FTPInstallation extends Installation { // TODO: Is this necessary adding "/runtime" ? User already specifies /runtime directory - removes 8 chars from max limit. See Planning.tsx async unpax(connectionArgs: IIpcConnectionArgs, installDir: string) { - const script = `mkdir ${installDir};cd ${installDir} && pax -ppx -rf ../zowe.pax;rm -rf ./zowe.pax`; + const script = `mkdir ${installDir};cd ${installDir} && pax -ppx -rf ./zowe.pax;rm -rf ./zowe.pax`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } From 1ce019b380c83e127f53253c2a044bcf29346889 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 19:02:08 -0400 Subject: [PATCH 139/455] add missing bin part of dir Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index b21a9260..153faa6c 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -400,7 +400,7 @@ class Installation { } ProgressStore.set('apfAuth.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${installationArgs.installationDir};./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationDir}/bin;./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('apfAuth.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} @@ -425,7 +425,7 @@ class Installation { } ProgressStore.set('initSecurity.uploadYaml', uploadYaml.status); console.log("Check out this install arg! " + installationArgs.installationDir); - const script = `cd ${installationArgs.installationDir};./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationDir}/bin;./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('initSecurity.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} @@ -631,7 +631,7 @@ export class FTPInstallation extends Installation { } async initMVS(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { - const script = `cd ${installationArgs.installationDir }; ./zwe init mvs -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten`; + const script = `cd ${installationArgs.installationDir + '/bin' }; ./zwe init mvs -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } From c284b1d3a023f19cc2e58117a82644364487503e Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 19:17:38 -0400 Subject: [PATCH 140/455] Dont change schema id Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 153faa6c..3a8cd5c5 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -300,7 +300,6 @@ class Installation { // Without these, AJV does not properly find $refs in the schema and therefore validation cannot occur yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = serverCommon.$defs.datasetMember; yamlSchema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverCommon.$defs.path; - yamlSchema.$id = serverCommon.$id; if(yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items){ delete yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; yamlSchema.$defs.networkSettings.properties.server.properties.listenAddresses.items = serverCommon.$defs.ipv4 From fb287ea12a3bd635f0f8024820200fa4cf575be7 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 19:17:52 -0400 Subject: [PATCH 141/455] Remove unused var Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/InitApfAuth.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 9a5c195e..b9e4fe99 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -54,8 +54,6 @@ const InitApfAuth = () => { const [installationArgs] = useState(getInstallationArguments()); let timer: any; - - const [datasetSchema] = useState(schema.properties.zowe.properties.setup.properties.dataset); const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); useEffect(() => { From 9f8917e77f3e282a58d5c489be6a857cd73e00ef Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 19:36:29 -0400 Subject: [PATCH 142/455] set additional properties true because schema seems to need updating Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 3a8cd5c5..84f359f9 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -298,6 +298,7 @@ class Installation { if(yamlSchema && serverCommon){ // FIXME: Link schema by $ref properly - https://jsonforms.io/docs/ref-resolving // Without these, AJV does not properly find $refs in the schema and therefore validation cannot occur + yamlSchema.additionalProperties = true; yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = serverCommon.$defs.datasetMember; yamlSchema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverCommon.$defs.path; if(yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items){ From 78f4cef317e052041b62929b25ca17aa35fb6300 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 19:36:46 -0400 Subject: [PATCH 143/455] Fix externaldomains non existent Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Networking.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index ab28c12c..06379c7b 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -639,7 +639,7 @@ const Networking = () => { dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
}

External Domains { - let domains = [...yaml.zowe?.externalDomains, ""]; + let domains = [...yaml.zowe?.externalDomains || [], ""]; const newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: domains}}; window.electron.ipcRenderer.setConfig(newYaml ) dispatch(setYaml(newYaml)) From 48b0dcd6be8bf47706d11377b04ad3b9cc3b7f93 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 19:52:28 -0400 Subject: [PATCH 144/455] Fix scrolling on apf auth Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/InitApfAuth.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index b9e4fe99..26e309a4 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -62,6 +62,9 @@ const InitApfAuth = () => { if(getProgress('apfAuthStatus')) { nextPosition = document.getElementById('start-apf-progress'); nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } else { + nextPosition = document.getElementById('container-box-id'); + nextPosition?.scrollIntoView({behavior: 'smooth'}); } updateProgress(getProgress('apfAuthStatus')); From e35e98baf86f3771cb6d0dd021292d231f4fe15d Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 19:53:39 -0400 Subject: [PATCH 145/455] Fix vsam page not updating yaml Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Vsam.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index abc8ec6a..3a296927 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -233,6 +233,7 @@ const Vsam = () => { } }; setLYaml(updatedYaml); + window.electron.setConfig(updatedYaml); dispatch(setYaml(updatedYaml)); } @@ -253,6 +254,7 @@ const Vsam = () => { } } }; + window.electron.setConfig(updatedYaml); setLYaml(updatedYaml); dispatch(setYaml(updatedYaml)); }; From b4ce1e183c4b7694a880fae3984ae048038d7299 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 20:05:03 -0400 Subject: [PATCH 146/455] Retrieve example-yaml and schemas when skipping unpax if runtime files already exist Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Stepper.tsx | 32 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index d3402ccd..8eed9833 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -18,8 +18,8 @@ import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import { Link } from 'react-router-dom'; import { selectConnectionStatus } from '../stages/progress/progressSlice'; -import { useAppSelector } from '../../hooks'; -import { selectNextStepEnabled } from '../configuration-wizard/wizardSlice'; +import { useAppDispatch, useAppSelector } from '../../hooks'; +import { selectNextStepEnabled, setLoading, setYaml } from '../configuration-wizard/wizardSlice'; import { selectActiveStepIndex, selectActiveSubStepIndex } from '../stages/progress/activeStepSlice'; import { alertEmitter } from '../Header'; import EditorDialog from "./EditorDialog"; @@ -27,12 +27,14 @@ import savedInstall from '../../assets/saved-install-green.png'; import eventDispatcher from '../../../services/eventDispatcher'; import Warning from '@mui/icons-material/Warning'; import CheckCircle from '@mui/icons-material/CheckCircle'; -import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, INIT_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL } from '../common/Constants'; -import { getProgress, getCompleteProgress, mapAndSetSkipStatus, mapAndGetSkipStatus } from '../stages/progress/StageProgressStatus'; +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, INIT_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, UNPAX_STAGE_LABEL } from '../common/Constants'; +import { getProgress, getCompleteProgress, mapAndSetSkipStatus, mapAndGetSkipStatus, getInstallationArguments } from '../stages/progress/StageProgressStatus'; import '../../styles/Stepper.css'; import { StepIcon } from '@mui/material'; import { getStageDetails } from '../../../services/StageDetails'; +import { IResponse } from '../../../types/interfaces'; +import { selectConnectionArgs } from '../stages/connection/connectionSlice'; // TODO: define props, stages, stage interfaces // TODO: One rule in the store to enable/disable button @@ -72,6 +74,9 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const [contentType, setContentType] = useState('output'); const [editorVisible, setEditorVisible] = useState(false); const [editorContent, setEditorContent] = useState(''); + const [installationArgs] = useState(getInstallationArguments()); + const connectionArgs = useAppSelector(selectConnectionArgs); + const dispatch = useAppDispatch(); useEffect(() => { const mvsCompleteListener = (completed: boolean) => { @@ -121,12 +126,29 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages toggleEditorVisibility(TYPE_OUTPUT); }; - const handleSkip = () => { + const handleSkip = async () => { stages[activeStep].isSkipped = true; if(stages[activeStep].subStages){ stages[activeStep].subStages[activeSubStep].isSkipped = true; mapAndSetSkipStatus(activeSubStep, true); } + if(stages[activeStep].label === UNPAX_STAGE_LABEL && installationArgs.installationType == "download"){ + alertEmitter.emit('showAlert', 'Retrieving example-zowe.yaml and latest schemas from Zowe runtime files...', 'info'); + dispatch(setLoading(true)); + await window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + if(!res.status){ //errors during runInstallation() + alertEmitter.emit('showAlert', res.details.message ? res.details.message : res.details, 'error'); + } + if(res.details?.mergedYaml != undefined){ + dispatch(setYaml(res.details.mergedYaml)); + window.electron.ipcRenderer.setConfig(res.details.mergedYaml); + alertEmitter.emit('showAlert', "Successfully fetched example-zowe.yaml and latest schemas", 'success'); + } + }).catch((e: any) => { + alertEmitter.emit('showAlert', e.message, 'error'); + }); + } + dispatch(setLoading(false)); handleNext(); } From 5553ebbca1325901977306d39b924c5b104cddce Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 20:08:51 -0400 Subject: [PATCH 147/455] Fix typo Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 84f359f9..63f74d8e 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -269,7 +269,7 @@ class Installation { if (currentConfig) { // console.log("current config:", JSON.stringify(currentConfig)); // console.log("yamlObj: ", JSON.stringify(yamlObj)); - yamlObj = yamlObj = Object.assign({}, yamlObj, currentConfig); + yamlObj = Object.assign({}, yamlObj, currentConfig); // console.log("merged yamlObj: ", JSON.stringify(yamlObj)); } this.mergeYamlAndInstallationArgs(yamlObj, installationArgs); From b44f47befd2f2f738325eb7a78de08651ae70e9c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 20:15:38 -0400 Subject: [PATCH 148/455] Implement sergei's file downloading method for fetching example-zowe.yaml and schemas Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 50 ++++++++++-------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 63f74d8e..e2125804 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -47,26 +47,6 @@ class Installation { } } - parseExampleYamlFromPax = function(catPath: string, yaml: any){ - const jobOutputSplit = JSON.stringify(yaml).split(`cat ${catPath}\\r\\n`) - if(jobOutputSplit[1]){ - const trimmedYamlSchema = jobOutputSplit[1].split(`+ echo 'Script finished.'`)[0].split(`Script finished.`); - // console.log("\n\n *** trimmedYamlSchema[0]: ", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`)); - return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`); - } - return ""; - } - - parseSchemaFromPax = function(inputString: string, catPath: string){ - const jobOutputSplit = inputString.split(`cat ${catPath}\\r\\n`) - if(jobOutputSplit[1]){ - const trimmedYamlSchema = jobOutputSplit[1].split(`Script finished.`)[0].split(`Script finished.`); - // console.log("trimmed schema:", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`)) - return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`); - } - return ""; - } - mergeYamlAndInstallationArgs = function(yamlObj: any, installationArgs: InstallationArgs){ if (installationArgs.installationDir) { yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; @@ -120,7 +100,7 @@ class Installation { let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); let parsedSchema = false, parsedYaml = false; if(readPaxYamlAndSchema.details.yaml){ - const yamlFromPax = this.parseExampleYamlFromPax(`${zoweRuntimePath}/example-zowe.yaml`, readPaxYamlAndSchema.details.yaml); + const yamlFromPax = readPaxYamlAndSchema.details.yaml; if(yamlFromPax){ try { yamlObj = parse(yamlFromPax); @@ -147,8 +127,8 @@ class Installation { //No reason not to always set schema to latest if user is re-running installation if(readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ try { - let yamlSchema = JSON.parse(this.parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); - const serverCommon = JSON.parse(this.parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); + let yamlSchema = JSON.parse(readPaxYamlAndSchema.details.yamlSchema); + const serverCommon = JSON.parse(readPaxYamlAndSchema.details.serverCommon); if(yamlSchema && serverCommon){ yamlSchema.additionalProperties = true; yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = serverCommon.$defs.datasetMember; @@ -262,7 +242,7 @@ class Installation { let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); let parsedSchema = false, parsedYaml = false; if(readPaxYamlAndSchema.details.yaml){ - const yamlFromPax = this.parseExampleYamlFromPax(`${zoweRuntimePath}/example-zowe.yaml`, readPaxYamlAndSchema.details.yaml); + const yamlFromPax = readPaxYamlAndSchema.details.yaml; if(yamlFromPax){ try { yamlObj = parse(yamlFromPax); @@ -291,8 +271,8 @@ class Installation { //No reason not to always set schema to latest if user is re-running installation if(readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ try { - let yamlSchema = JSON.parse(this.parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); - const serverCommon = JSON.parse(this.parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); + let yamlSchema = JSON.parse(readPaxYamlAndSchema.details.yamlSchema); + const serverCommon = JSON.parse(readPaxYamlAndSchema.details.serverCommon); // console.log('yaml schema:', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); // console.log('server common', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); if(yamlSchema && serverCommon){ @@ -637,13 +617,17 @@ export class FTPInstallation extends Installation { } async readExampleYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string){ - const catYaml = `cat ${installDir}/example-zowe.yaml`; - const yamlResult = await new Script().run(connectionArgs, catYaml); - const catYamlSchema = `cat ${installDir}/schemas/zowe-yaml-schema.json`; - const yamlSchemaResult = await new Script().run(connectionArgs, catYamlSchema); - const catCommonSchema = `cat ${installDir}/schemas/server-common.json`; - const commonSchemaResult = await new Script().run(connectionArgs, catCommonSchema); - return {status: yamlResult.rc === 0 && yamlSchemaResult.rc == 0 && commonSchemaResult.rc == 0, details: {yaml: yamlResult.jobOutput, yamlSchema: yamlSchemaResult.jobOutput, serverCommon: commonSchemaResult.jobOutput}} + try { + const yamlPath = `${installDir}/example-zowe.yaml`; + const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); + const yamlSchemaPath = `${installDir}/schemas/zowe-yaml-schema.json`; + const yamlSchema = await new FileTransfer().download(connectionArgs, yamlSchemaPath, DataType.ASCII); + const serverCommonPath = `${installDir}/schemas/server-common.json`; + const serverCommon = await new FileTransfer().download(connectionArgs, serverCommonPath, DataType.ASCII); + return {status: true, details: {yaml, yamlSchema, serverCommon}}; + } catch { + return {status: false, details: {yaml: '', yamlSchema: '', serverCommon: ''}} + } } async checkInstallData() { From ab09e8a48ac26ba0a2b31cf5902247d67d27672c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 21:18:43 -0400 Subject: [PATCH 149/455] Each stage will only compile its own part of the schema with ajv. Fix order of operations for object.assign call when merging example-zowe.yaml Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 20 ++++++++++++++----- .../components/common/EditorDialog.tsx | 1 + src/renderer/components/common/Stepper.tsx | 3 +++ .../components/stages/Certificates.tsx | 3 +-- src/renderer/components/stages/Security.tsx | 2 +- src/renderer/components/stages/Stcs.tsx | 4 +--- src/renderer/components/stages/Vsam.tsx | 2 +- .../stages/installation/Installation.tsx | 2 +- 8 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index e2125804..25d4724a 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -20,6 +20,16 @@ import { ConfigurationStore } from '../storage/ConfigurationStore'; import { InstallationArgs } from '../types/stateInterfaces'; import { FALLBACK_SCHEMA } from '../renderer/components/common/Constants'; + +//AJV did not like the regex in our current schema +const zoweDatasetMemberRegexFixed = { + "description": "PARMLIB member used by ZIS", + "type": "string", + "pattern": "^([A-Z$#@]){1}([A-Z0-9$#@]){0,7}$", + "minLength": 1, + "maxLength": 8 +} + class Installation { public async uploadLatestYaml ( @@ -105,11 +115,11 @@ class Installation { try { yamlObj = parse(yamlFromPax); if (currentConfig) { - // console.log("currentConfig: ", JSON.stringify(currentConfig)); - yamlObj = Object.assign({}, currentConfig, yamlObj); + console.log("currentConfig: ", JSON.stringify(currentConfig)); + yamlObj = Object.assign({}, yamlObj, currentConfig); } this.mergeYamlAndInstallationArgs(yamlObj, installationArgs); - // console.log('Setting merged yaml:', JSON.stringify(yamlObj)); + console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); ProgressStore.set('downloadUnpax.getExampleYaml', true); parsedYaml = true; @@ -131,7 +141,7 @@ class Installation { const serverCommon = JSON.parse(readPaxYamlAndSchema.details.serverCommon); if(yamlSchema && serverCommon){ yamlSchema.additionalProperties = true; - yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = serverCommon.$defs.datasetMember; + yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = zoweDatasetMemberRegexFixed; yamlSchema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverCommon.$defs.path; if(yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items){ delete yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; @@ -279,7 +289,7 @@ class Installation { // FIXME: Link schema by $ref properly - https://jsonforms.io/docs/ref-resolving // Without these, AJV does not properly find $refs in the schema and therefore validation cannot occur yamlSchema.additionalProperties = true; - yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = serverCommon.$defs.datasetMember; + yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = zoweDatasetMemberRegexFixed; yamlSchema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverCommon.$defs.path; if(yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items){ delete yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index fa8868ed..508e8df3 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -98,6 +98,7 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC dispatch(setYaml(jsonData)); } else if(isSchemaValid && jsonData) { window.electron.ipcRenderer.setConfig(jsonData); + console.log('setting config:', JSON.stringify(jsonData)); dispatch(setYaml(jsonData)); setSetupYaml(jsonData); if (onChange) { diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 8eed9833..0b7d648c 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -138,14 +138,17 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages await window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details.message ? res.details.message : res.details, 'error'); + console.log("failed to retrieve schemas"); } if(res.details?.mergedYaml != undefined){ dispatch(setYaml(res.details.mergedYaml)); window.electron.ipcRenderer.setConfig(res.details.mergedYaml); alertEmitter.emit('showAlert', "Successfully fetched example-zowe.yaml and latest schemas", 'success'); + console.log("Successfully fetched example-zowe.yaml and latest schemas"); } }).catch((e: any) => { alertEmitter.emit('showAlert', e.message, 'error'); + console.log("failed to retrieve schemas"); }); } dispatch(setLoading(false)); diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 14d6a2e0..7c35364b 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -59,8 +59,7 @@ const Certificates = () => { let timer: any; - const [certificateSchema] = useState( schema?.properties?.zowe?.properties?.setup?.properties?.certificate) - const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)) + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(setupSchema)) useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index a985983a..5e502cfa 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -59,7 +59,7 @@ const Security = () => { const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); let timer: any; - const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(setupSchema)); useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 5838fa67..8364207d 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -62,9 +62,7 @@ const Stcs = () => { const [DEFAULT_AUX] = useState('ZWESASTC'); const [defaultErrorMessage] = useState("Please ensure that the values for security.stcs attributes and dataset.proclib are accurate."); - - const [stcsSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.security?.properties?.stcs); - const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)) + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema?.properties?.zowe?.properties?.setup?.properties?.security?.properties?.stcs)) useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 3a296927..053ff37b 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -63,7 +63,7 @@ const Vsam = () => { const [defaultErrorMessage] = useState("Please ensure that the volume, storage class & dataset values are accurate."); - const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)) + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(setupSchema)) useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 4c8e0b19..11f49a82 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -67,7 +67,7 @@ const Installation = () => { let timer: any; const [installationType] = useState(getInstallationTypeStatus().installationType); - const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(setupSchema)); useEffect(() => { From 1249eb4d4f3adf6e35a7ae7ca4262e302fd8cf45 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 21:27:16 -0400 Subject: [PATCH 150/455] Reduce duplication of example-yaml + schema fetch Signed-off-by: Timothy Gerstel --- src/actions/InstallActions.ts | 2 +- src/actions/InstallationHandler.ts | 68 ++++-------------------------- 2 files changed, 9 insertions(+), 61 deletions(-) diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index 9843fae7..425c44cf 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -65,7 +65,7 @@ export class InstallActions { } smpeGetExampleYamlAndSchemas(connectionArgs: IIpcConnectionArgs, installArgs: InstallationArgs): Promise { - return this.strategy.smpeGetExampleYamlAndSchemas(connectionArgs, installArgs); + return this.strategy.getExampleYamlAndSchemas(connectionArgs, installArgs); } initStcs(connectionArgs: IIpcConnectionArgs, diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 25d4724a..61219e9a 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -19,6 +19,7 @@ import * as fs from 'fs'; import { ConfigurationStore } from '../storage/ConfigurationStore'; import { InstallationArgs } from '../types/stateInterfaces'; import { FALLBACK_SCHEMA } from '../renderer/components/common/Constants'; +import { connect } from 'react-redux'; //AJV did not like the regex in our current schema @@ -99,7 +100,7 @@ class Installation { } } - public async smpeGetExampleYamlAndSchemas ( + public async getExampleYamlAndSchemas ( connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, ): Promise { @@ -115,11 +116,9 @@ class Installation { try { yamlObj = parse(yamlFromPax); if (currentConfig) { - console.log("currentConfig: ", JSON.stringify(currentConfig)); yamlObj = Object.assign({}, yamlObj, currentConfig); } this.mergeYamlAndInstallationArgs(yamlObj, installationArgs); - console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); ProgressStore.set('downloadUnpax.getExampleYaml', true); parsedYaml = true; @@ -247,65 +246,14 @@ class Installation { return {status: false, details: `Error unpaxing Zowe archive: ${unpax.details}`}; } } - let yamlObj - let zoweRuntimePath = installationArgs.installationDir; - let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); - let parsedSchema = false, parsedYaml = false; - if(readPaxYamlAndSchema.details.yaml){ - const yamlFromPax = readPaxYamlAndSchema.details.yaml; - if(yamlFromPax){ - try { - yamlObj = parse(yamlFromPax); - if (currentConfig) { - // console.log("current config:", JSON.stringify(currentConfig)); - // console.log("yamlObj: ", JSON.stringify(yamlObj)); - yamlObj = Object.assign({}, yamlObj, currentConfig); - // console.log("merged yamlObj: ", JSON.stringify(yamlObj)); - } - this.mergeYamlAndInstallationArgs(yamlObj, installationArgs); - if (zoweConfig) { - yamlObj = {...yamlObj, ...zoweConfig}; - } - // console.log('Setting merged yaml:', JSON.stringify(yamlObj)); - ConfigurationStore.setConfig(yamlObj); - ProgressStore.set('downloadUnpax.getExampleYaml', true); - } catch(e) { - console.log('error parsing example-zowe.yaml:', e); - ProgressStore.set('downloadUnpax.getExampleYaml', false); + let yamlObj = {}; + await this.getExampleYamlAndSchemas(connectionArgs, installationArgs).then((res: IResponse) => { + if(res.status){ + if(res.details.mergedYaml != undefined){ + yamlObj = res.details.mergedYaml } - } else { - console.log("no yaml found from pax"); - ProgressStore.set('downloadUnpax.getExampleYaml', false); } - - //No reason not to always set schema to latest if user is re-running installation - if(readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ - try { - let yamlSchema = JSON.parse(readPaxYamlAndSchema.details.yamlSchema); - const serverCommon = JSON.parse(readPaxYamlAndSchema.details.serverCommon); - // console.log('yaml schema:', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); - // console.log('server common', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); - if(yamlSchema && serverCommon){ - // FIXME: Link schema by $ref properly - https://jsonforms.io/docs/ref-resolving - // Without these, AJV does not properly find $refs in the schema and therefore validation cannot occur - yamlSchema.additionalProperties = true; - yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = zoweDatasetMemberRegexFixed; - yamlSchema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverCommon.$defs.path; - if(yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items){ - delete yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; - yamlSchema.$defs.networkSettings.properties.server.properties.listenAddresses.items = serverCommon.$defs.ipv4 - } - // console.log('Setting schema from runtime dir:', JSON.stringify(yamlSchema)); - ConfigurationStore.setSchema(yamlSchema); - ProgressStore.set('downloadUnpax.getSchemas', true); - } - } catch (e) { - console.log('error setting schema from pax:', e); - ProgressStore.set('downloadUnpax.getSchemas', false); - } - } - - } + }) return {status: download.status && uploadYaml.status && upload.status && unpax.status, details: {message: 'Zowe unpax successful.', mergedYaml: yamlObj}}; } catch (error) { From a9b839c9abdb9d71abfb95ea3605e990e0700f6d Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 23:40:15 -0400 Subject: [PATCH 151/455] userUploadedPaxPath not persisting for some reason??? Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 2 +- src/renderer/components/stages/Unpax.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 61219e9a..22ddebbb 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -209,7 +209,7 @@ class Installation { if(installationArgs.installationType === "upload"){ //upload the PAX the user selected in the "Install Type" stage to the installation dir (from the planning stage) console.log('Uploading user selected pax') - upload = await new FileTransfer().upload(connectionArgs, installationArgs.userUploadedPaxPath, path.join(installationArgs.installationDir, "zowe.pax"), DataType.BINARY) + upload = await new FileTransfer().upload(connectionArgs, installationArgs.installationDir, path.join(installationArgs.installationDir, "zowe.pax"), DataType.BINARY) } else if (installationArgs.installationType === "download"){ console.log('Uploading pax downloaded from jfrog') upload = await this.uploadPax(connectionArgs, installationArgs.installationDir); diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 1daa6cce..c34831da 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -73,7 +73,7 @@ const Unpax = () => { dispatch(setDownloadUnpaxStatus(false)); setDownloadUnpaxProgress(downloadUnpaxStatus); dispatch(setNextStepEnabled(false)); - window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, installationArgs, version, yaml).then((res: IResponse) => { + window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, {...installationArgs, userUploadedPaxPath: paxPath}, version, yaml).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details, 'error'); } From 1dfab9d3da433169b66faf992e649a14ddd14f30 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 13 Jun 2024 23:59:26 -0400 Subject: [PATCH 152/455] Remove unused imports, wrap more global component vars in useState, fix upload path Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 4 ++-- src/renderer/components/common/Constants.tsx | 1 + src/renderer/components/common/EditorDialog.tsx | 5 ++--- src/renderer/components/stages/Networking.tsx | 5 ++--- src/renderer/components/stages/Stcs.tsx | 7 +++---- src/renderer/components/stages/Unpax.tsx | 13 ++++++------- 6 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 22ddebbb..ab727a05 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -208,8 +208,8 @@ class Installation { console.log("uploading..."); if(installationArgs.installationType === "upload"){ //upload the PAX the user selected in the "Install Type" stage to the installation dir (from the planning stage) - console.log('Uploading user selected pax') - upload = await new FileTransfer().upload(connectionArgs, installationArgs.installationDir, path.join(installationArgs.installationDir, "zowe.pax"), DataType.BINARY) + console.log('Uploading user selected pax from ', installationArgs.userUploadedPaxPath) + upload = await new FileTransfer().upload(connectionArgs, installationArgs.userUploadedPaxPath, path.join(installationArgs.installationDir, "zowe.pax"), DataType.BINARY) } else if (installationArgs.installationType === "download"){ console.log('Uploading pax downloaded from jfrog') upload = await this.uploadPax(connectionArgs, installationArgs.installationDir); diff --git a/src/renderer/components/common/Constants.tsx b/src/renderer/components/common/Constants.tsx index 6531d9d7..de9c8a0f 100644 --- a/src/renderer/components/common/Constants.tsx +++ b/src/renderer/components/common/Constants.tsx @@ -30,6 +30,7 @@ export const APF_AUTH_STAGE_LABEL = "APF Auth"; export const SECURITY_STAGE_LABEL = "Security"; export const CERTIFICATES_STAGE_LABEL = "Certificates"; export const VSAM_STAGE_LABEL = "Vsam"; +export const STC_STAGE_LABEL = "Stcs"; export const LAUNCH_CONFIG_STAGE_LABEL = "Launch Config"; export const REVIEW_INSTALL_STAGE_LABEL = "Review Installation"; export const FINISH_INSTALL_STAGE_LABEL = "Finish Installation"; diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index 508e8df3..d0dc7f11 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -11,12 +11,11 @@ import { useState, useEffect, useRef } from "react"; import { useAppSelector, useAppDispatch } from '../../hooks'; import { Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; -import { selectYaml, selectOutput, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; -import Ajv2019 from "ajv/dist/2019" +import { selectYaml, selectOutput, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import MonacoEditorComponent from "../common/MonacoEditor"; import { parse, stringify } from "yaml"; import { IResponse } from "../../../types/interfaces"; -import { DEF_NO_OUTPUT, FALLBACK_SCHEMA, ajv, schemaValidate } from "./Constants"; +import { DEF_NO_OUTPUT, schemaValidate } from "./Constants"; import { alertEmitter } from "../Header"; const test_jcl = ` diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 06379c7b..3951fb72 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -11,16 +11,15 @@ import { useState, useEffect } from "react"; import { Box, Button, Checkbox, FormControlLabel, IconButton, SvgIcon, SvgIconProps, TextField } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, setNextStepEnabled, setSchema, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectYaml, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import ContainerCard from '../common/ContainerCard'; import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; import { selectInitializationStatus, setInitializationStatus, setNetworkingStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; -import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML, ajv } from "../common/Constants"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, ajv } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { getInstallationArguments, getProgress, isInitComplete } from "./progress/StageProgressStatus"; diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 8364207d..6d4654ee 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -11,10 +11,9 @@ import { useState, useEffect } from "react"; import { Box, Button, FormControl, TextField, Typography } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml, setSchema } from '../configuration-wizard/wizardSlice'; +import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import { setStcsStatus, setInitializationStatus } from './progress/progressSlice'; import ContainerCard from '../common/ContainerCard';import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { IResponse } from "../../../types/interfaces"; import ProgressCard from "../common/ProgressCard"; @@ -26,12 +25,12 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; -import { FALLBACK_SCHEMA, FALLBACK_YAML, INIT_STAGE_LABEL, SERVER_COMMON, ajv } from "../common/Constants"; +import { INIT_STAGE_LABEL, STC_STAGE_LABEL, ajv } from "../common/Constants"; const Stcs = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - const subStageLabel = 'Stcs'; + const [subStageLabel] = useState(STC_STAGE_LABEL); const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index c34831da..244ee2ff 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -12,10 +12,9 @@ import {useEffect, useState} from "react"; import { Box, Button, Link, Typography } from '@mui/material'; import ContainerCard from '../common/ContainerCard'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, setLoading, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; -import { selectInstallationArgs, selectZoweVersion} from './installation/installationSlice'; +import { selectYaml, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectZoweVersion} from './installation/installationSlice'; import { selectConnectionArgs } from './connection/connectionSlice'; -import CheckCircle from '@mui/icons-material/CheckCircle'; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails } from "../../../services/StageDetails"; import { setDownloadUnpaxStatus } from './progress/progressSlice'; @@ -24,16 +23,16 @@ import React from "react"; import ProgressCard from "../common/ProgressCard"; import { alertEmitter } from "../Header"; import { IResponse } from "../../../types/interfaces"; -import { DownloadUnpaxState } from "../../../types/stateInterfaces"; +import { UNPAX_STAGE_LABEL } from "../common/Constants"; const Unpax = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - const stageLabel = 'Unpax'; + const [stageLabel] = useState(UNPAX_STAGE_LABEL); - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; + const [STAGE_ID] = useState(getStageDetails(stageLabel).id); + const [SUB_STAGES] = useState(!!getStageDetails(stageLabel).subStages); const dispatch = useAppDispatch(); const connectionArgs = useAppSelector(selectConnectionArgs); From f8515504bdd01d6b56c6ef5f790c5d893411fb19 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 00:01:19 -0400 Subject: [PATCH 153/455] Fetch example-zowe.yaml and schemas when skipping upload as well Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Stepper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 0b7d648c..f71fab2c 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -132,7 +132,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages stages[activeStep].subStages[activeSubStep].isSkipped = true; mapAndSetSkipStatus(activeSubStep, true); } - if(stages[activeStep].label === UNPAX_STAGE_LABEL && installationArgs.installationType == "download"){ + if(stages[activeStep].label === UNPAX_STAGE_LABEL && installationArgs.installationType != "smpe"){ alertEmitter.emit('showAlert', 'Retrieving example-zowe.yaml and latest schemas from Zowe runtime files...', 'info'); dispatch(setLoading(true)); await window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { From 078d76d627fafe86f0f3d77812f963002e1c2f97 Mon Sep 17 00:00:00 2001 From: 1000TurquoisePogs Date: Fri, 14 Jun 2024 15:45:11 +0200 Subject: [PATCH 154/455] Update Unpax.tsx for zowe org url Signed-off-by: 1000TurquoisePogs --- src/renderer/components/stages/Unpax.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 25b4e616..a925cf6f 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -117,7 +117,7 @@ const Unpax = () => { {installValue === "download" && {`Zen will download the latest Zowe convenience build in PAX archive format from `} - {'https://zowe.org.'} + {'https://zowe.org/'} {` Skip this step if you have already downloaded Zowe.`} {!showProgress && @@ -165,4 +165,4 @@ const Unpax = () => { ); }; -export default Unpax; \ No newline at end of file +export default Unpax; From 0096a9c148825c9f8868c2ffaeaf4b84ac58c122 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 13:44:12 -0400 Subject: [PATCH 155/455] Fix name undefined during unpax Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index ab727a05..54ca7363 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -75,6 +75,12 @@ class Installation { yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; } if (installationArgs.jobName) { + if(yamlObj.zowe.job == undefined){ + yamlObj.zowe.job = { + name: "", + prefix: "" + } + } yamlObj.zowe.job.name = installationArgs.jobName; } if (installationArgs.jobPrefix) { From ddc35f25a69f87dbb64bea5721909c7635507eac Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 14:23:23 -0400 Subject: [PATCH 156/455] Remove unused args from init functions. Remove getConfig call from ipcRenderer hook call and simply move it to the function within InstallationHandler Signed-off-by: Timothy Gerstel --- src/actions/InstallActions.ts | 29 ++++++------ src/actions/InstallationHandler.ts | 46 +++++++++++-------- src/main/index.ts | 28 +++++------ .../components/stages/Certificates.tsx | 2 +- .../components/stages/InitApfAuth.tsx | 4 +- src/renderer/components/stages/Security.tsx | 2 +- src/renderer/components/stages/Stcs.tsx | 2 +- src/renderer/components/stages/Unpax.tsx | 2 +- src/renderer/components/stages/Vsam.tsx | 2 +- .../stages/installation/Installation.tsx | 2 +- src/renderer/preload.ts | 28 +++++------ 11 files changed, 78 insertions(+), 69 deletions(-) diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index 425c44cf..f52c5094 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -37,26 +37,25 @@ export class InstallActions { } runInitCertificates(connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, zoweConfig: any){ - return this.strategy.initCertificates(connectionArgs, installationArgs, zoweConfig) + installationArgs: InstallationArgs){ + return this.strategy.initCertificates(connectionArgs, installationArgs) } downloadUnpax(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, - version: string, zoweConfig: any): Promise { - return this.strategy.downloadUnpax(connectionArgs, installationArgs, version, zoweConfig); + version: string): Promise { + return this.strategy.downloadUnpax(connectionArgs, installationArgs, version); } runInstallation ( connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, - version: string, zoweConfig: any ): Promise { - return this.strategy.runInstallation(connectionArgs, installationArgs, version, zoweConfig); + installationArgs: InstallationArgs): Promise { + return this.strategy.runInstallation(connectionArgs, installationArgs); } runInitSecurity(connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, zoweConfig: object): Promise { - return this.strategy.runInitSecurity(connectionArgs, installationArgs, zoweConfig); + installationArgs: InstallationArgs): Promise { + return this.strategy.runInitSecurity(connectionArgs, installationArgs); } uploadLatestYaml(connectionArgs: IIpcConnectionArgs, @@ -69,18 +68,18 @@ export class InstallActions { } initStcs(connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, zoweConfig: object): Promise { - return this.strategy.initStcs(connectionArgs, installationArgs, zoweConfig); + installationArgs: InstallationArgs): Promise { + return this.strategy.initStcs(connectionArgs, installationArgs); } initVsam(connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, zoweConfig: object): Promise { - return this.strategy.initVsam(connectionArgs, installationArgs, zoweConfig); + installationArgs: InstallationArgs): Promise { + return this.strategy.initVsam(connectionArgs, installationArgs); } runApfAuth(connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, zoweConfig: object): Promise { - return this.strategy.runApfAuth(connectionArgs, installationArgs, zoweConfig); + installationArgs: InstallationArgs): Promise { + return this.strategy.runApfAuth(connectionArgs, installationArgs); } } \ No newline at end of file diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 54ca7363..1b283bc0 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -37,7 +37,8 @@ class Installation { connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, ): Promise { - const currentConfig: any = ConfigurationStore.getConfig(); + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; const savingResult = await this.generateYamlFile(currentConfig); if (!savingResult.status) { console.log("failed to save yaml"); @@ -177,11 +178,11 @@ class Installation { connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, version: string, - zoweConfig: any, ): Promise { - const currentConfig: any = ConfigurationStore.getConfig(); + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; - const savingResult = await this.generateYamlFile(zoweConfig); + const savingResult = await this.generateYamlFile(currentConfig); if (!savingResult.status) { console.log("failed to save yaml"); return savingResult; @@ -270,11 +271,10 @@ class Installation { public async runInstallation ( connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, - version: string, - zoweConfig: any, ): Promise { - const currentConfig: any = ConfigurationStore.getConfig(); - const savingResult = await this.generateYamlFile(zoweConfig); + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; + const savingResult = await this.generateYamlFile(currentConfig); if (!savingResult.status) { console.log("failed to save yaml"); return savingResult; @@ -325,10 +325,12 @@ class Installation { } public async runApfAuth(connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, zoweConfig: object): Promise{ + installationArgs: InstallationArgs): Promise{ + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') - await fs.writeFile(filePath, stringify(zoweConfig), (err) => { + await fs.writeFile(filePath, stringify(currentConfig), (err) => { if (err) { console.warn("Can't save configuration to zowe.yaml"); return ProgressStore.set('apfAuth.writeYaml', false); @@ -351,10 +353,12 @@ class Installation { } public async runInitSecurity(connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, zoweConfig: object): Promise{ + installationArgs: InstallationArgs): Promise{ + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') - await fs.writeFile(filePath, stringify(zoweConfig), (err) => { + await fs.writeFile(filePath, stringify(currentConfig), (err) => { if (err) { console.warn("Can't save configuration to zowe.yaml"); ProgressStore.set('initSecurity.writeYaml', false); @@ -376,7 +380,9 @@ class Installation { } public async initStcs(connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, zoweConfig: object): Promise{ + installationArgs: InstallationArgs): Promise{ + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; // Initialize Progress Store For Vsam ProgressStore.set('initStcs.writeYaml', false); @@ -385,7 +391,7 @@ class Installation { console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') - await fs.writeFile(filePath, stringify(zoweConfig), (err) => { + await fs.writeFile(filePath, stringify(currentConfig), (err) => { if (err) { console.warn("Can't save configuration to zowe.yaml"); ProgressStore.set('initStcs.writeYaml', false); @@ -418,10 +424,12 @@ class Installation { } - async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: any){ + async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs){ + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') - await fs.writeFile(filePath, stringify(zoweConfig), (err: any) => { + await fs.writeFile(filePath, stringify(currentConfig), (err: any) => { if (err) { console.warn("Can't save configuration to zowe.yaml"); return ProgressStore.set('certificate.writeYaml', false); @@ -442,7 +450,9 @@ class Installation { } public async initVsam(connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, zoweConfig: object): Promise{ + installationArgs: InstallationArgs): Promise{ + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; // Initialize Progress Store For Vsam ProgressStore.set('initVsam.writeYaml', false); ProgressStore.set('initVsam.uploadYaml', false); @@ -450,7 +460,7 @@ class Installation { console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') - await fs.writeFile(filePath, stringify(zoweConfig), (err) => { + await fs.writeFile(filePath, stringify(currentConfig), (err) => { if (err) { console.warn("Can't save configuration to zowe.yaml"); ProgressStore.set('initVsam.writeYaml', false); diff --git a/src/main/index.ts b/src/main/index.ts index 7e652d80..5b45ce2f 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -194,13 +194,13 @@ const createWindow = (): void => { return res; }) - ipcMain.handle('install-mvs', async (event, connectionArgs, installationArgs, version, zoweConfig) => { - const res = await installActions.runInstallation(connectionArgs, installationArgs, version, zoweConfig); + ipcMain.handle('install-mvs', async (event, connectionArgs, installationArgs) => { + const res = await installActions.runInstallation(connectionArgs, installationArgs); return res; }); - ipcMain.handle('download-unpax', async (event, connectionArgs, installationArgs, version, zoweConfig) => { - const res = await installActions.downloadUnpax(connectionArgs, installationArgs, version, zoweConfig); + ipcMain.handle('download-unpax', async (event, connectionArgs, installationArgs, version) => { + const res = await installActions.downloadUnpax(connectionArgs, installationArgs, version); return res; }); @@ -209,13 +209,13 @@ const createWindow = (): void => { return res; }); - ipcMain.handle('init-certificates', async (event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.runInitCertificates(connectionArgs, installationArgs, zoweConfig); + ipcMain.handle('init-certificates', async (event, connectionArgs, installationArgs) => { + const res = await installActions.runInitCertificates(connectionArgs, installationArgs); return res; }); - ipcMain.handle('init-apf', async (_event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.runApfAuth(connectionArgs, installationArgs, zoweConfig); + ipcMain.handle('init-apf', async (_event, connectionArgs, installationArgs) => { + const res = await installActions.runApfAuth(connectionArgs, installationArgs); return res; }); @@ -241,8 +241,8 @@ const createWindow = (): void => { return res; }); - ipcMain.handle('init-security', async (event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.runInitSecurity(connectionArgs, installationArgs, zoweConfig); + ipcMain.handle('init-security', async (event, connectionArgs, installationArgs) => { + const res = await installActions.runInitSecurity(connectionArgs, installationArgs); return res; }); @@ -251,13 +251,13 @@ const createWindow = (): void => { return res; }); - ipcMain.handle('init-stcs', async (event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.initStcs(connectionArgs, installationArgs, zoweConfig); + ipcMain.handle('init-stcs', async (event, connectionArgs, installationArgs) => { + const res = await installActions.initStcs(connectionArgs, installationArgs); return res; }); - ipcMain.handle('init-vsam', async (event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.initVsam(connectionArgs, installationArgs, zoweConfig); + ipcMain.handle('init-vsam', async (event, connectionArgs, installationArgs) => { + const res = await installActions.initVsam(connectionArgs, installationArgs); return res; }); diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 7c35364b..9f2f9007 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -161,7 +161,7 @@ const Certificates = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { + window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { updateProgress(res.status); clearInterval(timer); }).catch(() => { diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 26e309a4..ea6ba77c 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -54,7 +54,7 @@ const InitApfAuth = () => { const [installationArgs] = useState(getInstallationArguments()); let timer: any; - const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema?.properties?.zowe?.properties?.setup?.properties?.dataset)); useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); @@ -167,7 +167,7 @@ const InitApfAuth = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.apfAuthButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { + window.electron.ipcRenderer.apfAuthButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { // Some parts of Zen pass the response as a string directly into the object if (res.status == false && typeof res.details == "string") { res.details = { 3: res.details }; diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 5e502cfa..1714de1d 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -160,7 +160,7 @@ const Security = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { + window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { // Some parts of Zen pass the response as a string directly into the object if (res.status == false && typeof res.details == "string") { res.details = { 3: res.details }; diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 6d4654ee..319d7d7f 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -179,7 +179,7 @@ const Stcs = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initStcsButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { + window.electron.ipcRenderer.initStcsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { updateProgress(res.status); if(res.error) { alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 244ee2ff..5e7e70dc 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -72,7 +72,7 @@ const Unpax = () => { dispatch(setDownloadUnpaxStatus(false)); setDownloadUnpaxProgress(downloadUnpaxStatus); dispatch(setNextStepEnabled(false)); - window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, {...installationArgs, userUploadedPaxPath: paxPath}, version, yaml).then((res: IResponse) => { + window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, {...installationArgs, userUploadedPaxPath: paxPath}, version).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details, 'error'); } diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 053ff37b..16ce07fe 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -174,7 +174,7 @@ const Vsam = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initVsamButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { + window.electron.ipcRenderer.initVsamButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { updateProgress(res.status); if(res.error) { alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 11f49a82..85831d21 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -256,7 +256,7 @@ const Installation = () => { setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(true); dispatch(setLoading(false)); /* change skipDownload ?? false --> true to skip upload/download steps for quicker development */ - window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { + window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { // Some parts of Zen pass the response as a string directly into the object if (res.status == false && typeof res.details == "string") { res.details = { 3: res.details }; diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 8408f6e9..99c024f5 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -98,20 +98,20 @@ contextBridge.exposeInMainWorld('electron', { checkDirOrCreate(connectionArgs: IIpcConnectionArgs, location: string) { return ipcRenderer.invoke("check-dir-or-create", connectionArgs, location); }, - installButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string, javaHome: string, nodeHome: string, installationType: string, userUploadedPaxPath: string}, version: string, zoweConfig: any, skipDownload: boolean) { - return ipcRenderer.invoke("install-mvs", connectionArgs, installationArgs, version, zoweConfig, skipDownload); + installButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, version: string) { + return ipcRenderer.invoke("install-mvs", connectionArgs, installationArgs, version); }, - downloadButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string, javaHome: string, nodeHome: string, installationType: string, userUploadedPaxPath: string}, version: string, zoweConfig: any) { - return ipcRenderer.invoke("download-unpax", connectionArgs, installationArgs, version, zoweConfig); + downloadButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, version: string) { + return ipcRenderer.invoke("download-unpax", connectionArgs, installationArgs, version); }, fetchExampleYamlBtnOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { return ipcRenderer.invoke("get-yaml-schema", connectionArgs, installationArgs); }, - initCertsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { - return ipcRenderer.invoke("init-certificates", connectionArgs, installationArgs, zoweConfig); + initCertsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}) { + return ipcRenderer.invoke("init-certificates", connectionArgs, installationArgs); }, - apfAuthButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string, userUploadedPaxPath: string}, zoweConfig: any) { - return ipcRenderer.invoke("init-apf", connectionArgs, installationArgs, zoweConfig); + apfAuthButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + return ipcRenderer.invoke("init-apf", connectionArgs, installationArgs); }, getApfAuthProgress(){ return ipcRenderer.invoke("get-apf-auth-progress"); @@ -125,14 +125,14 @@ contextBridge.exposeInMainWorld('electron', { getCertificateProgress() { return ipcRenderer.invoke("get-certificate-progress"); }, - initSecurityButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { - return ipcRenderer.invoke("init-security", connectionArgs, installationArgs, zoweConfig); + initSecurityButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}) { + return ipcRenderer.invoke("init-security", connectionArgs, installationArgs); }, - initStcsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { - return ipcRenderer.invoke("init-stcs", connectionArgs, installationArgs, zoweConfig); + initStcsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}) { + return ipcRenderer.invoke("init-stcs", connectionArgs, installationArgs); }, - initVsamButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { - return ipcRenderer.invoke("init-vsam", connectionArgs, installationArgs, zoweConfig); + initVsamButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}) { + return ipcRenderer.invoke("init-vsam", connectionArgs, installationArgs); }, getInitSecurityProgress(){ return ipcRenderer.invoke("get-init-security-progress"); From fc9c91c50d1be320dc09ae4d82ad392a3011d541 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 14:28:39 -0400 Subject: [PATCH 157/455] Deep merge of current config and example-zowe.yaml, big thank you to Sergei Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 1b283bc0..0ec17685 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -31,6 +31,20 @@ const zoweDatasetMemberRegexFixed = { "maxLength": 8 } +function deepMerge(base: any, extension:any) { + if (typeof base === "object" && typeof extension === "object") { + for (const key in extension) { + if (typeof extension[key] === "object") { + if (!base[key]) base[key] = {}; + deepMerge(base[key], extension[key]); + } else { + Object.assign(base, {[key]: extension[key]}); + } + } + } + return base; +} + class Installation { public async uploadLatestYaml ( @@ -123,7 +137,7 @@ class Installation { try { yamlObj = parse(yamlFromPax); if (currentConfig) { - yamlObj = Object.assign({}, yamlObj, currentConfig); + yamlObj = deepMerge(yamlObj, currentConfig); } this.mergeYamlAndInstallationArgs(yamlObj, installationArgs); ConfigurationStore.setConfig(yamlObj); From 353b049041b82a7fa3bc11c53e1fde90c83b4944 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 14:36:29 -0400 Subject: [PATCH 158/455] Fix typo Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Vsam.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 16ce07fe..5d2cd778 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -233,7 +233,7 @@ const Vsam = () => { } }; setLYaml(updatedYaml); - window.electron.setConfig(updatedYaml); + window.electron.ipcRenderer.setConfig(updatedYaml); dispatch(setYaml(updatedYaml)); } @@ -254,7 +254,7 @@ const Vsam = () => { } } }; - window.electron.setConfig(updatedYaml); + window.electron.ipcRenderer.setConfig(updatedYaml); setLYaml(updatedYaml); dispatch(setYaml(updatedYaml)); }; From 61e03cd45e21d6d9ad855ac82efe5352727ed02b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 14:57:33 -0400 Subject: [PATCH 159/455] Remveo consoe log Signed-off-by: Timothy Gerstel --- src/renderer/components/common/EditorDialog.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index d0dc7f11..24a237c9 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -97,7 +97,6 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC dispatch(setYaml(jsonData)); } else if(isSchemaValid && jsonData) { window.electron.ipcRenderer.setConfig(jsonData); - console.log('setting config:', JSON.stringify(jsonData)); dispatch(setYaml(jsonData)); setSetupYaml(jsonData); if (onChange) { From bceeef0aaadf4ce139181f99649cd8b61060e20d Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 15:27:38 -0400 Subject: [PATCH 160/455] Add spacing to pattern match titles Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Networking.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 3951fb72..8e13114a 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -694,10 +694,11 @@ const Networking = () => { return Object.keys(yaml[schemaKey]).map((matchedPattern, mIndex) => { if(mIndex < LOOP_LIMIT && pattern.test(matchedPattern)){ return

- - {matchedPattern} -
-
+
+ + {matchedPattern} +
+
{Object.keys(yaml[schemaKey][matchedPattern]).map((schemaProperty, sIndex) => { if(sIndex < LOOP_LIMIT && schemaProperty.length > 0){ From 7073bbb46d9d62e2b33cb30dd91101b48880ff9c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 15:41:33 -0400 Subject: [PATCH 161/455] Fix typos Signed-off-by: Timothy Gerstel --- src/renderer/components/Home.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index e6045d91..2630b9b6 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -116,7 +116,7 @@ const Home = () => { //Home is the first screen the user will always see 100% of the time. Therefore, we will call the loading of the configs, schemas, and installation args here and set them to the redux memory states //YAML LOADING - necessary for editor state as well as form values - if(!yaml == undefined || (typeof yaml === "object" && Object.keys(yaml).length === 0)){ + if(yaml == undefined || (typeof yaml === "object" && Object.keys(yaml).length === 0)){ window.electron.ipcRenderer.getConfig().then((res: IResponse) => { if (res.status) { dispatch(setYaml(res.details)); @@ -127,7 +127,7 @@ const Home = () => { } //SCHEMA LOADING - necessary for JsonForms - if(schema == undefined || (typeof schema === "object" && Object.keys(yaml).length === 0)){ + if(schema == undefined || (typeof schema === "object" && Object.keys(schema).length === 0)){ window.electron.ipcRenderer.getSchema().then((res: IResponse) => { if (res.status && res.details !== undefined) { dispatch(setSchema(res.details)); From 13c52f60d7231f1d52dbfde8a6c6ee8bbde60668 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:02:20 -0400 Subject: [PATCH 162/455] Add error to log message Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Stepper.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index f71fab2c..78b58704 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -138,7 +138,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages await window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details.message ? res.details.message : res.details, 'error'); - console.log("failed to retrieve schemas"); + console.log("failed to retrieve schemas: ", res.details.message ? res.details.message : res.details); } if(res.details?.mergedYaml != undefined){ dispatch(setYaml(res.details.mergedYaml)); @@ -148,7 +148,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages } }).catch((e: any) => { alertEmitter.emit('showAlert', e.message, 'error'); - console.log("failed to retrieve schemas"); + console.log("failed to retrieve schemas", e.message); }); } dispatch(setLoading(false)); From 955ea2970b6d9af3dac8aa4d097fde50b1638c2c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:02:32 -0400 Subject: [PATCH 163/455] Fix setting of installationArgs Signed-off-by: Timothy Gerstel --- src/renderer/components/Home.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 2630b9b6..171f8c19 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -142,7 +142,7 @@ const Home = () => { if(res != undefined){ dispatch(setInstallationArgs(res)); } else { - dispatch(setInstallationArgs({...getInstallationArguments()})); + dispatch(setInstallationArgs({...selectInstallationArgs, ...getInstallationArguments()})); } }) From 58fbdf717e3a4a08e8b2a4fdc195479a7c4461ca Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:11:09 -0400 Subject: [PATCH 164/455] Update networking status to false on change Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Networking.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 8e13114a..8ac5684f 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -642,6 +642,7 @@ const Networking = () => { const newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: domains}}; window.electron.ipcRenderer.setConfig(newYaml ) dispatch(setYaml(newYaml)) + dispatch(setNetworkingStatus(false)); setLYaml(newYaml); }}>

{yaml.zowe.externalDomains != undefined && yaml.zowe.externalDomains.map((domain: string, index: number) => { // console.log(domains); window.electron.ipcRenderer.setConfig(newYaml ) dispatch(setYaml(newYaml)) + dispatch(setNetworkingStatus(false)); setLYaml(newYaml); }} /> { @@ -662,6 +664,7 @@ const Networking = () => { const newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: domains}}; window.electron.ipcRenderer.setConfig(newYaml ) dispatch(setYaml(newYaml)) + dispatch(setNetworkingStatus(false)); setLYaml(newYaml); }}>)}
@@ -713,12 +716,13 @@ const Networking = () => { setLYaml(newYaml); await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${schemaKey}.${matchedPattern}.${schemaProperty}`, !yaml[schemaKey][matchedPattern][schemaProperty]) dispatch(setYaml(newYaml)); + dispatch(setNetworkingStatus(false)); }}/>} />} {typeof yaml[schemaKey][matchedPattern][schemaProperty] === "number" && { @@ -727,6 +731,7 @@ const Networking = () => { setLYaml(newYaml); await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${schemaKey}.${matchedPattern}.${schemaProperty}`, Number(e.target.value)) dispatch(setYaml(newYaml)); + dispatch(setNetworkingStatus(false)); } }} />} From c877ecd8a64bcd80141f13985eac6b7cf9be84a2 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:13:22 -0400 Subject: [PATCH 165/455] Fix scrolling on apf auth stage Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/InitApfAuth.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index ea6ba77c..76c389ad 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -303,7 +303,7 @@ const InitApfAuth = () => { } - +
From 48718a7e178c316dac57401ffc6ab239489cf419 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:16:59 -0400 Subject: [PATCH 166/455] Scrolling fixes Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/InitApfAuth.tsx | 2 +- src/renderer/components/stages/Security.tsx | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 76c389ad..43d7a5e1 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -303,7 +303,7 @@ const InitApfAuth = () => { }
- +
diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 1714de1d..05d50e44 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -69,6 +69,9 @@ const Security = () => { if(getProgress('securityStatus')) { nextPosition = document.getElementById('security-progress'); nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'end' }); + } else { + nextPosition = document.getElementById('container-box-id'); + nextPosition?.scrollIntoView({behavior: 'smooth'}); } updateProgress(getProgress('securityStatus')); From 501e300a01e0f9162db546227f0dc2220f4a9822 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Fri, 14 Jun 2024 16:30:20 -0400 Subject: [PATCH 167/455] Nicer error check + missed a spot Signed-off-by: Leanid Astrakou --- src/renderer/components/stages/Stcs.tsx | 2 +- src/services/ServiceUtils.ts | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index ee35ba7c..4890c935 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -259,7 +259,7 @@ const Stcs = () => {
- + {/* */} diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index 49d8d371..c00e79e2 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -23,6 +23,8 @@ export const MKDIR_ERROR_PARENT = "EDC5129I"; // when MKDIR tries to create top- export const MKDIR_ERROR_EXISTS = "EDC5117I"; // when dir already exist +export const MKDIR_ERROR_BADARGS= "EDC5134I"; // when func not implemented + export const LIST_ERROR_NOTFOUND = "FSUM6785"; // when dir doesn't exist export async function connectFTPServer(config: IIpcConnectionArgs): Promise { @@ -60,7 +62,7 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< if (error.toString().includes(MKDIR_ERROR_PARENT)) { let parentDir = reducePath(dir); if (parentDir !== "/") { - console.info("Wasn't able to create: " + dir + " . Will attempt to create: " + parentDir); + console.info("Wasn't able to create: '" + dir + "'. Will attempt to create: " + parentDir); await makeDir(config, parentDir); return makeDir(config, dir); } @@ -68,6 +70,9 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< if (error.toString().includes(MKDIR_ERROR_EXISTS)) { return true; } + if (error.toString().includes(MKDIR_ERROR_BADARGS)) { + console.info("Wasn't able to create: '" + dir + "'. Problem with using mkdir. Method usage is not implemented (bad arguments?)"); + } console.warn(error); return false; } finally { From 6cb9b255234ffb931da24f8a8e65442255661ef0 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:34:11 -0400 Subject: [PATCH 168/455] Remove unused imports Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 10 ++++------ .../components/stages/installation/Installation.tsx | 11 +++++------ 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 9f2f9007..9b5846d1 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -11,13 +11,11 @@ import { useState, useEffect } from "react"; import { Box, Button, FormControl, FormHelperText, MenuItem, Select } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { setSecurityStatus, setInitializationStatus, selectCertificateStatus, setCertificateStatus, selectInitializationStatus } from './progress/progressSlice'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml, setSchema } from '../configuration-wizard/wizardSlice'; +import { setInitializationStatus, setCertificateStatus } from './progress/progressSlice'; +import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; -import { selectInstallationArgs } from "./installation/installationSlice"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { IResponse } from "../../../../src/types/interfaces"; import React from "react"; @@ -26,9 +24,9 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { setProgress, getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments, getCompleteProgress, isInitComplete } from "./progress/StageProgressStatus"; +import { getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { CertInitSubStepsState } from "../../../types/stateInterfaces"; -import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv, SERVER_COMMON } from "../common/Constants"; +import { TYPE_YAML, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv } from "../common/Constants"; const Certificates = () => { diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 85831d21..2f6ddfe5 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -8,11 +8,11 @@ * Copyright Contributors to the Zowe Project. */ -import React, {useCallback, useEffect, useRef, useState} from "react"; +import React, {useCallback, useEffect, useState} from "react"; import { Box, Button, FormControl, Typography, debounce } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../../hooks'; -import { selectYaml, setYaml, selectSchema, setNextStepEnabled, setLoading, setSchema } from '../../configuration-wizard/wizardSlice'; -import { selectInstallationArgs, selectZoweVersion, selectInstallationType, setInstallationArgs } from './installationSlice'; +import { selectYaml, setYaml, selectSchema, setNextStepEnabled, setLoading} from '../../configuration-wizard/wizardSlice'; +import { selectZoweVersion, setInstallationArgs } from './installationSlice'; import { selectConnectionArgs } from '../connection/connectionSlice'; import { setDatasetInstallationStatus, setInitializationStatus } from "../progress/progressSlice"; import { IResponse } from '../../../../types/interfaces'; @@ -20,14 +20,13 @@ import ProgressCard from '../../common/ProgressCard'; import ContainerCard from '../../common/ContainerCard'; import JsonForm from '../../common/JsonForms'; import EditorDialog from "../../common/EditorDialog"; -import Ajv from "ajv"; import { alertEmitter } from "../../Header"; import { createTheme } from '@mui/material/styles'; import {stages} from "../../configuration-wizard/Wizard"; import { setActiveStep } from "../progress/activeStepSlice"; -import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, INSTALL_STAGE_LABEL, ajv2019, SERVER_COMMON} from '../../common/Constants'; +import { TYPE_YAML, TYPE_OUTPUT, JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, INSTALL_STAGE_LABEL} from '../../common/Constants'; import { getStageDetails, getSubStageDetails } from "../../../../services/StageDetails"; -import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus, isInitComplete } from "../progress/StageProgressStatus"; +import { getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus, isInitComplete } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; import eventDispatcher from '../../../../services/eventDispatcher'; From d9e0c44c8f8ae0bc1f4c210794b4f25f4416e4a2 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:36:34 -0400 Subject: [PATCH 169/455] Remove unused imports Signed-off-by: Timothy Gerstel --- src/renderer/components/Home.tsx | 4 +--- src/renderer/components/configuration-wizard/Wizard.tsx | 3 +-- src/renderer/components/stages/LaunchConfig.tsx | 5 ++--- src/renderer/components/stages/Planning.tsx | 6 +++--- src/renderer/components/stages/ReviewInstallation.tsx | 2 +- src/renderer/components/stages/Security.tsx | 3 +-- 6 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 171f8c19..e7f9510c 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -11,7 +11,7 @@ import '../global.css'; import { useEffect, useState } from "react"; import { Link } from 'react-router-dom'; -import { Box, Card, CardContent, CardMedia, Typography, Button, DialogContent, DialogActions } from '@mui/material'; +import { Box, Card, CardContent, CardMedia, Typography, Button } from '@mui/material'; import flatten, { unflatten } from 'flat'; import { IResponse, IIpcConnectionArgs } from '../../types/interfaces'; import { setConnectionArgs, setResumeProgress, selectInitJobStatement } from './stages/connection/connectionSlice'; @@ -22,11 +22,9 @@ import { Tooltip } from '@mui/material'; import installationImg from '../assets/installation.png' import installationDryImg from '../assets/installation-dry-run.png' import eventDispatcher from "../../services/eventDispatcher"; -import { selectActiveStepIndex, selectIsSubstep, selectActiveSubStepIndex, selectActiveStepDate} from './stages/progress/activeStepSlice'; import { selectConnectionStatus} from './stages/progress/progressSlice'; import HorizontalLinearStepper from './common/Stepper'; import Wizard from './configuration-wizard/Wizard' -import Connection from './stages/connection/Connection'; import { ActiveState } from '../../types/stateInterfaces'; import { getInstallationArguments, getPreviousInstallation } from './stages/progress/StageProgressStatus'; import { DEF_NO_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from './common/Constants'; diff --git a/src/renderer/components/configuration-wizard/Wizard.tsx b/src/renderer/components/configuration-wizard/Wizard.tsx index b4b5ae53..566634cf 100644 --- a/src/renderer/components/configuration-wizard/Wizard.tsx +++ b/src/renderer/components/configuration-wizard/Wizard.tsx @@ -18,7 +18,6 @@ import Certificates from "../stages/Certificates"; import Initialization from "../stages/Initialization"; import ReviewInstallation from '../stages/ReviewInstallation'; import FinishInstallation from '../stages/FinishInstallation'; -import spock from '../../assets/spock.svg' import InstallationType from '../stages/installation/InstallTypeSelection'; import { selectLoading } from './wizardSlice'; import { useAppSelector } from '../../hooks'; @@ -26,7 +25,7 @@ import InitApfAuth from '../stages/InitApfAuth'; import Networking from '../stages/Networking'; import Vsam from '../stages/Vsam'; import LaunchConfig from '../stages/LaunchConfig'; -import { getInstallationTypeStatus, getProgress } from '../stages/progress/StageProgressStatus'; +import { getProgress } from '../stages/progress/StageProgressStatus'; import Unpax from '../stages/Unpax'; import { APF_AUTH_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, CONNECTION_STAGE_LABEL, FINISH_INSTALL_STAGE_LABEL, INIT_STAGE_LABEL, INSTALLATION_TYPE_STAGE_LABEL, INSTALL_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL, NETWORKING_STAGE_LABEL, PLANNING_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, SECURITY_STAGE_LABEL, UNPAX_STAGE_LABEL, VSAM_STAGE_LABEL } from '../common/Constants'; diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 49f4c6e1..950cc9f0 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -11,17 +11,16 @@ import { useState, useEffect } from "react"; import { Box, Button } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, selectOutput, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectYaml,setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; import { selectInitializationStatus, setInitializationStatus, setLaunchConfigStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; -import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_YAML, ajv, SERVER_COMMON, INIT_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL } from "../common/Constants"; +import { TYPE_YAML, TYPE_OUTPUT, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL } from "../common/Constants"; import { IResponse } from "../../../types/interfaces"; import { getInstallationArguments, getProgress, isInitComplete } from "./progress/StageProgressStatus"; import { selectConnectionArgs } from "./connection/connectionSlice"; diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 5cdae97d..eea10ad2 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -8,7 +8,7 @@ * Copyright Contributors to the Zowe Project. */ -import React, {useEffect, useMemo, useState} from "react"; +import React, {useEffect, useState} from "react"; import Box from '@mui/material/Box'; import Link from '@mui/material/Link'; import Typography from '@mui/material/Typography'; @@ -17,11 +17,11 @@ import FormControl from '@mui/material/FormControl'; import Button from '@mui/material/Button'; import ContainerCard from '../common/ContainerCard'; import CheckCircle from '@mui/icons-material/CheckCircle'; -import { setYaml, setSchema, setNextStepEnabled, setLoading, selectYaml } from '../configuration-wizard/wizardSlice'; +import { setYaml, setNextStepEnabled, setLoading, selectYaml } from '../configuration-wizard/wizardSlice'; import { selectConnectionArgs, setConnectionArgs, setJobStatementVal } from './connection/connectionSlice'; import { setPlanningStatus, selectPlanningStatus } from './progress/progressSlice'; import { setZoweVersion, setInstallationArgs, selectInstallationArgs, selectZoweVersion } from './installation/installationSlice'; -import { setJobStatement, setJobStatementValid, setJobStatementValidMsg, setLocationValidationDetails, setIsLocationValid, selectJobStatement, selectJobStatementValid, selectJobStatementValidMsg, selectLocValidationDetails } from "./PlanningSlice"; +import { setJobStatement, setJobStatementValid, setJobStatementValidMsg, setLocationValidationDetails, setIsLocationValid, selectJobStatementValidMsg, selectLocValidationDetails } from "./PlanningSlice"; import { useAppDispatch, useAppSelector } from '../../hooks'; import { IResponse } from '../../../types/interfaces'; import { alertEmitter } from "../Header"; diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index 381570b6..a0e3d27e 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -24,7 +24,7 @@ import { selectConnectionStatus, setReviewStatus } from './progress/progressSlic import { setActiveStep } from './progress/activeStepSlice'; import { setNextStepEnabled } from '../configuration-wizard/wizardSlice'; import { getStageDetails } from "../../../services/StageDetails"; -import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL } from '../common/Constants'; +import { TYPE_YAML, TYPE_OUTPUT } from '../common/Constants'; import { getCompleteProgress } from "./progress/StageProgressStatus"; import '../../styles/ReviewInstallation.css'; diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 05d50e44..2517504c 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -16,7 +16,6 @@ import { setSecurityStatus, setInitializationStatus } from './progress/progressS import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; -import { selectInstallationArgs } from "./installation/installationSlice"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { IResponse } from "../../../types/interfaces"; import ProgressCard from "../common/ProgressCard"; @@ -25,7 +24,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { setProgress, getProgress, setSecurityInitState, getSecurityInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; +import { getProgress, setSecurityInitState, getSecurityInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { JCL_UNIX_SCRIPT_OK, INIT_STAGE_LABEL, SECURITY_STAGE_LABEL, ajv, SERVER_COMMON } from '../common/Constants'; import { alertEmitter } from "../Header"; From 77ab59e871933a74ed705983d8ec5731d56f73cc Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:43:15 -0400 Subject: [PATCH 170/455] Fix ui error when typing invalid dir on planning Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 1 + src/renderer/preload.ts | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index eea10ad2..923bcb77 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -316,6 +316,7 @@ const Planning = () => { // setStep(2); // This step is meant to show some usefull status, removing for now. } else { dispatch(setPlanningStatus(false)); + dispatch(setLoading(false)); alertEmitter.emit('showAlert', details.error, 'error'); } }) diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 99c024f5..42010fd4 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -93,10 +93,18 @@ contextBridge.exposeInMainWorld('electron', { return ipcRenderer.invoke("check-space-create-dir", connectionArgs, location); }, checkDirExists(connectionArgs: IIpcConnectionArgs, location: string) { - return ipcRenderer.invoke("check-dir-exists", connectionArgs, location); + try{ + return ipcRenderer.invoke("check-dir-exists", connectionArgs, location); + } catch (e){ + return {status: false, details: e.message} + } }, checkDirOrCreate(connectionArgs: IIpcConnectionArgs, location: string) { + try{ return ipcRenderer.invoke("check-dir-or-create", connectionArgs, location); + } catch (e) { + return {status: false, details: e.message} + } }, installButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, version: string) { return ipcRenderer.invoke("install-mvs", connectionArgs, installationArgs, version); From e641fee34acfefa784dfa178b07022ac8b6479ba Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:45:31 -0400 Subject: [PATCH 171/455] Return false on error Signed-off-by: Timothy Gerstel --- src/services/ServiceUtils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index c00e79e2..da2bebf6 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -72,6 +72,7 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< } if (error.toString().includes(MKDIR_ERROR_BADARGS)) { console.info("Wasn't able to create: '" + dir + "'. Problem with using mkdir. Method usage is not implemented (bad arguments?)"); + return false; } console.warn(error); return false; From b392b3eade4ac8d64ca4d13eb8f180334fb8ea11 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 16:53:11 -0400 Subject: [PATCH 172/455] Set state false when validating locations: Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 923bcb77..d31d623a 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -229,6 +229,7 @@ const Planning = () => { } const validateLocations = (e: any, click?: boolean) => { + setPlanningState(false); if(planningStatus && !isLocationsUpdated && !click) { setLocValidations(true); From d318a828f9a951997261f5a3bb033a9a55c489d8 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 17:07:56 -0400 Subject: [PATCH 173/455] Fix makeDir infinite loop with invalid dir Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 1 + src/services/ServiceUtils.ts | 12 +++--------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index d31d623a..12fede2a 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -230,6 +230,7 @@ const Planning = () => { const validateLocations = (e: any, click?: boolean) => { setPlanningState(false); + setLocValidations(false); if(planningStatus && !isLocationsUpdated && !click) { setLocValidations(true); diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index da2bebf6..3b75bf30 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -61,11 +61,8 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< } catch (error) { if (error.toString().includes(MKDIR_ERROR_PARENT)) { let parentDir = reducePath(dir); - if (parentDir !== "/") { - console.info("Wasn't able to create: '" + dir + "'. Will attempt to create: " + parentDir); - await makeDir(config, parentDir); - return makeDir(config, dir); - } + console.info("Wasn't able to create: '" + dir + "'. Will attempt to create: " + parentDir); + return makeDir(config, parentDir); } if (error.toString().includes(MKDIR_ERROR_EXISTS)) { return true; @@ -83,10 +80,7 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< // /u/tsxxx/blaa --> /u/tsxxx export function reducePath(path: string): string { - if (path.lastIndexOf('/') > 0) { - path = path.slice(0, path.lastIndexOf('/')); - } - return path; // stops at "/" + return path.substring(0, path.lastIndexOf('/')); } // This adds a "\n" inside Unix commands separated by ";" if char limit reached From 3d890364fe09eaa0759c54e8e35688763cac2d22 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 17:25:22 -0400 Subject: [PATCH 174/455] Add error message for failure Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 0ec17685..40e2a8dc 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -613,7 +613,8 @@ export class FTPInstallation extends Installation { const serverCommonPath = `${installDir}/schemas/server-common.json`; const serverCommon = await new FileTransfer().download(connectionArgs, serverCommonPath, DataType.ASCII); return {status: true, details: {yaml, yamlSchema, serverCommon}}; - } catch { + } catch (e) { + console.log("Error downloading example-zowe.yaml and schemas:", e.message); return {status: false, details: {yaml: '', yamlSchema: '', serverCommon: ''}} } } From 901e592d3f2d5fb1c67c6dd28c36a97f92de5278 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 14 Jun 2024 17:28:20 -0400 Subject: [PATCH 175/455] Use correct installation args Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Stepper.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 78b58704..5a340531 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -28,13 +28,14 @@ import eventDispatcher from '../../../services/eventDispatcher'; import Warning from '@mui/icons-material/Warning'; import CheckCircle from '@mui/icons-material/CheckCircle'; import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, INIT_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, UNPAX_STAGE_LABEL } from '../common/Constants'; -import { getProgress, getCompleteProgress, mapAndSetSkipStatus, mapAndGetSkipStatus, getInstallationArguments } from '../stages/progress/StageProgressStatus'; +import { getProgress, getCompleteProgress, mapAndSetSkipStatus, mapAndGetSkipStatus } from '../stages/progress/StageProgressStatus'; import '../../styles/Stepper.css'; import { StepIcon } from '@mui/material'; import { getStageDetails } from '../../../services/StageDetails'; import { IResponse } from '../../../types/interfaces'; import { selectConnectionArgs } from '../stages/connection/connectionSlice'; +import { selectInstallationArgs } from '../stages/installation/installationSlice'; // TODO: define props, stages, stage interfaces // TODO: One rule in the store to enable/disable button @@ -74,7 +75,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const [contentType, setContentType] = useState('output'); const [editorVisible, setEditorVisible] = useState(false); const [editorContent, setEditorContent] = useState(''); - const [installationArgs] = useState(getInstallationArguments()); + const installationArgs = useAppSelector(selectInstallationArgs); const connectionArgs = useAppSelector(selectConnectionArgs); const dispatch = useAppDispatch(); From 074df49ab0c263cc966a5629f415a948821ca158 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Sat, 15 Jun 2024 14:42:25 -0400 Subject: [PATCH 176/455] Hide the scarier error Signed-off-by: Leanid Astrakou --- src/services/ServiceUtils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index c00e79e2..cffbc672 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -72,8 +72,9 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< } if (error.toString().includes(MKDIR_ERROR_BADARGS)) { console.info("Wasn't able to create: '" + dir + "'. Problem with using mkdir. Method usage is not implemented (bad arguments?)"); + } else { + console.warn(error); } - console.warn(error); return false; } finally { client.close(); From b27ec708f26c15f5d119b10f3e350ade92f74647 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 09:37:25 -0400 Subject: [PATCH 177/455] Remove installationArgs from editor Signed-off-by: Timothy Gerstel --- src/renderer/components/common/EditorDialog.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index 24a237c9..7b86db5d 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -79,6 +79,7 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC try { // To parse the yaml and convert it to the javascript object jsonData = parse(newCode); + delete jsonData.installationArgs; } catch (error) { console.error('Error parsing YAML:', error); jsonData = newCode; From 05d013366b9d3d06453c44dba1216cdeb0c6ecc1 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 09:56:50 -0400 Subject: [PATCH 178/455] Fix verify certs not updating in yaml Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 9b5846d1..71930f30 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -224,7 +224,9 @@ const Certificates = () => { id="demo-simple-select" value={verifyCerts} onChange={(e) => { - window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml?.zowe, verifyCertificates: e.target.value}}); + const newConfig = {...yaml, zowe: {...yaml?.zowe, verifyCertificates: e.target.value}}; + window.electron.ipcRenderer.setConfig(newConfig); + setLYaml(newConfig) setVerifyCerts(e.target.value); }} > From 1447dac60014c187b796f9b481a2336a0f4b6db8 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 10:21:59 -0400 Subject: [PATCH 179/455] Add error popup to certificates stage Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 71930f30..748c0371 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -160,8 +160,13 @@ const Certificates = () => { updateProgress(false); event.preventDefault(); window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { - updateProgress(res.status); clearInterval(timer); + updateProgress(res.status); + if(!res.status){ + window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details)).then((res: any) => { + toggleEditorVisibility("output"); + }) + } }).catch(() => { clearInterval(timer); updateProgress(false); From 0c22f631d48f103411222a595d09e20eaf02052b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 10:27:01 -0400 Subject: [PATCH 180/455] Format output Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 748c0371..2ea4b564 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -163,7 +163,7 @@ const Certificates = () => { clearInterval(timer); updateProgress(res.status); if(!res.status){ - window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details)).then((res: any) => { + window.electron.ipcRenderer.setStandardOutput(JSON.stringify(JSON.stringify(res.details, null, 2))).then((res: any) => { toggleEditorVisibility("output"); }) } From ed6b5bf27c4c7687f65e136b6eff4234e1a0013e Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 10:32:21 -0400 Subject: [PATCH 181/455] Fix typo, this might not even make the outputl ook good anyway Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 2ea4b564..06851bde 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -163,7 +163,7 @@ const Certificates = () => { clearInterval(timer); updateProgress(res.status); if(!res.status){ - window.electron.ipcRenderer.setStandardOutput(JSON.stringify(JSON.stringify(res.details, null, 2))).then((res: any) => { + window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details, null, 2)).then((res: any) => { toggleEditorVisibility("output"); }) } From e87fb3a682768eb009153058e7ed33ac8bf2b08b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 10:39:46 -0400 Subject: [PATCH 182/455] Fetch updated yaml after init certificate Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 40e2a8dc..512f45c1 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -105,12 +105,21 @@ class Installation { yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; } if (installationArgs.javaHome) { + if(yamlObj.java == undefined){ + yamlObj.java = {home: ""} + } yamlObj.java.home = installationArgs.javaHome; } if (installationArgs.nodeHome) { + if(yamlObj.node == undefined){ + yamlObj.node = {home: ""} + } yamlObj.node.home = installationArgs.nodeHome; } if (installationArgs.zosmfHost) { + if(yamlObj.zOSMF == undefined){ + yamlObj.zOSMF = {host: "", port: "443", applId: ""} + } yamlObj.zOSMF.host = installationArgs.zosmfHost; } if (installationArgs.zosmfPort) { @@ -460,7 +469,9 @@ class Installation { const script = `cd ${installationArgs.installationDir + '/bin'};./zwe init certificate --update-config -c ${installationArgs.installationDir}/zowe.yaml`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); - return {status: result.rc === 0, details: result.jobOutput} + const yamlPath = `${installationArgs.installationDir}/zowe.yaml`; + const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); + return {status: result.rc === 0, details: result.jobOutput, updatedYaml: yaml} } public async initVsam(connectionArgs: IIpcConnectionArgs, From 7649fc629297dd6dba4269f69a12e01f5e55f46b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 10:40:16 -0400 Subject: [PATCH 183/455] Set updated yaml from --update-config flag if it exists Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 06851bde..3075eeaf 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -159,13 +159,17 @@ const Certificates = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs).then((res: {status: boolean, details: any, updatedYaml: any}) => { clearInterval(timer); updateProgress(res.status); if(!res.status){ window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details, null, 2)).then((res: any) => { toggleEditorVisibility("output"); }) + if(res.updatedYaml != undefined){ + window.electron.ipcRenderer.setConfig(res.updatedYaml); + dispatch(setYaml(res.updatedYaml)); + } } }).catch(() => { clearInterval(timer); From 0adc2887126a8cd0cc6ba93f500d606c922f5ac0 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 11:01:30 -0400 Subject: [PATCH 184/455] Deep merge object Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 5 +++-- src/renderer/components/stages/Certificates.tsx | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 512f45c1..fedd93f0 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -31,7 +31,7 @@ const zoweDatasetMemberRegexFixed = { "maxLength": 8 } -function deepMerge(base: any, extension:any) { +export function deepMerge(base: any, extension:any) { if (typeof base === "object" && typeof extension === "object") { for (const key in extension) { if (typeof extension[key] === "object") { @@ -471,7 +471,8 @@ class Installation { ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); const yamlPath = `${installationArgs.installationDir}/zowe.yaml`; const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); - return {status: result.rc === 0, details: result.jobOutput, updatedYaml: yaml} + console.log("updated yaml:", parse(yaml)); + return {status: result.rc === 0, details: {jobOutput: result.jobOutput, updatedYaml: parse(yaml)}} } public async initVsam(connectionArgs: IIpcConnectionArgs, diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 3075eeaf..02754a83 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -27,6 +27,7 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { CertInitSubStepsState } from "../../../types/stateInterfaces"; import { TYPE_YAML, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv } from "../common/Constants"; +import { deepMerge } from "../../../actions/InstallationHandler"; const Certificates = () => { @@ -163,12 +164,12 @@ const Certificates = () => { clearInterval(timer); updateProgress(res.status); if(!res.status){ - window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details, null, 2)).then((res: any) => { + window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details.jobOutput, null, 2)).then((res: any) => { toggleEditorVisibility("output"); }) - if(res.updatedYaml != undefined){ - window.electron.ipcRenderer.setConfig(res.updatedYaml); - dispatch(setYaml(res.updatedYaml)); + if(res.details.updatedYaml != undefined){ + window.electron.ipcRenderer.setConfig(deepMerge(yaml, res.details.updatedYaml)); + dispatch(setYaml(deepMerge(yaml, res.details.updatedYaml))); } } }).catch(() => { From b7a3b2b60be7ba8d86dd300df65e3411d141dd5c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 11:02:36 -0400 Subject: [PATCH 185/455] Fix runtime error Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 14 -------------- src/renderer/components/common/Constants.tsx | 15 ++++++++++++++- src/renderer/components/stages/Certificates.tsx | 3 +-- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index fedd93f0..c993d99a 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -31,20 +31,6 @@ const zoweDatasetMemberRegexFixed = { "maxLength": 8 } -export function deepMerge(base: any, extension:any) { - if (typeof base === "object" && typeof extension === "object") { - for (const key in extension) { - if (typeof extension[key] === "object") { - if (!base[key]) base[key] = {}; - deepMerge(base[key], extension[key]); - } else { - Object.assign(base, {[key]: extension[key]}); - } - } - } - return base; -} - class Installation { public async uploadLatestYaml ( diff --git a/src/renderer/components/common/Constants.tsx b/src/renderer/components/common/Constants.tsx index de9c8a0f..66f1e83a 100644 --- a/src/renderer/components/common/Constants.tsx +++ b/src/renderer/components/common/Constants.tsx @@ -36,7 +36,20 @@ export const REVIEW_INSTALL_STAGE_LABEL = "Review Installation"; export const FINISH_INSTALL_STAGE_LABEL = "Finish Installation"; import Ajv2019 from "ajv/dist/2019" -import Ajv from "ajv"; + +export function deepMerge(base: any, extension:any) { + if (typeof base === "object" && typeof extension === "object") { + for (const key in extension) { + if (typeof extension[key] === "object") { + if (!base[key]) base[key] = {}; + deepMerge(base[key], extension[key]); + } else { + Object.assign(base, {[key]: extension[key]}); + } + } + } + return base; +} export const SERVER_COMMON = { "$schema": "https://json-schema.org/draft/2019-09/schema", diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 02754a83..f9b49ce6 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -26,8 +26,7 @@ import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { CertInitSubStepsState } from "../../../types/stateInterfaces"; -import { TYPE_YAML, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv } from "../common/Constants"; -import { deepMerge } from "../../../actions/InstallationHandler"; +import { TYPE_YAML, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv, deepMerge } from "../common/Constants"; const Certificates = () => { From 4f91714c211f2ed075cced418ccb5afa85fda3fa Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 11:07:42 -0400 Subject: [PATCH 186/455] Update import Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index c993d99a..ca3e8a47 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -18,8 +18,7 @@ import { ProgressStore } from "../storage/ProgressStore"; import * as fs from 'fs'; import { ConfigurationStore } from '../storage/ConfigurationStore'; import { InstallationArgs } from '../types/stateInterfaces'; -import { FALLBACK_SCHEMA } from '../renderer/components/common/Constants'; -import { connect } from 'react-redux'; +import { FALLBACK_SCHEMA, deepMerge } from '../renderer/components/common/Constants'; //AJV did not like the regex in our current schema From 8e780c2b012a6a6f2fb0d34a3eae1004e98423bc Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 11:12:34 -0400 Subject: [PATCH 187/455] Move updatedYaml logic to correct location Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 1 - src/renderer/components/stages/Certificates.tsx | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index ca3e8a47..cc99fc5a 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -456,7 +456,6 @@ class Installation { ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); const yamlPath = `${installationArgs.installationDir}/zowe.yaml`; const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); - console.log("updated yaml:", parse(yaml)); return {status: result.rc === 0, details: {jobOutput: result.jobOutput, updatedYaml: parse(yaml)}} } diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index f9b49ce6..e65fcdfa 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -159,17 +159,17 @@ const Certificates = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs).then((res: {status: boolean, details: any, updatedYaml: any}) => { + window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { clearInterval(timer); updateProgress(res.status); if(!res.status){ window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details.jobOutput, null, 2)).then((res: any) => { toggleEditorVisibility("output"); }) - if(res.details.updatedYaml != undefined){ - window.electron.ipcRenderer.setConfig(deepMerge(yaml, res.details.updatedYaml)); - dispatch(setYaml(deepMerge(yaml, res.details.updatedYaml))); - } + } + if(res.details.updatedYaml != undefined){ + window.electron.ipcRenderer.setConfig(deepMerge(yaml, res.details.updatedYaml)); + dispatch(setYaml(deepMerge(yaml, res.details.updatedYaml))); } }).catch(() => { clearInterval(timer); From 02b6a196d8ba9658b9b26bc60381569596ce6b79 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 11:14:31 -0400 Subject: [PATCH 188/455] Update init status on app start Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/connection/Connection.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index bc61083e..43360e46 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -29,11 +29,11 @@ import { IResponse } from '../../../../types/interfaces'; import { setConnectionValidationDetails, setHost, setPort, setUser, setPassword, setSecure, setSecureOptions, selectConnectionArgs, setAcceptCertificates, selectConnectionSecure, selectConnectionValidationDetails, selectAcceptCertificates, selectResumeProgress} from './connectionSlice'; import { setLoading, setNextStepEnabled, selectZoweCLIVersion } from '../../configuration-wizard/wizardSlice'; -import { setConnectionStatus, selectConnectionStatus} from '../progress/progressSlice'; +import { setConnectionStatus, selectConnectionStatus, setInitializationStatus} from '../progress/progressSlice'; import { Container } from "@mui/material"; import { alertEmitter } from "../../Header"; import { getStageDetails, initStageSkipStatus } from "../../../../services/StageDetails"; -import { initializeProgress, getActiveStage } from "../progress/StageProgressStatus"; +import { initializeProgress, getActiveStage, isInitComplete } from "../progress/StageProgressStatus"; import eventDispatcher from "../../../../services/eventDispatcher"; const Connection = () => { @@ -133,6 +133,7 @@ const FTPConnectionForm = () => { dispatch(setConnectionStatus(res.status)); if(res.status) { dispatch(setNextStepEnabled(true)); + dispatch(setInitializationStatus(isInitComplete())); initializeProgress(connectionArgs.host, connectionArgs.user); initStageSkipStatus(); setResume(); From 37a90af7988b36f388bf36b0c6d7c2d68a2d7b84 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 11:15:17 -0400 Subject: [PATCH 189/455] Unset because New Installtion is supposed to reset the state anyway so resume probably handles this?? Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/connection/Connection.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 43360e46..bc61083e 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -29,11 +29,11 @@ import { IResponse } from '../../../../types/interfaces'; import { setConnectionValidationDetails, setHost, setPort, setUser, setPassword, setSecure, setSecureOptions, selectConnectionArgs, setAcceptCertificates, selectConnectionSecure, selectConnectionValidationDetails, selectAcceptCertificates, selectResumeProgress} from './connectionSlice'; import { setLoading, setNextStepEnabled, selectZoweCLIVersion } from '../../configuration-wizard/wizardSlice'; -import { setConnectionStatus, selectConnectionStatus, setInitializationStatus} from '../progress/progressSlice'; +import { setConnectionStatus, selectConnectionStatus} from '../progress/progressSlice'; import { Container } from "@mui/material"; import { alertEmitter } from "../../Header"; import { getStageDetails, initStageSkipStatus } from "../../../../services/StageDetails"; -import { initializeProgress, getActiveStage, isInitComplete } from "../progress/StageProgressStatus"; +import { initializeProgress, getActiveStage } from "../progress/StageProgressStatus"; import eventDispatcher from "../../../../services/eventDispatcher"; const Connection = () => { @@ -133,7 +133,6 @@ const FTPConnectionForm = () => { dispatch(setConnectionStatus(res.status)); if(res.status) { dispatch(setNextStepEnabled(true)); - dispatch(setInitializationStatus(isInitComplete())); initializeProgress(connectionArgs.host, connectionArgs.user); initStageSkipStatus(); setResume(); From a95dfbdf1e3c31f7e206eb12a5125f276a894599 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 11:45:15 -0400 Subject: [PATCH 190/455] Proper merging Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 10 ++++++++-- src/renderer/components/stages/Certificates.tsx | 9 +++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index cc99fc5a..32aa102a 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -455,8 +455,14 @@ class Installation { const result = await new Script().run(connectionArgs, script); ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); const yamlPath = `${installationArgs.installationDir}/zowe.yaml`; - const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); - return {status: result.rc === 0, details: {jobOutput: result.jobOutput, updatedYaml: parse(yaml)}} + const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.BINARY); + var parsedYaml; + try{ + parsedYaml = parse(yaml); + } catch (e){ + console.log('error parsing yaml:', e.message); + } + return {status: result.rc === 0, details: {jobOutput: result.jobOutput, updatedYaml: parsedYaml}} } public async initVsam(connectionArgs: IIpcConnectionArgs, diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index e65fcdfa..24e69b7b 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -168,13 +168,14 @@ const Certificates = () => { }) } if(res.details.updatedYaml != undefined){ - window.electron.ipcRenderer.setConfig(deepMerge(yaml, res.details.updatedYaml)); - dispatch(setYaml(deepMerge(yaml, res.details.updatedYaml))); + const merge = deepMerge(res.details.updatedYaml, yaml); + window.electron.ipcRenderer.setConfig(merge); + dispatch(setYaml(merge)); } - }).catch(() => { + }).catch((e: any) => { clearInterval(timer); updateProgress(false); - console.warn('zwe init certificate failed'); + console.warn('zwe init certificate failed', e); }); } From 78e1777b7b0fce2ea8de2973cc26dc97abba9e3a Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 12:50:02 -0400 Subject: [PATCH 191/455] Remove yaml downloading Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 32aa102a..1539616b 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -455,14 +455,17 @@ class Installation { const result = await new Script().run(connectionArgs, script); ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); const yamlPath = `${installationArgs.installationDir}/zowe.yaml`; - const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.BINARY); - var parsedYaml; - try{ - parsedYaml = parse(yaml); - } catch (e){ - console.log('error parsing yaml:', e.message); - } - return {status: result.rc === 0, details: {jobOutput: result.jobOutput, updatedYaml: parsedYaml}} + // const tagScript = `chtag -t -c ISO8859-1 ${yamlPath}`; + // const tagResult = await new Script().run(connectionArgs, tagScript); + // const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); + // var parsedYaml; + // try{ + // parsedYaml = parse(yaml); + // console.log("parsed yaml:", parsedYaml); + // } catch (e){ + // console.log('error parsing yaml:', e.message); + // } + return {status: result.rc === 0, details: {jobOutput: result.jobOutput}} } public async initVsam(connectionArgs: IIpcConnectionArgs, From 7869a0627905e99577b2ef8a5ae52e3e8aaff3f0 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 12:55:59 -0400 Subject: [PATCH 192/455] Fix yaml download logic Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 1539616b..1e1ada7c 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -457,15 +457,14 @@ class Installation { const yamlPath = `${installationArgs.installationDir}/zowe.yaml`; // const tagScript = `chtag -t -c ISO8859-1 ${yamlPath}`; // const tagResult = await new Script().run(connectionArgs, tagScript); - // const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); - // var parsedYaml; - // try{ - // parsedYaml = parse(yaml); - // console.log("parsed yaml:", parsedYaml); - // } catch (e){ - // console.log('error parsing yaml:', e.message); - // } - return {status: result.rc === 0, details: {jobOutput: result.jobOutput}} + const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); + var parsedYaml; + try{ + parsedYaml = parse(yaml); + } catch (e){ + console.log('error parsing yaml:', e.message); + } + return {status: result.rc === 0, details: {jobOutput: result.jobOutput, updatedYaml: JSON.parse(JSON.stringify(parsedYaml))}} } public async initVsam(connectionArgs: IIpcConnectionArgs, From 6c2c9cee3ea8cef1c8c80c4ee9cc2a56f8c4c65f Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 15:24:43 -0400 Subject: [PATCH 193/455] Move parsing into try catch Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 1e1ada7c..88797732 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -460,11 +460,11 @@ class Installation { const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); var parsedYaml; try{ - parsedYaml = parse(yaml); + parsedYaml = JSON.parse(JSON.stringify(parse(yaml))); } catch (e){ console.log('error parsing yaml:', e.message); } - return {status: result.rc === 0, details: {jobOutput: result.jobOutput, updatedYaml: JSON.parse(JSON.stringify(parsedYaml))}} + return {status: result.rc === 0, details: {jobOutput: result.jobOutput, updatedYaml: parsedYaml}} } public async initVsam(connectionArgs: IIpcConnectionArgs, From 09834eba7ec02a893135b7a6c7e68b2cc06c58e8 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 17:17:17 -0400 Subject: [PATCH 194/455] Do not store password Signed-off-by: Timothy Gerstel --- src/actions/ConnectionHandler.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/actions/ConnectionHandler.ts b/src/actions/ConnectionHandler.ts index df669587..ebe9f0a6 100644 --- a/src/actions/ConnectionHandler.ts +++ b/src/actions/ConnectionHandler.ts @@ -46,8 +46,11 @@ export class FTPConnection extends Connection { const details = Object.keys(args).reduce((acc: string, k: keyof IIpcConnectionArgs) => { const value = (typeof args[k] == 'number') ? args[k].toString() : args[k]; - const status = ConnectionStore.set(`ftp-details.${k}`, value); - return acc + status ? '' : `\n Can't set ftp-details.${k}, check the store schema`; + if(k != "password"){ + const status = ConnectionStore.set(`ftp-details.${k}`, value); + return acc + status ? '' : `\n Can't set ftp-details.${k}, check the store schema`; + } + return; }, ""); return {status: true, details} } From fa8886fca883a9e732468c596fc7434e506e468a Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 17:26:57 -0400 Subject: [PATCH 195/455] Reset state on new install Signed-off-by: Timothy Gerstel --- .../stages/connection/Connection.tsx | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index bc61083e..a1171f13 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -27,14 +27,15 @@ import ContainerCard from '../../common/ContainerCard'; import { useAppSelector, useAppDispatch } from '../../../hooks'; import { IResponse } from '../../../../types/interfaces'; import { setConnectionValidationDetails, setHost, setPort, - setUser, setPassword, setSecure, setSecureOptions, selectConnectionArgs, setAcceptCertificates, selectConnectionSecure, selectConnectionValidationDetails, selectAcceptCertificates, selectResumeProgress} from './connectionSlice'; + setUser, setSecure, setSecureOptions, selectConnectionArgs, setAcceptCertificates, selectConnectionSecure, selectConnectionValidationDetails, selectAcceptCertificates, selectResumeProgress, setConnectionArgs, setPassword} from './connectionSlice'; import { setLoading, setNextStepEnabled, selectZoweCLIVersion } from '../../configuration-wizard/wizardSlice'; -import { setConnectionStatus, selectConnectionStatus} from '../progress/progressSlice'; +import { setConnectionStatus, selectConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setDownloadUnpaxStatus, setInitializationStatus, setDatasetInstallationStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setCertificateStatus, setVsamStatus} from '../progress/progressSlice'; import { Container } from "@mui/material"; import { alertEmitter } from "../../Header"; import { getStageDetails, initStageSkipStatus } from "../../../../services/StageDetails"; -import { initializeProgress, getActiveStage } from "../progress/StageProgressStatus"; +import { initializeProgress, getActiveStage, setPlanningStageStatus } from "../progress/StageProgressStatus"; import eventDispatcher from "../../../../services/eventDispatcher"; +import { setLocationValidationDetails } from "../PlanningSlice"; const Connection = () => { @@ -115,6 +116,26 @@ const FTPConnectionForm = () => { const [isResume, setIsResume] = useState(useAppSelector(selectResumeProgress)); + useEffect(() => { + if(!isResume){ + dispatch(setConnectionStatus(false)); + dispatch(setPlanningStatus(false)); + dispatch(setInstallationTypeStatus(false)); + dispatch(setDownloadUnpaxStatus(false)); + dispatch(setInitializationStatus(false)); + dispatch(setDatasetInstallationStatus(false)); + dispatch(setNetworkingStatus(false)); + dispatch(setApfAuthStatus(false)); + dispatch(setSecurityStatus(false)); + dispatch(setCertificateStatus(false)); + dispatch(setVsamStatus(false)); + dispatch(setNetworkingStatus(false)); + dispatch(setLocationValidationDetails(false)); + setPlanningStageStatus("isLocationValid", false) //whyyyy does this exist + setPlanningStageStatus("isJobStatementValid", false) + } + }, []); + const handleFormChange = (ftpConnection?:boolean, acceptCerts?:boolean) => { dispatch(setConnectionStatus(false)); dispatch(setNextStepEnabled(false)); From 2b5ab0712a7284a1803032f4804fc1a1c7e629fe Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 17 Jun 2024 17:30:48 -0400 Subject: [PATCH 196/455] Remove comment but i still believe this setter to be redundant Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/connection/Connection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index a1171f13..86f1b556 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -131,7 +131,7 @@ const FTPConnectionForm = () => { dispatch(setVsamStatus(false)); dispatch(setNetworkingStatus(false)); dispatch(setLocationValidationDetails(false)); - setPlanningStageStatus("isLocationValid", false) //whyyyy does this exist + setPlanningStageStatus("isLocationValid", false) setPlanningStageStatus("isJobStatementValid", false) } }, []); From 8e22060af846ba13a50111c6036b7a5439a8e14d Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 18 Jun 2024 18:46:09 +0530 Subject: [PATCH 197/455] Updating the stepper --- src/renderer/components/common/Stepper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index d3402ccd..aa75fa7d 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -176,7 +176,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const getStepIcon = (error: any, stageId: number, isSubStep?: boolean, subStepId?: number) => { - if (!error || (isSubStep && getProgress(stages[stageId].subStages[subStepId].statusKey)) || (!isSubStep && getProgress(stages[stageId].statusKey))) { + if ((isSubStep && getProgress(stages[stageId].subStages[subStepId].statusKey)) || (!isSubStep && getProgress(stages[stageId].statusKey))) { return } />; } From 79cff237c77145a11e9aadec1fc47b701bcdb3ab Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 18 Jun 2024 18:46:43 +0530 Subject: [PATCH 198/455] Passthrough --- src/renderer/components/stages/installation/Installation.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 684f8ed6..99d0a50f 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -173,6 +173,7 @@ const Installation = () => { }) dispatch(setNextStepEnabled(getProgress('datasetInstallationStatus'))); + dispatch(setNextStepEnabled(true)); if(installationType === 'smpe') { const status = getProgress('datasetInstallationStatus'); From 543762a53bc3f4745279e5fc11790ceb5e29eabc Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 18 Jun 2024 17:35:41 -0400 Subject: [PATCH 199/455] Better error handling for init certificate failure Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 24e69b7b..621fae16 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -176,6 +176,9 @@ const Certificates = () => { clearInterval(timer); updateProgress(false); console.warn('zwe init certificate failed', e); + window.electron.ipcRenderer.setStandardOutput(`zwe init certificate failed: ${e}`).then((res: any) => { + toggleEditorVisibility("output"); + }) }); } From f2f0ecb71cb2edca59420ed639275b753418b8fd Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 18 Jun 2024 17:36:55 -0400 Subject: [PATCH 200/455] Better error handling for init mvs Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 2f6ddfe5..3ce2ce26 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -281,6 +281,9 @@ const Installation = () => { installProceedActions(false); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; stages[STAGE_ID].isSkipped = true; + window.electron.ipcRenderer.setStandardOutput(`zwe init certificate failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) if (typeof err === "string") { console.warn('Installation failed', err); } else { From 3b104f597824f2677a93baa2f450244576d31d4c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 18 Jun 2024 17:37:23 -0400 Subject: [PATCH 201/455] certificate -> mvs Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 3ce2ce26..d34ba84a 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -281,7 +281,7 @@ const Installation = () => { installProceedActions(false); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; stages[STAGE_ID].isSkipped = true; - window.electron.ipcRenderer.setStandardOutput(`zwe init certificate failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + window.electron.ipcRenderer.setStandardOutput(`zwe init mvs failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { toggleEditorVisibility("output"); }) if (typeof err === "string") { From 918057839e6acbfd56f92ed1567b2bdd8cb05482 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 18 Jun 2024 17:39:12 -0400 Subject: [PATCH 202/455] Add error handling for init apfauth, remove redundant console.warn Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/InitApfAuth.tsx | 8 +++----- .../components/stages/installation/Installation.tsx | 5 ----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 43d7a5e1..8e90f142 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -195,11 +195,9 @@ const InitApfAuth = () => { //alertEmitter.emit('showAlert', err.toString(), 'error'); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; stages[STAGE_ID].isSkipped = true; - if (typeof err === "string") { - console.warn('zwe init apfauth failed', err); - } else { - console.warn('zwe init apfauth failed', err?.toString()); // toString() throws run-time error on undefined or null - } + window.electron.ipcRenderer.setStandardOutput(`zwe init apfauth failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) }); } diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index d34ba84a..34997f1e 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -284,11 +284,6 @@ const Installation = () => { window.electron.ipcRenderer.setStandardOutput(`zwe init mvs failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { toggleEditorVisibility("output"); }) - if (typeof err === "string") { - console.warn('Installation failed', err); - } else { - console.warn('Installation failed', err?.toString()); // toString() throws run-time error on undefined or null - } }); }) From fff1709776aa308a8927bd23fedd4fbd17a898d9 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 18 Jun 2024 17:39:44 -0400 Subject: [PATCH 203/455] Better error handling for security Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Security.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 2517504c..1a0eea03 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -189,11 +189,9 @@ const Security = () => { securityProceedActions(false); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; stages[STAGE_ID].isSkipped = true; - if (typeof err === "string") { - console.warn('zwe init security failed', err); - } else { - console.warn('zwe init security failed', err?.toString()); // toString() throws run-time error on undefined or null - } + window.electron.ipcRenderer.setStandardOutput(`zwe init security failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) }); } From 61c62004c8a8d2be08ed3c1e79545639467d83b5 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 18 Jun 2024 17:40:23 -0400 Subject: [PATCH 204/455] Reset stc stage on new installation Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/connection/Connection.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 86f1b556..2614cd02 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -29,7 +29,7 @@ import { IResponse } from '../../../../types/interfaces'; import { setConnectionValidationDetails, setHost, setPort, setUser, setSecure, setSecureOptions, selectConnectionArgs, setAcceptCertificates, selectConnectionSecure, selectConnectionValidationDetails, selectAcceptCertificates, selectResumeProgress, setConnectionArgs, setPassword} from './connectionSlice'; import { setLoading, setNextStepEnabled, selectZoweCLIVersion } from '../../configuration-wizard/wizardSlice'; -import { setConnectionStatus, selectConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setDownloadUnpaxStatus, setInitializationStatus, setDatasetInstallationStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setCertificateStatus, setVsamStatus} from '../progress/progressSlice'; +import { setConnectionStatus, selectConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setDownloadUnpaxStatus, setInitializationStatus, setDatasetInstallationStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setCertificateStatus, setVsamStatus, setStcsStatus} from '../progress/progressSlice'; import { Container } from "@mui/material"; import { alertEmitter } from "../../Header"; import { getStageDetails, initStageSkipStatus } from "../../../../services/StageDetails"; @@ -129,6 +129,7 @@ const FTPConnectionForm = () => { dispatch(setSecurityStatus(false)); dispatch(setCertificateStatus(false)); dispatch(setVsamStatus(false)); + dispatch(setStcsStatus(false)); dispatch(setNetworkingStatus(false)); dispatch(setLocationValidationDetails(false)); setPlanningStageStatus("isLocationValid", false) From 738b6f0beb6f719a1f8b38c3c502d8686072abc5 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 18 Jun 2024 17:41:33 -0400 Subject: [PATCH 205/455] Better error handling for init stc Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Stcs.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 4d13f659..2f52e5bd 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -185,10 +185,12 @@ const Stcs = () => { alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); } clearInterval(timer); - }).catch((error: any) => { + }).catch((err: any) => { clearInterval(timer); updateProgress(false); - console.warn('zwe init stcs failed'); + window.electron.ipcRenderer.setStandardOutput(`zwe init stc failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) }); } From d79c021c50150796f8995eed27bab1e8a02d65e1 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 18 Jun 2024 17:42:06 -0400 Subject: [PATCH 206/455] Better error handling for init vsam Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Vsam.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 5d2cd778..c0bb9122 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -180,10 +180,12 @@ const Vsam = () => { alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); } clearInterval(timer); - }).catch((error: any) => { + }).catch((err: any) => { clearInterval(timer); updateProgress(false); - console.warn('zwe init vsam failed'); + window.electron.ipcRenderer.setStandardOutput(`zwe init vsam failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) }); } From e03f2610f065386fe91622eee95f263ae1ae1e4d Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 09:53:31 -0400 Subject: [PATCH 207/455] Update tag script for yaml Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 88797732..e55ced7b 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -559,8 +559,8 @@ export class FTPInstallation extends Installation { const filePath = path.join(installDir, "zowe.yaml"); console.log(`Uploading ${tempPath} to ${filePath}`) await new FileTransfer().upload(connectionArgs, tempPath, filePath, DataType.BINARY) - console.log("Check out this install arg! " + installDir); - const script = `chtag -t -c ISO8859-1 ${installDir}/zowe.yaml`; + // console.log("Check out this install arg! " + installDir); + const script = `cat zowe.yaml | grep 'zowe' > /dev/null; if [ $? -eq 0 ]; then if [ $(chtag -p zowe.yaml | cut -f 2 -d" ") != "untagged" ]; then iconv -f iso8859-1 -t 1047 zowe.yaml > zowe.yaml.1047; mv zowe.yaml.1047 zowe.yaml; chtag -tc 1047 zowe.yaml; fi; else iconv -f iso8859-1 -t 1047 zowe.yaml > zowe.yaml.1047; mv zowe.yaml.1047 zowe.yaml; chtag -tc 1047 zowe.yaml; fi`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } From ca17edda5200151a26d6b9f0a3758566379801d8 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 10:02:32 -0400 Subject: [PATCH 208/455] use filePath Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index e55ced7b..62e7dbfe 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -560,7 +560,7 @@ export class FTPInstallation extends Installation { console.log(`Uploading ${tempPath} to ${filePath}`) await new FileTransfer().upload(connectionArgs, tempPath, filePath, DataType.BINARY) // console.log("Check out this install arg! " + installDir); - const script = `cat zowe.yaml | grep 'zowe' > /dev/null; if [ $? -eq 0 ]; then if [ $(chtag -p zowe.yaml | cut -f 2 -d" ") != "untagged" ]; then iconv -f iso8859-1 -t 1047 zowe.yaml > zowe.yaml.1047; mv zowe.yaml.1047 zowe.yaml; chtag -tc 1047 zowe.yaml; fi; else iconv -f iso8859-1 -t 1047 zowe.yaml > zowe.yaml.1047; mv zowe.yaml.1047 zowe.yaml; chtag -tc 1047 zowe.yaml; fi`; + const script = `cat ${filePath} | grep 'zowe' > /dev/null; if [ $? -eq 0 ]; then if [ $(chtag -p ${filePath} | cut -f 2 -d" ") != "untagged" ]; then iconv -f iso8859-1 -t 1047 ${filePath} > ${filePath}.1047; mv ${filePath}.1047 ${filePath}; chtag -tc 1047 ${filePath}; fi; else iconv -f iso8859-1 -t 1047 ${filePath} > ${filePath}.1047; mv ${filePath}.1047 ${filePath}; chtag -tc 1047 ${filePath}; fi`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } From cdebefe57f6fa472a72fc766630a092dd5526916 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 10:05:51 -0400 Subject: [PATCH 209/455] Does it need a tag first?? Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 62e7dbfe..fc6bad0c 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -560,7 +560,7 @@ export class FTPInstallation extends Installation { console.log(`Uploading ${tempPath} to ${filePath}`) await new FileTransfer().upload(connectionArgs, tempPath, filePath, DataType.BINARY) // console.log("Check out this install arg! " + installDir); - const script = `cat ${filePath} | grep 'zowe' > /dev/null; if [ $? -eq 0 ]; then if [ $(chtag -p ${filePath} | cut -f 2 -d" ") != "untagged" ]; then iconv -f iso8859-1 -t 1047 ${filePath} > ${filePath}.1047; mv ${filePath}.1047 ${filePath}; chtag -tc 1047 ${filePath}; fi; else iconv -f iso8859-1 -t 1047 ${filePath} > ${filePath}.1047; mv ${filePath}.1047 ${filePath}; chtag -tc 1047 ${filePath}; fi`; + const script = `chtag -t -c ISO8859-1 ${installDir}/zowe.yaml; cat ${filePath} | grep 'zowe' > /dev/null; if [ $? -eq 0 ]; then if [ $(chtag -p ${filePath} | cut -f 2 -d" ") != "untagged" ]; then iconv -f iso8859-1 -t 1047 ${filePath} > ${filePath}.1047; mv ${filePath}.1047 ${filePath}; chtag -tc 1047 ${filePath}; fi; else iconv -f iso8859-1 -t 1047 ${filePath} > ${filePath}.1047; mv ${filePath}.1047 ${filePath}; chtag -tc 1047 ${filePath}; fi`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } From d5a0704d1a01743c1c66e7c9d3ed1402ad33d1e9 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 14:57:19 -0400 Subject: [PATCH 210/455] Fix status resetting when going back from a successful install Signed-off-by: Timothy Gerstel --- src/renderer/components/Home.tsx | 26 ++++++++++++++++--- .../stages/connection/Connection.tsx | 21 --------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index e7f9510c..4aa8f22a 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -15,18 +15,18 @@ import { Box, Card, CardContent, CardMedia, Typography, Button } from '@mui/mate import flatten, { unflatten } from 'flat'; import { IResponse, IIpcConnectionArgs } from '../../types/interfaces'; import { setConnectionArgs, setResumeProgress, selectInitJobStatement } from './stages/connection/connectionSlice'; -import { setJobStatement } from './stages/PlanningSlice'; +import { setJobStatement, setLocationValidationDetails } from './stages/PlanningSlice'; import { selectSchema, selectYaml, setSchema, setYaml, setZoweCLIVersion } from './configuration-wizard/wizardSlice'; import { useAppDispatch, useAppSelector } from '../hooks'; import { Tooltip } from '@mui/material'; import installationImg from '../assets/installation.png' import installationDryImg from '../assets/installation-dry-run.png' import eventDispatcher from "../../services/eventDispatcher"; -import { selectConnectionStatus} from './stages/progress/progressSlice'; +import { selectConnectionStatus, setApfAuthStatus, setCertificateStatus, setConnectionStatus, setDatasetInstallationStatus, setDownloadUnpaxStatus, setInitializationStatus, setInstallationTypeStatus, setNetworkingStatus, setPlanningStatus, setSecurityStatus, setStcsStatus, setVsamStatus} from './stages/progress/progressSlice'; import HorizontalLinearStepper from './common/Stepper'; import Wizard from './configuration-wizard/Wizard' import { ActiveState } from '../../types/stateInterfaces'; -import { getInstallationArguments, getPreviousInstallation } from './stages/progress/StageProgressStatus'; +import { getInstallationArguments, getPreviousInstallation, setPlanningStageStatus } from './stages/progress/StageProgressStatus'; import { DEF_NO_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from './common/Constants'; import { selectInstallationArgs, setInstallationArgs } from './stages/installation/installationSlice'; @@ -59,6 +59,7 @@ const cards: Array = [ const makeCard = (card: ICard) => { const {id, name, description, link, media} = card; + const dispatch = useAppDispatch(); return ( @@ -68,7 +69,24 @@ const makeCard = (card: ICard) => { image={media} /> - + { + dispatch(setConnectionStatus(false)); + dispatch(setPlanningStatus(false)); + dispatch(setInstallationTypeStatus(false)); + dispatch(setDownloadUnpaxStatus(false)); + dispatch(setInitializationStatus(false)); + dispatch(setDatasetInstallationStatus(false)); + dispatch(setNetworkingStatus(false)); + dispatch(setApfAuthStatus(false)); + dispatch(setSecurityStatus(false)); + dispatch(setCertificateStatus(false)); + dispatch(setVsamStatus(false)); + dispatch(setStcsStatus(false)); + dispatch(setNetworkingStatus(false)); + dispatch(setLocationValidationDetails(false)); + setPlanningStageStatus("isLocationValid", false) + setPlanningStageStatus("isJobStatementValid", false) + }}> {name} diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 2614cd02..87be8f3c 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -116,27 +116,6 @@ const FTPConnectionForm = () => { const [isResume, setIsResume] = useState(useAppSelector(selectResumeProgress)); - useEffect(() => { - if(!isResume){ - dispatch(setConnectionStatus(false)); - dispatch(setPlanningStatus(false)); - dispatch(setInstallationTypeStatus(false)); - dispatch(setDownloadUnpaxStatus(false)); - dispatch(setInitializationStatus(false)); - dispatch(setDatasetInstallationStatus(false)); - dispatch(setNetworkingStatus(false)); - dispatch(setApfAuthStatus(false)); - dispatch(setSecurityStatus(false)); - dispatch(setCertificateStatus(false)); - dispatch(setVsamStatus(false)); - dispatch(setStcsStatus(false)); - dispatch(setNetworkingStatus(false)); - dispatch(setLocationValidationDetails(false)); - setPlanningStageStatus("isLocationValid", false) - setPlanningStageStatus("isJobStatementValid", false) - } - }, []); - const handleFormChange = (ftpConnection?:boolean, acceptCerts?:boolean) => { dispatch(setConnectionStatus(false)); dispatch(setNextStepEnabled(false)); From ad31f8e021bf720237ca74410d865efb9d296347 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 14:58:08 -0400 Subject: [PATCH 211/455] Fix apf auth status not resetting on re init Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/InitApfAuth.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 8e90f142..ce8dc4ec 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -167,6 +167,7 @@ const InitApfAuth = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); + dispatch(setApfAuthStatus(false)); window.electron.ipcRenderer.apfAuthButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { // Some parts of Zen pass the response as a string directly into the object if (res.status == false && typeof res.details == "string") { From 7ff580f2f8a1b699f25abf393c23f6a2a87cdf11 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 15:02:42 -0400 Subject: [PATCH 212/455] Move status reset logic Signed-off-by: Timothy Gerstel --- src/renderer/components/Home.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 4aa8f22a..19d20324 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -63,13 +63,7 @@ const makeCard = (card: ICard) => { return ( - - - - { + { dispatch(setConnectionStatus(false)); dispatch(setPlanningStatus(false)); dispatch(setInstallationTypeStatus(false)); @@ -87,6 +81,12 @@ const makeCard = (card: ICard) => { setPlanningStageStatus("isLocationValid", false) setPlanningStageStatus("isJobStatementValid", false) }}> + + + {name} From d0ffc0795dc1a91ffb121588cd5779e35600193a Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 15:09:10 -0400 Subject: [PATCH 213/455] Why dont any of these onClicks work Signed-off-by: Timothy Gerstel --- src/renderer/components/Home.tsx | 40 ++++++++++++++++---------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 19d20324..6101ceea 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -61,26 +61,26 @@ const makeCard = (card: ICard) => { const {id, name, description, link, media} = card; const dispatch = useAppDispatch(); return ( - - - { - dispatch(setConnectionStatus(false)); - dispatch(setPlanningStatus(false)); - dispatch(setInstallationTypeStatus(false)); - dispatch(setDownloadUnpaxStatus(false)); - dispatch(setInitializationStatus(false)); - dispatch(setDatasetInstallationStatus(false)); - dispatch(setNetworkingStatus(false)); - dispatch(setApfAuthStatus(false)); - dispatch(setSecurityStatus(false)); - dispatch(setCertificateStatus(false)); - dispatch(setVsamStatus(false)); - dispatch(setStcsStatus(false)); - dispatch(setNetworkingStatus(false)); - dispatch(setLocationValidationDetails(false)); - setPlanningStageStatus("isLocationValid", false) - setPlanningStageStatus("isJobStatementValid", false) - }}> + + { + dispatch(setConnectionStatus(false)); + dispatch(setPlanningStatus(false)); + dispatch(setInstallationTypeStatus(false)); + dispatch(setDownloadUnpaxStatus(false)); + dispatch(setInitializationStatus(false)); + dispatch(setDatasetInstallationStatus(false)); + dispatch(setNetworkingStatus(false)); + dispatch(setApfAuthStatus(false)); + dispatch(setSecurityStatus(false)); + dispatch(setCertificateStatus(false)); + dispatch(setVsamStatus(false)); + dispatch(setStcsStatus(false)); + dispatch(setNetworkingStatus(false)); + dispatch(setLocationValidationDetails(false)); + setPlanningStageStatus("isLocationValid", false) + setPlanningStageStatus("isJobStatementValid", false) + }}> + Date: Thu, 20 Jun 2024 17:02:16 -0400 Subject: [PATCH 214/455] Fix tagging script Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index fc6bad0c..92b80871 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -560,7 +560,7 @@ export class FTPInstallation extends Installation { console.log(`Uploading ${tempPath} to ${filePath}`) await new FileTransfer().upload(connectionArgs, tempPath, filePath, DataType.BINARY) // console.log("Check out this install arg! " + installDir); - const script = `chtag -t -c ISO8859-1 ${installDir}/zowe.yaml; cat ${filePath} | grep 'zowe' > /dev/null; if [ $? -eq 0 ]; then if [ $(chtag -p ${filePath} | cut -f 2 -d" ") != "untagged" ]; then iconv -f iso8859-1 -t 1047 ${filePath} > ${filePath}.1047; mv ${filePath}.1047 ${filePath}; chtag -tc 1047 ${filePath}; fi; else iconv -f iso8859-1 -t 1047 ${filePath} > ${filePath}.1047; mv ${filePath}.1047 ${filePath}; chtag -tc 1047 ${filePath}; fi`; + const script = `cd ${installDir}; cat zowe.yaml | grep 'zowe' > /dev/null; if [ $? -eq 0 ]; then if [ $(chtag -p zowe.yaml | cut -f 2 -d" ") != "untagged" ]; then iconv -f iso8859-1 -t 1047 zowe.yaml > zowe.yaml.1047; mv zowe.yaml.1047 zowe.yaml; chtag -tc 1047 zowe.yaml; fi; else iconv -f iso8859-1 -t 1047 zowe.yaml > zowe.yaml.1047; mv zowe.yaml.1047 zowe.yaml; chtag -tc 1047 zowe.yaml; fi`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } From f2707460b3829bed3989a383151a7822bb6c74b9 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 17:25:25 -0400 Subject: [PATCH 215/455] Better conditional for showing error Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 34997f1e..b3f32e39 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -260,7 +260,7 @@ const Installation = () => { if (res.status == false && typeof res.details == "string") { res.details = { 3: res.details }; } - if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe install + if (!res.status && res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe install alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details[3])).then((res: any) => { toggleEditorVisibility("output"); From b9e7548b0d3d8855cfecb9b98c1ea8c006850083 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 18:30:46 -0400 Subject: [PATCH 216/455] Properly update certificate section after init certificate Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 621fae16..a229709d 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -168,7 +168,8 @@ const Certificates = () => { }) } if(res.details.updatedYaml != undefined){ - const merge = deepMerge(res.details.updatedYaml, yaml); + var merge = deepMerge(res.details.updatedYaml, yaml); + merge.zowe.certificate = res.details.updatedYaml.zowe?.certificate; window.electron.ipcRenderer.setConfig(merge); dispatch(setYaml(merge)); } From 60ef912c6db2e36bb057514f5f3c5d3262f7625a Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 18:32:24 -0400 Subject: [PATCH 217/455] Update local yaml as well Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index a229709d..8cd23236 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -171,6 +171,7 @@ const Certificates = () => { var merge = deepMerge(res.details.updatedYaml, yaml); merge.zowe.certificate = res.details.updatedYaml.zowe?.certificate; window.electron.ipcRenderer.setConfig(merge); + setLYaml(merge); dispatch(setYaml(merge)); } }).catch((e: any) => { From 046af979195a7efa889888583d102894e546296d Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 19:24:08 -0400 Subject: [PATCH 218/455] Yaml still wasnt updating properly in zen: Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 8cd23236..5b4d037f 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -170,6 +170,8 @@ const Certificates = () => { if(res.details.updatedYaml != undefined){ var merge = deepMerge(res.details.updatedYaml, yaml); merge.zowe.certificate = res.details.updatedYaml.zowe?.certificate; + console.log('setting zowe.certificate to:', JSON.stringify(res.details.updatedYaml.zowe?.certificate)); + setSetupYaml(res.details.updatedYaml.zowe?.certificate); window.electron.ipcRenderer.setConfig(merge); setLYaml(merge); dispatch(setYaml(merge)); From 8ac5bb68243f7e471a5795d6da0229bc24214428 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 19:43:39 -0400 Subject: [PATCH 219/455] Flip order of base/extension? Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 5b4d037f..5eb22ef4 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -168,7 +168,7 @@ const Certificates = () => { }) } if(res.details.updatedYaml != undefined){ - var merge = deepMerge(res.details.updatedYaml, yaml); + var merge = deepMerge(Object.assign({}, yaml), res.details.updatedYaml); merge.zowe.certificate = res.details.updatedYaml.zowe?.certificate; console.log('setting zowe.certificate to:', JSON.stringify(res.details.updatedYaml.zowe?.certificate)); setSetupYaml(res.details.updatedYaml.zowe?.certificate); From 281b48faf165e71befa59d3c30a3d507b3195032 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 20:13:49 -0400 Subject: [PATCH 220/455] Fix yaml setting issue Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 5eb22ef4..ab4a2582 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -168,9 +168,7 @@ const Certificates = () => { }) } if(res.details.updatedYaml != undefined){ - var merge = deepMerge(Object.assign({}, yaml), res.details.updatedYaml); - merge.zowe.certificate = res.details.updatedYaml.zowe?.certificate; - console.log('setting zowe.certificate to:', JSON.stringify(res.details.updatedYaml.zowe?.certificate)); + var merge = deepMerge(deepMerge({}, yaml), res.details.updatedYaml); setSetupYaml(res.details.updatedYaml.zowe?.certificate); window.electron.ipcRenderer.setConfig(merge); setLYaml(merge); From 542cf80bd0bfbd7fa16ce3267b6e31bcb52dc807 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 20:22:31 -0400 Subject: [PATCH 221/455] Deep merge caused issue w array to yaml conversion Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index ab4a2582..57b637a3 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -168,11 +168,12 @@ const Certificates = () => { }) } if(res.details.updatedYaml != undefined){ - var merge = deepMerge(deepMerge({}, yaml), res.details.updatedYaml); + const updatedCerts = res.details.updatedYaml.zowe?.certificate; + const updatedYaml = {...yaml, zowe: {...yaml.zowe, certificate: updatedCerts}}; setSetupYaml(res.details.updatedYaml.zowe?.certificate); - window.electron.ipcRenderer.setConfig(merge); - setLYaml(merge); - dispatch(setYaml(merge)); + window.electron.ipcRenderer.setConfig(updatedYaml); + setLYaml(updatedCerts); + dispatch(setYaml(updatedYaml)); } }).catch((e: any) => { clearInterval(timer); From 0b2ba8c7f95e8d6abf41ddf975b47c13a8e81fe7 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 20 Jun 2024 20:28:42 -0400 Subject: [PATCH 222/455] Set local yaml to wrong section but doesnt even need to be set Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 57b637a3..2bb1b030 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -172,7 +172,6 @@ const Certificates = () => { const updatedYaml = {...yaml, zowe: {...yaml.zowe, certificate: updatedCerts}}; setSetupYaml(res.details.updatedYaml.zowe?.certificate); window.electron.ipcRenderer.setConfig(updatedYaml); - setLYaml(updatedCerts); dispatch(setYaml(updatedYaml)); } }).catch((e: any) => { From fb2486c849e46529b51df1f3ffec622dae595c6e Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Sun, 23 Jun 2024 22:10:19 -0400 Subject: [PATCH 223/455] Revert create recursive dirs + add edgecase Signed-off-by: Leanid Astrakou --- src/services/ServiceUtils.ts | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index cb1dfd40..0e2b1aec 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -54,6 +54,10 @@ export async function checkDirExists(config: IIpcConnectionArgs, dir: string): P } export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise { + if (!isValidUSSPath(dir)) { + console.warn("Attempted to create invalid Unix directory: " + dir); + return false; + } const client = await connectFTPServer(config); try { await client.makeDirectory(dir); @@ -61,8 +65,11 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< } catch (error) { if (error.toString().includes(MKDIR_ERROR_PARENT)) { let parentDir = reducePath(dir); - console.info("Wasn't able to create: '" + dir + "'. Will attempt to create: " + parentDir); - return makeDir(config, parentDir); + if (parentDir !== "/") { + console.info("Wasn't able to create: '" + dir + "'. Will attempt to create: " + parentDir); + await makeDir(config, parentDir); + return makeDir(config, dir); + } } if (error.toString().includes(MKDIR_ERROR_EXISTS)) { return true; @@ -80,7 +87,16 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< // /u/tsxxx/blaa --> /u/tsxxx export function reducePath(path: string): string { - return path.substring(0, path.lastIndexOf('/')); + if (path.lastIndexOf('/') > 0) { + path = path.slice(0, path.lastIndexOf('/')); + } + return path; // stops at "/" +} + +// Check if the path starts with a slash and does not contain spaces +export function isValidUSSPath(path: string): boolean { + const validUSSRegex = /^\/[\w\/-]+$/; + return validUSSRegex.test(path); } // This adds a "\n" inside Unix commands separated by ";" if char limit reached From f86dfc4a71c7bd8f260727f8972b2b37260804db Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Mon, 24 Jun 2024 09:47:12 +0530 Subject: [PATCH 224/455] regression fix --- src/renderer/components/common/Stepper.tsx | 9 ++- .../components/stages/Certificates.tsx | 4 +- .../components/stages/InitApfAuth.tsx | 4 +- src/renderer/components/stages/Security.tsx | 4 +- src/renderer/components/stages/Stcs.tsx | 4 +- src/renderer/components/stages/Unpax.tsx | 19 +++-- src/renderer/components/stages/Vsam.tsx | 4 +- .../stages/connection/Connection.tsx | 4 +- .../stages/installation/Installation.tsx | 4 +- .../stages/progress/StageProgressStatus.ts | 76 ++++++++++++++++--- src/services/StageDetails.ts | 22 +++++- src/types/stateInterfaces.ts | 11 ++- 12 files changed, 126 insertions(+), 39 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index aa75fa7d..d6e0b125 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -28,7 +28,7 @@ import eventDispatcher from '../../../services/eventDispatcher'; import Warning from '@mui/icons-material/Warning'; import CheckCircle from '@mui/icons-material/CheckCircle'; import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, INIT_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL } from '../common/Constants'; -import { getProgress, getCompleteProgress, mapAndSetSkipStatus, mapAndGetSkipStatus } from '../stages/progress/StageProgressStatus'; +import { getProgress, getCompleteProgress, mapAndSetSubStepSkipStatus, mapAndGetSubStepSkipStatus, mapAndSetStepSkipStatus, mapAndGetStepSkipStatus } from '../stages/progress/StageProgressStatus'; import '../../styles/Stepper.css'; import { StepIcon } from '@mui/material'; @@ -123,9 +123,10 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const handleSkip = () => { stages[activeStep].isSkipped = true; + mapAndSetStepSkipStatus(activeStep, true); if(stages[activeStep].subStages){ stages[activeStep].subStages[activeSubStep].isSkipped = true; - mapAndSetSkipStatus(activeSubStep, true); + mapAndSetSubStepSkipStatus(activeSubStep, true); } handleNext(); } @@ -176,11 +177,11 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const getStepIcon = (error: any, stageId: number, isSubStep?: boolean, subStepId?: number) => { - if ((isSubStep && getProgress(stages[stageId].subStages[subStepId].statusKey)) || (!isSubStep && getProgress(stages[stageId].statusKey))) { + if ((isSubStep && getProgress(stages[stageId].subStages[subStepId].statusKey)) || (!isSubStep && ((stageId == 0 && connectionStatus) || (getProgress(stages[stageId].statusKey))))) { return } />; } - if ((isSubStep && mapAndGetSkipStatus(subStepId)) || (error && activeStep>stageId && !isSubStep) || (error && isSubStep && stages[stageId].subStages[subStepId].isSkipped)) { + if ((isSubStep && mapAndGetSubStepSkipStatus(subStepId)) || (!isSubStep && mapAndGetStepSkipStatus(stageId))) { return } />; } diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 9990a267..ec13adbf 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -26,7 +26,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { setProgress, getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { setProgress, getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSubStepSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { CertInitSubStepsState } from "../../../types/stateInterfaces"; import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, FALLBACK_YAML, FALLBACK_SCHEMA } from "../common/Constants"; @@ -175,7 +175,7 @@ const Certificates = () => { const setStageSkipStatus = (status: boolean) => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); + mapAndSetSubStepSkipStatus(SUB_STAGE_ID, status); } const updateProgress = (status: boolean) => { diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index e59ba015..e57ca10d 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -25,7 +25,7 @@ import { alertEmitter } from "../Header"; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep, selectActiveStepIndex, selectActiveSubStepIndex, selectIsSubstep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { setProgress, getProgress, setApfAuthState, getApfAuthState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { setProgress, getProgress, setApfAuthState, getApfAuthState, mapAndSetSubStepSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { JCL_UNIX_SCRIPT_OK, FALLBACK_SCHEMA, FALLBACK_YAML } from "../common/Constants"; @@ -173,7 +173,7 @@ const InitApfAuth = () => { const setStageSkipStatus = (status: boolean) => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); + mapAndSetSubStepSkipStatus(SUB_STAGE_ID, status); } const updateProgress = (status: boolean) => { diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 72f86060..d4dd5637 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -26,7 +26,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { setProgress, getProgress, setSecurityInitState, getSecurityInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { setProgress, getProgress, setSecurityInitState, getSecurityInitState, mapAndSetSubStepSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { JCL_UNIX_SCRIPT_OK, FALLBACK_SCHEMA, FALLBACK_YAML } from '../common/Constants'; import { alertEmitter } from "../Header"; @@ -173,7 +173,7 @@ const Security = () => { const setStageSkipStatus = (status: boolean) => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); + mapAndSetSubStepSkipStatus(SUB_STAGE_ID, status); } const updateProgress = (status: boolean) => { diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 4890c935..4ab9c6ba 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -23,7 +23,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { getProgress, setStcsInitState, getStcsInitState, mapAndSetSubStepSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; import { FALLBACK_SCHEMA, FALLBACK_YAML } from "../common/Constants"; @@ -182,7 +182,7 @@ const Stcs = () => { const setStageSkipStatus = (status: boolean) => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); + mapAndSetSubStepSkipStatus(SUB_STAGE_ID, status); } const updateProgress = (status: boolean) => { diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index a925cf6f..fa706e10 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -19,7 +19,7 @@ import CheckCircle from '@mui/icons-material/CheckCircle'; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails } from "../../../services/StageDetails"; import { setDownloadUnpaxStatus } from './progress/progressSlice'; -import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationTypeStatus, getProgress, setDownloadUnpaxState } from "./progress/StageProgressStatus"; +import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationTypeStatus, getProgress, setDownloadUnpaxState, mapAndSetStepSkipStatus } from "./progress/StageProgressStatus"; import React from "react"; import ProgressCard from "../common/ProgressCard"; import { alertEmitter } from "../Header"; @@ -55,8 +55,7 @@ const Unpax = () => { setDownloadUnpaxProgress(res); setDownloadUnpaxState(res); if(stageComplete){ - dispatch(setNextStepEnabled(true)); - dispatch(setDownloadUnpaxStatus(true)); + setStageSkipStatus(true); clearInterval(timer); } }) @@ -69,10 +68,9 @@ const Unpax = () => { const process = (event: any) => { event.preventDefault(); + setStageSkipStatus(false); setShowProgress(true); - dispatch(setDownloadUnpaxStatus(false)); setDownloadUnpaxProgress(downloadUnpaxStatus); - dispatch(setNextStepEnabled(false)); window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, installationArgs, version, yaml).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details, 'error'); @@ -81,12 +79,11 @@ const Unpax = () => { dispatch(setYaml(res.details.mergedYaml)); window.electron.ipcRenderer.setConfig(res.details.mergedYaml); } - dispatch(setNextStepEnabled(res.status)); - dispatch(setDownloadUnpaxStatus(res.status)); + setStageSkipStatus(res.status); clearInterval(timer); }).catch(() => { clearInterval(timer); - dispatch(setNextStepEnabled(false)); + setStageSkipStatus(false); }); } @@ -108,6 +105,12 @@ const Unpax = () => { } }, []); + const setStageSkipStatus = (status: boolean) => { + dispatch(setNextStepEnabled(status)); + dispatch(setDownloadUnpaxStatus(status)); + mapAndSetStepSkipStatus(STAGE_ID, !status); + } + return (<> {installValue === "smpe" && diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 053f157c..37f13e62 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -25,7 +25,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { setProgress, getProgress, setVsamInitState, mapAndSetSkipStatus, getInstallationArguments, getVsamInitState } from "./progress/StageProgressStatus"; +import { setProgress, getProgress, setVsamInitState, mapAndSetSubStepSkipStatus, getInstallationArguments, getVsamInitState } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; @@ -159,7 +159,7 @@ const Vsam = () => { const setStageSkipStatus = (status: boolean) => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); + mapAndSetSubStepSkipStatus(SUB_STAGE_ID, status); } const updateProgress = (status: boolean) => { diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 8c3a42c7..bb4f9839 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -33,7 +33,7 @@ import { setYaml, setSchema, setLoading, setNextStepEnabled, selectZoweCLIVersio import { setConnectionStatus, selectConnectionStatus} from '../progress/progressSlice'; import { Container } from "@mui/material"; import { alertEmitter } from "../../Header"; -import { getStageDetails, initStageSkipStatus } from "../../../../services/StageDetails"; +import { getStageDetails, initSubStageSkipStatus, initStageSkipStatus } from "../../../../services/StageDetails"; import { initializeProgress, getActiveStage } from "../progress/StageProgressStatus"; import eventDispatcher from "../../../../services/eventDispatcher"; import { FALLBACK_YAML, FALLBACK_SCHEMA } from "../../common/Constants"; @@ -137,7 +137,9 @@ const FTPConnectionForm = () => { dispatch(setConnectionStatus(res.status)); if(res.status) { dispatch(setNextStepEnabled(true)); + dispatch(setConnectionStatus(true)); initializeProgress(connectionArgs.host, connectionArgs.user); + initSubStageSkipStatus(); initStageSkipStatus(); setYamlAndConfig(); } diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 99d0a50f..c1bb2484 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -27,7 +27,7 @@ import {stages} from "../../configuration-wizard/Wizard"; import { setActiveStep } from "../progress/activeStepSlice"; import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, JCL_UNIX_SCRIPT_OK, FALLBACK_SCHEMA, FALLBACK_YAML } from '../../common/Constants'; import { getStageDetails, getSubStageDetails } from "../../../../services/StageDetails"; -import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus } from "../progress/StageProgressStatus"; +import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSubStepSkipStatus, getInstallationArguments, datasetInstallationStatus } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; import eventDispatcher from '../../../../services/eventDispatcher'; @@ -234,7 +234,7 @@ const Installation = () => { const setStageSkipStatus = (status: boolean) => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); + mapAndSetSubStepSkipStatus(SUB_STAGE_ID, status); } const updateProgress = (status: boolean) => { setStateUpdated(!stateUpdated); diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index de54efb9..a112205d 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -9,7 +9,7 @@ */ import { flatten, unflatten } from 'flat'; -import { ProgressState, PlanningState, InstallationType, ActiveState, DatasetInstallationState, InitSubStepsState, CertInitSubStepsState, PlanningValidationDetails, SkipState, InstallationArgs, DownloadUnpaxState} from '../../../../types/stateInterfaces'; +import { ProgressState, PlanningState, InstallationType, ActiveState, DatasetInstallationState, InitSubStepsState, CertInitSubStepsState, PlanningValidationDetails, subStepSkipState, stepSkipState, InstallationArgs, DownloadUnpaxState} from '../../../../types/stateInterfaces'; import { stages } from '../../configuration-wizard/Wizard'; const installationTypeStatus: InstallationType = { @@ -99,8 +99,7 @@ const planningValidationDetailsStatus: PlanningValidationDetails = { error: '' } -const stepSkipStatus: SkipState = { - downloadUnpax: false, +const subStepSkipStatus: subStepSkipState = { datasetInstallation: false, networking: false, apfAuth: false, @@ -110,6 +109,14 @@ const stepSkipStatus: SkipState = { launchConfig: false } +const stepSkipStatus: stepSkipState = { + planning: false, + installationType: false, + unpax: false, + initialization: false, + reviewInstallation: false +} + const installationArgsStatus: InstallationArgs = { installationDir: '', workspaceDir: '', @@ -143,10 +150,12 @@ let certificateKey = 'certificate_init'; let vsamKey = 'vsam_init'; let planningValidationDetailsKey = `planning_validation_details`; let prevInstallationKey = `prev_installation`; +let skipSubStateKey = `skip_sub_state`; let skipStateKey = `skip_state`; let installationArgsKey = `intallation_args`; -let skipKeysArray: (keyof SkipState)[] = Object.keys(stepSkipStatus) as (keyof SkipState)[]; +let subStepSkipKeysArray: (keyof subStepSkipState)[] = Object.keys(subStepSkipStatus) as (keyof subStepSkipState)[]; +let stepSkipKeysArray: (keyof stepSkipState)[] = Object.keys(stepSkipStatus) as (keyof stepSkipState)[]; const setKeys = (id: string) => { progressStateKey = `${progressStateKey}_${id}`; @@ -161,6 +170,7 @@ const setKeys = (id: string) => { certificateKey = `${certificateKey}_${id}`; vsamKey = `${vsamKey}_${id}`; planningValidationDetailsKey = `${planningValidationDetailsKey}_${id}`; + skipSubStateKey = `${skipSubStateKey}_${id}`; skipStateKey = `${skipStateKey}_${id}`; installationArgsKey = `${installationArgsKey}_${id}`; } @@ -241,6 +251,12 @@ export const initializeProgress = (host: string, user: string) => { localStorage.setItem(planningValidationDetailsKey, JSON.stringify(flattenedData)); } + const subStepSkipStatusState = localStorage.getItem(skipSubStateKey); + if(!subStepSkipStatusState) { + const flattenedData = flatten(subStepSkipStatus); + localStorage.setItem(skipSubStateKey, JSON.stringify(flattenedData)); + } + const stepSkipStatusState = localStorage.getItem(skipStateKey); if(!stepSkipStatusState) { const flattenedData = flatten(stepSkipStatus); @@ -254,14 +270,13 @@ export const initializeProgress = (host: string, user: string) => { } } -export const mapAndSetSkipStatus = (subStageId: number, value: boolean): void => { - setSubStageSkipStatus(skipKeysArray[subStageId], value); +export const mapAndSetSubStepSkipStatus = (subStageId: number, value: boolean): void => { + setSubStageSkipStatus(subStepSkipKeysArray[subStageId], value); } -export const mapAndGetSkipStatus = (subStageId: number): boolean => { +export const mapAndGetSubStepSkipStatus = (subStageId: number): boolean => { const skipStatus = getSubStageSkipStatus(); const skipStatusArray = [ - skipStatus.downloadUnpax, skipStatus.datasetInstallation, skipStatus.networking, skipStatus.apfAuth, @@ -274,11 +289,50 @@ export const mapAndGetSkipStatus = (subStageId: number): boolean => { return skipStatusArray[subStageId]; } -export const setSubStageSkipStatus = (key: keyof SkipState, newValue: boolean): void => { +export const mapAndSetStepSkipStatus = (stageId: number, value: boolean): void => { + setStageSkipStatus(stepSkipKeysArray[stageId-1], value); +} + +export const mapAndGetStepSkipStatus = (subStageId: number): boolean => { + const skipStatus = getStageSkipStatus(); + const skipStatusArray = [ + skipStatus.planning, + skipStatus.installationType, + skipStatus.unpax, + skipStatus.initialization, + skipStatus.reviewInstallation + ] + + return skipStatusArray[subStageId-1]; +} + +export const setSubStageSkipStatus = (key: keyof subStepSkipState, newValue: boolean): void => { + const skipStatus = localStorage.getItem(skipSubStateKey); + if (skipStatus) { + const flattenedData = JSON.parse(skipStatus); + const unFlattenedData = unflatten(flattenedData) as subStepSkipState; + Object.assign(subStepSkipStatus, unFlattenedData); + } + subStepSkipStatus[key] = newValue; + const flattenedData = flatten(subStepSkipStatus); + localStorage.setItem(skipSubStateKey, JSON.stringify(flattenedData)); +} + +export const getSubStageSkipStatus = () : subStepSkipState => { + const skipStatus = localStorage.getItem(skipSubStateKey); + if(skipStatus) { + const flattenedData = JSON.parse(skipStatus); + return unflatten(flattenedData); + } else { + return subStepSkipStatus; + } +} + +export const setStageSkipStatus = (key: keyof stepSkipState, newValue: boolean): void => { const skipStatus = localStorage.getItem(skipStateKey); if (skipStatus) { const flattenedData = JSON.parse(skipStatus); - const unFlattenedData = unflatten(flattenedData) as SkipState; + const unFlattenedData = unflatten(flattenedData) as stepSkipState; Object.assign(stepSkipStatus, unFlattenedData); } stepSkipStatus[key] = newValue; @@ -286,7 +340,7 @@ export const setSubStageSkipStatus = (key: keyof SkipState, newValue: boolean): localStorage.setItem(skipStateKey, JSON.stringify(flattenedData)); } -export const getSubStageSkipStatus = () : SkipState => { +export const getStageSkipStatus = () : stepSkipState => { const skipStatus = localStorage.getItem(skipStateKey); if(skipStatus) { const flattenedData = JSON.parse(skipStatus); diff --git a/src/services/StageDetails.ts b/src/services/StageDetails.ts index b8afb6b8..bf02f03a 100644 --- a/src/services/StageDetails.ts +++ b/src/services/StageDetails.ts @@ -8,7 +8,7 @@ * Copyright Contributors to the Zowe Project. */ -import { getSubStageSkipStatus } from '../renderer/components/stages/progress/StageProgressStatus'; +import { getStageSkipStatus, getSubStageSkipStatus } from '../renderer/components/stages/progress/StageProgressStatus'; import { stages } from '../renderer/components/configuration-wizard/Wizard'; export const getStageDetails = (stageLabel: string) => { @@ -25,6 +25,26 @@ export const getSubStageDetails = (stageId: number, subStageLabel: string) => { } export const initStageSkipStatus = (): void => { + const skipStatus = getStageSkipStatus(); + + const stageSkipStatus = [ + skipStatus.planning, + skipStatus.installationType, + skipStatus.unpax, + skipStatus.initialization, + skipStatus.reviewInstallation + ]; + + let iterator = 0; + stages.map(stage => { + if(stage.id !== 0) { + stage.isSkipped = stageSkipStatus[iterator]; + } + iterator++; + }) +} + +export const initSubStageSkipStatus = (): void => { const skipStatus = getSubStageSkipStatus(); const subStageSkipStatus = [ diff --git a/src/types/stateInterfaces.ts b/src/types/stateInterfaces.ts index 66bd97db..3a49f378 100644 --- a/src/types/stateInterfaces.ts +++ b/src/types/stateInterfaces.ts @@ -80,8 +80,15 @@ export interface PlanningValidationDetails { error: string } -export interface SkipState { - downloadUnpax: boolean, +export interface stepSkipState { + planning: boolean, + installationType: boolean, + unpax: boolean, + initialization: boolean, + reviewInstallation: boolean +} + +export interface subStepSkipState { datasetInstallation: boolean, networking: boolean, apfAuth: boolean, From 338585ed46dd06880494cc4fd4daa5723ed32219 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Mon, 24 Jun 2024 15:19:43 -0400 Subject: [PATCH 225/455] Added a stop recursion flag for bad permissions edgecase Signed-off-by: Leanid Astrakou --- src/services/ServiceUtils.ts | 38 +++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index 0e2b1aec..e4a49675 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -21,12 +21,16 @@ export const JCL_JOBNAME_DEFAULT = "ZENJOB"; export const MKDIR_ERROR_PARENT = "EDC5129I"; // when MKDIR tries to create top-level dir in a dir that doesn't exist +export const MKDIR_ERROR_PERMISSIONS = "EDC5111I"; + export const MKDIR_ERROR_EXISTS = "EDC5117I"; // when dir already exist export const MKDIR_ERROR_BADARGS= "EDC5134I"; // when func not implemented export const LIST_ERROR_NOTFOUND = "FSUM6785"; // when dir doesn't exist +let stopMakeDir = false; + export async function connectFTPServer(config: IIpcConnectionArgs): Promise { const client = new zos(); @@ -53,7 +57,14 @@ export async function checkDirExists(config: IIpcConnectionArgs, dir: string): P } } -export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise { +/* Function's a little weird but basically +a) zos-node-accessor has no mkdir -p +b) we use a stopRecursion flag because sometimes we keep trying for a parent, and we reduce down until we *can* make it +but we won't know that we *cannot* until we hit the bad permissions error (ie reducePath has run its course) */ +export async function makeDir(config: IIpcConnectionArgs, dir: string, stopRecursionFlag = { stop: false }): Promise { + if (stopRecursionFlag.stop) { + return false; + } if (!isValidUSSPath(dir)) { console.warn("Attempted to create invalid Unix directory: " + dir); return false; @@ -63,19 +74,27 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< await client.makeDirectory(dir); return true; } catch (error) { - if (error.toString().includes(MKDIR_ERROR_PARENT)) { + if (error.toString().includes(MKDIR_ERROR_PERMISSIONS)) { // This is the error that tells us we should stop our parent search + console.warn("Wasn't able to create: '" + dir + "'. Bad permissions"); + stopRecursionFlag.stop = true; + return false; + } + if (error.toString().includes(MKDIR_ERROR_PARENT)) { // This is the error that tells us there's still a chance let parentDir = reducePath(dir); - if (parentDir !== "/") { + if (parentDir !== "/" && parentDir) { console.info("Wasn't able to create: '" + dir + "'. Will attempt to create: " + parentDir); - await makeDir(config, parentDir); - return makeDir(config, dir); + const parentResult = await makeDir(config, parentDir, stopRecursionFlag); + if (parentResult && !stopRecursionFlag.stop) { + return await makeDir(config, dir, stopRecursionFlag); + } + return false; } } if (error.toString().includes(MKDIR_ERROR_EXISTS)) { return true; } if (error.toString().includes(MKDIR_ERROR_BADARGS)) { - console.info("Wasn't able to create: '" + dir + "'. Problem with using mkdir. Method usage is not implemented (bad arguments?)"); + console.warn("Wasn't able to create: '" + dir + "'. Problem with using mkdir. Method usage is not implemented (bad arguments?)"); } else { console.warn(error); } @@ -85,12 +104,9 @@ export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise< } } -// /u/tsxxx/blaa --> /u/tsxxx +// /u/tsxxx/blaa --> /u/tsxxx, eventually goes down to "/" then empty export function reducePath(path: string): string { - if (path.lastIndexOf('/') > 0) { - path = path.slice(0, path.lastIndexOf('/')); - } - return path; // stops at "/" + return path.substring(0, path.lastIndexOf('/')); } // Check if the path starts with a slash and does not contain spaces From 4f7ca4b9153f9adb8c602b4a9fdb08c9cd8c8a43 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 25 Jun 2024 17:29:00 +0530 Subject: [PATCH 226/455] Updating the stepper icon logic --- src/renderer/components/common/Stepper.tsx | 2 +- src/renderer/components/stages/progress/StageProgressStatus.ts | 1 + src/services/StageDetails.ts | 2 ++ src/types/stateInterfaces.ts | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 97ac54b3..4696620c 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -181,7 +181,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages return } />; } - if ((isSubStep && mapAndGetSubStepSkipStatus(subStepId)) || (!isSubStep && mapAndGetStepSkipStatus(stageId))) { + if ((isSubStep && mapAndGetSubStepSkipStatus(subStepId) && stages[stageId].subStages[subStepId].isSkipped) || (!isSubStep && mapAndGetStepSkipStatus(stageId))) { return } />; } diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index a112205d..70262b09 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -104,6 +104,7 @@ const subStepSkipStatus: subStepSkipState = { networking: false, apfAuth: false, security: false, + stcs: false, certificate: false, vsam: false, launchConfig: false diff --git a/src/services/StageDetails.ts b/src/services/StageDetails.ts index bf02f03a..80bde377 100644 --- a/src/services/StageDetails.ts +++ b/src/services/StageDetails.ts @@ -52,7 +52,9 @@ export const initSubStageSkipStatus = (): void => { skipStatus.networking, skipStatus.apfAuth, skipStatus.security, + skipStatus.stcs, skipStatus.certificate, + skipStatus.vsam, skipStatus.launchConfig ]; diff --git a/src/types/stateInterfaces.ts b/src/types/stateInterfaces.ts index 3a49f378..a9fa1ed3 100644 --- a/src/types/stateInterfaces.ts +++ b/src/types/stateInterfaces.ts @@ -93,6 +93,7 @@ export interface subStepSkipState { networking: boolean, apfAuth: boolean, security: boolean, + stcs: boolean, certificate: boolean, vsam: boolean, launchConfig: boolean From f756077f7fbb4c4816fa5eaf67f6c7935f7cad38 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 25 Jun 2024 18:02:28 +0530 Subject: [PATCH 227/455] Removing the space --- src/renderer/components/common/Stepper.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 4696620c..c64a51db 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -64,8 +64,6 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages completeProgress.launchConfigStatus ]) - - const [activeStep, setActiveStep] = initialization ? useState(0) : useState(useAppSelector(selectActiveStepIndex)); const [activeSubStep, setActiveSubStep] = initialization ? useState(0) : useState(useAppSelector(selectActiveSubStepIndex)); const [nextText, setNextText] = useState("Continue"); From 46d51422c603223e8f248217805a4f6ae99dbe31 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 25 Jun 2024 18:04:47 +0530 Subject: [PATCH 228/455] Updating the interface name --- .../stages/progress/StageProgressStatus.ts | 12 ++++++------ src/types/stateInterfaces.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 70262b09..061f73db 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -9,7 +9,7 @@ */ import { flatten, unflatten } from 'flat'; -import { ProgressState, PlanningState, InstallationType, ActiveState, DatasetInstallationState, InitSubStepsState, CertInitSubStepsState, PlanningValidationDetails, subStepSkipState, stepSkipState, InstallationArgs, DownloadUnpaxState} from '../../../../types/stateInterfaces'; +import { ProgressState, PlanningState, InstallationType, ActiveState, DatasetInstallationState, InitSubStepsState, CertInitSubStepsState, PlanningValidationDetails, subStepState, stepSkipState, InstallationArgs, DownloadUnpaxState} from '../../../../types/stateInterfaces'; import { stages } from '../../configuration-wizard/Wizard'; const installationTypeStatus: InstallationType = { @@ -99,7 +99,7 @@ const planningValidationDetailsStatus: PlanningValidationDetails = { error: '' } -const subStepSkipStatus: subStepSkipState = { +const subStepSkipStatus: subStepState = { datasetInstallation: false, networking: false, apfAuth: false, @@ -155,7 +155,7 @@ let skipSubStateKey = `skip_sub_state`; let skipStateKey = `skip_state`; let installationArgsKey = `intallation_args`; -let subStepSkipKeysArray: (keyof subStepSkipState)[] = Object.keys(subStepSkipStatus) as (keyof subStepSkipState)[]; +let subStepSkipKeysArray: (keyof subStepState)[] = Object.keys(subStepSkipStatus) as (keyof subStepState)[]; let stepSkipKeysArray: (keyof stepSkipState)[] = Object.keys(stepSkipStatus) as (keyof stepSkipState)[]; const setKeys = (id: string) => { @@ -307,11 +307,11 @@ export const mapAndGetStepSkipStatus = (subStageId: number): boolean => { return skipStatusArray[subStageId-1]; } -export const setSubStageSkipStatus = (key: keyof subStepSkipState, newValue: boolean): void => { +export const setSubStageSkipStatus = (key: keyof subStepState, newValue: boolean): void => { const skipStatus = localStorage.getItem(skipSubStateKey); if (skipStatus) { const flattenedData = JSON.parse(skipStatus); - const unFlattenedData = unflatten(flattenedData) as subStepSkipState; + const unFlattenedData = unflatten(flattenedData) as subStepState; Object.assign(subStepSkipStatus, unFlattenedData); } subStepSkipStatus[key] = newValue; @@ -319,7 +319,7 @@ export const setSubStageSkipStatus = (key: keyof subStepSkipState, newValue: boo localStorage.setItem(skipSubStateKey, JSON.stringify(flattenedData)); } -export const getSubStageSkipStatus = () : subStepSkipState => { +export const getSubStageSkipStatus = () : subStepState => { const skipStatus = localStorage.getItem(skipSubStateKey); if(skipStatus) { const flattenedData = JSON.parse(skipStatus); diff --git a/src/types/stateInterfaces.ts b/src/types/stateInterfaces.ts index a9fa1ed3..2ce0defb 100644 --- a/src/types/stateInterfaces.ts +++ b/src/types/stateInterfaces.ts @@ -88,7 +88,7 @@ export interface stepSkipState { reviewInstallation: boolean } -export interface subStepSkipState { +export interface subStepState { datasetInstallation: boolean, networking: boolean, apfAuth: boolean, From 214427a74e32f99d4d70c99225b187ac71c8ff89 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 25 Jun 2024 19:31:44 +0530 Subject: [PATCH 229/455] indendations --- src/renderer/components/stages/Stcs.tsx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 4ab9c6ba..4cab2864 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -218,16 +218,16 @@ const Stcs = () => { updateProgress(false); event.preventDefault(); window.electron.ipcRenderer.initStcsButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { - updateProgress(res.status); - if(res.error) { - alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); - } - clearInterval(timer); - }).catch((error: any) => { - clearInterval(timer); - updateProgress(false); - console.warn('zwe init stcs failed'); - }); + updateProgress(res.status); + if(res.error) { + alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); + } + clearInterval(timer); + }).catch((error: any) => { + clearInterval(timer); + updateProgress(false); + console.warn('zwe init stcs failed'); + }); } const handleFormChange = (data: any) => { From 79f5420e67b992b7adee2f026a77ef1bb3053778 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 25 Jun 2024 14:02:28 -0400 Subject: [PATCH 230/455] Only create runtime dir Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 12fede2a..4c9ec3ac 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -258,9 +258,6 @@ const Planning = () => { window.electron.ipcRenderer.checkJava(connectionArgs, localYaml?.java?.home || installationArgs.javaHome), window.electron.ipcRenderer.checkNode(connectionArgs, localYaml?.node?.home || installationArgs.nodeHome), window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.runtimeDirectory || installationArgs.installationDir), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.workspaceDirectory || installationArgs.workspaceDir ), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.extensionDirectory || installationArgs.extensionDir), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.logDirectory || installationArgs.logDir), ]).then((res: Array) => { const details = {javaVersion: '', nodeVersion: '', spaceAvailableMb: '', error: ''}; setEditorContent(res.map(item=>item?.details).join('\n')); From 725cc3fc3acf7e6335726ed502ba551edfab9de8 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 25 Jun 2024 14:28:23 -0400 Subject: [PATCH 231/455] Fix typo Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 2bb1b030..5bfadea1 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -170,7 +170,7 @@ const Certificates = () => { if(res.details.updatedYaml != undefined){ const updatedCerts = res.details.updatedYaml.zowe?.certificate; const updatedYaml = {...yaml, zowe: {...yaml.zowe, certificate: updatedCerts}}; - setSetupYaml(res.details.updatedYaml.zowe?.certificate); + setSetupYaml(res.details.updatedYaml.zowe?.setup.certificate); window.electron.ipcRenderer.setConfig(updatedYaml); dispatch(setYaml(updatedYaml)); } @@ -239,7 +239,7 @@ const Certificates = () => { id="demo-simple-select" value={verifyCerts} onChange={(e) => { - const newConfig = {...yaml, zowe: {...yaml?.zowe, verifyCertificates: e.target.value}}; + const newConfig = {...yaml, zowe: {...yaml?.zowe, verifyCertificates: e.target.value, setup: {...yaml.zowe.setup}}}; window.electron.ipcRenderer.setConfig(newConfig); setLYaml(newConfig) setVerifyCerts(e.target.value); From 3f56a11410717cf87c087f92d30030e32e882536 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 25 Jun 2024 14:45:49 -0400 Subject: [PATCH 232/455] Fix yaml being out of sync on cert stage Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 5bfadea1..bcc32b20 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -206,6 +206,7 @@ const Certificates = () => { setStageConfig(false, errPath+' '+errMsg, newData); } else { window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, certificate: newData}}}); + setLYaml({...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, certificate: newData}}}); setStageConfig(true, '', newData); } } From 4e02307026536340432661d45f13296e085d5f15 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 25 Jun 2024 17:57:18 -0400 Subject: [PATCH 233/455] Reset certificates status on input change Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index bcc32b20..11734012 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -197,6 +197,7 @@ const Certificates = () => { setIsFormInit(false); if (newData) { + dispatch(setCertificateStatus(false)); if(validate) { validate(newData); @@ -240,6 +241,7 @@ const Certificates = () => { id="demo-simple-select" value={verifyCerts} onChange={(e) => { + dispatch(setCertificateStatus(false)); const newConfig = {...yaml, zowe: {...yaml?.zowe, verifyCertificates: e.target.value, setup: {...yaml.zowe.setup}}}; window.electron.ipcRenderer.setConfig(newConfig); setLYaml(newConfig) From b08f8df816554d29bfaee7b780fa3a0acf51f683 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 25 Jun 2024 19:00:44 -0400 Subject: [PATCH 234/455] Remove status checks for workspace, log, extension dir as zen will not longer attempt to create these Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 4c9ec3ac..467ff1eb 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -276,22 +276,10 @@ const Planning = () => { details.error = details.error + `Can't get Node.js version `; console.warn(res[1].details); } - if (res[2].status == false) { // Checking run-time directory existence or creating it failed? + if (res[2] && res[2].status == false) { // Checking run-time directory existence or creating it failed? details.error = details.error + res[2].details; console.warn(res[2].details); } - if (res[3].status == false) { // workspace directory - details.error = details.error + res[3].details; - console.warn(res[3].details); - } - if (res[4].status == false) { // extensions directory - details.error = details.error + res[4].details; - console.warn(res[4].details); - } - if (res[5].status == false) { // logs directory - details.error = details.error + res[5].details; - console.warn(res[5].details); - } //Do not check space because space on ZFS is dynamic. you can have more space than USS thinks. // try { // const dfOut: string = res[2].details.split('\n').filter((i: string) => i.trim().startsWith(installationArgs.installationDir.slice(0, 3)))[0]; From c0b0893b81259ebb2eb117dcd547af1f54cc469a Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 25 Jun 2024 19:20:16 -0400 Subject: [PATCH 235/455] New installation now resets state properly Signed-off-by: Timothy Gerstel --- src/renderer/components/Home.tsx | 44 +++++++++++--------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 6101ceea..0fdf2494 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -15,18 +15,18 @@ import { Box, Card, CardContent, CardMedia, Typography, Button } from '@mui/mate import flatten, { unflatten } from 'flat'; import { IResponse, IIpcConnectionArgs } from '../../types/interfaces'; import { setConnectionArgs, setResumeProgress, selectInitJobStatement } from './stages/connection/connectionSlice'; -import { setJobStatement, setLocationValidationDetails } from './stages/PlanningSlice'; +import { setJobStatement } from './stages/PlanningSlice'; import { selectSchema, selectYaml, setSchema, setYaml, setZoweCLIVersion } from './configuration-wizard/wizardSlice'; import { useAppDispatch, useAppSelector } from '../hooks'; import { Tooltip } from '@mui/material'; import installationImg from '../assets/installation.png' import installationDryImg from '../assets/installation-dry-run.png' import eventDispatcher from "../../services/eventDispatcher"; -import { selectConnectionStatus, setApfAuthStatus, setCertificateStatus, setConnectionStatus, setDatasetInstallationStatus, setDownloadUnpaxStatus, setInitializationStatus, setInstallationTypeStatus, setNetworkingStatus, setPlanningStatus, setSecurityStatus, setStcsStatus, setVsamStatus} from './stages/progress/progressSlice'; +import { selectConnectionStatus} from './stages/progress/progressSlice'; import HorizontalLinearStepper from './common/Stepper'; import Wizard from './configuration-wizard/Wizard' import { ActiveState } from '../../types/stateInterfaces'; -import { getInstallationArguments, getPreviousInstallation, setPlanningStageStatus } from './stages/progress/StageProgressStatus'; +import { getInstallationArguments, getPreviousInstallation } from './stages/progress/StageProgressStatus'; import { DEF_NO_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from './common/Constants'; import { selectInstallationArgs, setInstallationArgs } from './stages/installation/installationSlice'; @@ -57,29 +57,21 @@ const cards: Array = [ } ] +const prevInstallationKey = "prev_installation"; +const lastActiveState: ActiveState = { + activeStepIndex: 0, + isSubStep: false, + activeSubStepIndex: 0, +}; + const makeCard = (card: ICard) => { const {id, name, description, link, media} = card; - const dispatch = useAppDispatch(); return ( - { - dispatch(setConnectionStatus(false)); - dispatch(setPlanningStatus(false)); - dispatch(setInstallationTypeStatus(false)); - dispatch(setDownloadUnpaxStatus(false)); - dispatch(setInitializationStatus(false)); - dispatch(setDatasetInstallationStatus(false)); - dispatch(setNetworkingStatus(false)); - dispatch(setApfAuthStatus(false)); - dispatch(setSecurityStatus(false)); - dispatch(setCertificateStatus(false)); - dispatch(setVsamStatus(false)); - dispatch(setStcsStatus(false)); - dispatch(setNetworkingStatus(false)); - dispatch(setLocationValidationDetails(false)); - setPlanningStageStatus("isLocationValid", false) - setPlanningStageStatus("isJobStatementValid", false) - }}> + { + const flattenedData = flatten(lastActiveState); + localStorage.setItem(prevInstallationKey, JSON.stringify(flattenedData)); + }}> { const { activeStepIndex, isSubStep, activeSubStepIndex, lastActiveDate } = getPreviousInstallation(); - const prevInstallationKey = "prev_installation"; - const lastActiveState: ActiveState = { - activeStepIndex: 0, - isSubStep: false, - activeSubStepIndex: 0, - }; const [isNewInstallation, setIsNewInstallation] = useState(false); const stages: any = []; @@ -209,7 +195,7 @@ const Home = () => { const resumeProgress = () => { setShowWizard(true); - dispatch(setResumeProgress(!connectionStatus)); + dispatch(setResumeProgress(true)); } return ( From bbfe3b6d62d93fcc180a21922f1d78e08f3b9d42 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 25 Jun 2024 19:21:00 -0400 Subject: [PATCH 236/455] Dont load last state if isResume Signed-off-by: Timothy Gerstel --- .../stages/connection/Connection.tsx | 2 +- .../stages/progress/StageProgressStatus.ts | 32 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 87be8f3c..9200e194 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -134,7 +134,7 @@ const FTPConnectionForm = () => { dispatch(setConnectionStatus(res.status)); if(res.status) { dispatch(setNextStepEnabled(true)); - initializeProgress(connectionArgs.host, connectionArgs.user); + initializeProgress(connectionArgs.host, connectionArgs.user, isResume); initStageSkipStatus(); setResume(); } diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index d184e99f..dc6102f5 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -165,90 +165,90 @@ const setKeys = (id: string) => { installationArgsKey = `${installationArgsKey}_${id}`; } -export const initializeProgress = (host: string, user: string) => { +export const initializeProgress = (host: string, user: string, isResume: boolean) => { const id = `${host}_${user}`; setKeys(id); - + const progress = localStorage.getItem(progressStateKey); - if(!progress) { + if(!progress || !isResume) { const flattenedData = flatten(progressStatus); localStorage.setItem(progressStateKey, JSON.stringify(flattenedData)); } const activeStage = localStorage.getItem(activeStateKey); - if(!activeStage) { + if(!activeStage || !isResume) { const flattenedData = flatten(activeStatus); localStorage.setItem(activeStateKey, JSON.stringify(flattenedData)); } const planningState = localStorage.getItem(planningStateKey); - if(!planningState) { + if(!planningState || !isResume) { const flattenedData = flatten(planningStageStatus); localStorage.setItem(planningStateKey, JSON.stringify(flattenedData)); } const installationTypeState = localStorage.getItem(installationTypeKey); - if(!installationTypeState) { + if(!installationTypeState || !isResume) { const flattenedData = flatten(installationTypeStatus); localStorage.setItem(installationTypeKey, JSON.stringify(flattenedData)); } const downloadUnpaxState = localStorage.getItem(downloadUnpaxKey); - if(!downloadUnpaxState) { + if(!downloadUnpaxState || !isResume) { const flattenedData = flatten(downloadUnpaxStatus); localStorage.setItem(downloadUnpaxKey, JSON.stringify(flattenedData)); } const datasetInstallationState = localStorage.getItem(datasetInstallationKey); - if(!datasetInstallationState) { + if(!datasetInstallationState || !isResume) { const flattenedData = flatten(datasetInstallationStatus); localStorage.setItem(datasetInstallationKey, JSON.stringify(flattenedData)); } const apfAuthState = localStorage.getItem(apfAuthKey); - if(!apfAuthState) { + if(!apfAuthState || !isResume) { const flattenedData = flatten(apfAuthStatus); localStorage.setItem(apfAuthKey, JSON.stringify(flattenedData)); } const securityInitState = localStorage.getItem(securityKey); - if(!securityInitState) { + if(!securityInitState || !isResume) { const flattenedData = flatten(securityInitStatus); localStorage.setItem(securityKey, JSON.stringify(flattenedData)); } const stcsInitState = localStorage.getItem(stcsKey); - if(!stcsInitState) { + if(!stcsInitState || !isResume) { const flattenedData = flatten(stcsInitStatus); localStorage.setItem(stcsKey, JSON.stringify(flattenedData)); } const certificateInitState = localStorage.getItem(certificateKey); - if(!certificateInitState) { + if(!certificateInitState || !isResume) { const flattenedData = flatten(certificateInitStatus); localStorage.setItem(certificateKey, JSON.stringify(flattenedData)); } const vsamInitState = localStorage.getItem(vsamKey); - if(!vsamInitState) { + if(!vsamInitState || !isResume) { const flattenedData = flatten(vsamInitStatus); localStorage.setItem(vsamKey, JSON.stringify(flattenedData)); } const planningValidationDetailsState = localStorage.getItem(certificateKey); - if(!planningValidationDetailsState) { + if(!planningValidationDetailsState || !isResume) { const flattenedData = flatten(planningValidationDetailsStatus); localStorage.setItem(planningValidationDetailsKey, JSON.stringify(flattenedData)); } const stepSkipStatusState = localStorage.getItem(skipStateKey); - if(!stepSkipStatusState) { + if(!stepSkipStatusState || !isResume) { const flattenedData = flatten(stepSkipStatus); localStorage.setItem(skipStateKey, JSON.stringify(flattenedData)); } const installationArgsState = localStorage.getItem(installationArgsKey); - if(!installationArgsState) { + if(!installationArgsState || !isResume) { const flattenedData = flatten(installationArgsStatus); localStorage.setItem(installationArgsKey, JSON.stringify(flattenedData)); } From de7835e2c885ec7be98c5cf5ac5ed89e7530fd83 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 25 Jun 2024 19:46:26 -0400 Subject: [PATCH 237/455] Increase editor width and height Signed-off-by: Timothy Gerstel --- src/renderer/components/common/EditorDialog.tsx | 4 +++- src/renderer/components/common/MonacoEditor.tsx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index 7b86db5d..57ccdafa 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -151,11 +151,13 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC return (
Editor diff --git a/src/renderer/components/common/MonacoEditor.tsx b/src/renderer/components/common/MonacoEditor.tsx index 95bfd012..12186e31 100644 --- a/src/renderer/components/common/MonacoEditor.tsx +++ b/src/renderer/components/common/MonacoEditor.tsx @@ -88,7 +88,7 @@ const MonacoEditorComponent = ({contentType, initialContent, onContentChange, is } return ( -
+
{isError && (
From 5949b01f08f8ade1c2dee66d3514ac79ab14e819 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 11:52:22 +0530 Subject: [PATCH 238/455] apf auth initialization --- src/actions/InstallationHandler.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index a57efb45..b6c006b1 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -316,6 +316,12 @@ class Installation { public async runApfAuth(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: object): Promise{ + + // Initialize Progress Store For Apf Auth + ProgressStore.set('apfAuth.writeYaml', false); + ProgressStore.set('apfAuth.uploadYaml', false); + ProgressStore.set('apfAuth.success', false); + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') @@ -370,10 +376,11 @@ class Installation { public async initStcs(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: object): Promise{ - // Initialize Progress Store For Vsam + // Initialize Progress Store For Stcs ProgressStore.set('initStcs.writeYaml', false); ProgressStore.set('initStcs.uploadYaml', false); ProgressStore.set('initStcs.success', false); + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); @@ -438,6 +445,7 @@ class Installation { public async initVsam(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: object): Promise{ const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; + // Initialize Progress Store For Vsam ProgressStore.set('initVsam.writeYaml', false); ProgressStore.set('initVsam.uploadYaml', false); From 5374ed0225c498f51283d5884635e231c3b2130a Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 11:53:40 +0530 Subject: [PATCH 239/455] security initialization --- src/actions/InstallationHandler.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index b6c006b1..62679c19 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -349,6 +349,12 @@ class Installation { public async runInitSecurity(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: object): Promise{ + + // Initialize Progress Store For Security + ProgressStore.set('initSecurity.writeYaml', false); + ProgressStore.set('initSecurity.uploadYaml', false); + ProgressStore.set('initSecurity.success', false); + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') From da70b9c7daba9dd1908b78d9797ce9af1a246634 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 12:11:56 +0530 Subject: [PATCH 240/455] certificate initialization --- src/actions/InstallationHandler.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 62679c19..4f058560 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -425,6 +425,12 @@ class Installation { } async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: any){ + + // Initialize Progress Store For Certificates + ProgressStore.set('certificate.writeYaml', true); + ProgressStore.set('certificate.uploadYaml', false);; + ProgressStore.set('certificate.zweInitCertificate', false); + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') From 6889b7e2d28ccf29f84ce5ba2d2364cf0406dcd3 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 12:16:07 +0530 Subject: [PATCH 241/455] Installation initialization --- src/actions/InstallationHandler.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 4f058560..158dca62 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -262,6 +262,12 @@ class Installation { version: string, zoweConfig: any, ): Promise { + + // Initialize Progress Store For Dataset Installation + ProgressStore.set('installation.uploadYaml', false); + ProgressStore.set('installation.install', false); + ProgressStore.set('installation.initMVS', false); + const currentConfig: any = ConfigurationStore.getConfig(); const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; const savingResult = await this.generateYamlFile(zoweConfig); From 436d049f6b7d67db4694011482506c95af410538 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 12:23:20 +0530 Subject: [PATCH 242/455] unpax initialization --- src/actions/InstallationHandler.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 158dca62..d592fed0 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -62,6 +62,16 @@ class Installation { version: string, zoweConfig: any, ): Promise { + + // Initialize Progress Store For unpaxing + ProgressStore.set('downloadUnpax.uploadYaml', false); + ProgressStore.set('downloadUnpax.download', false); + ProgressStore.set('downloadUnpax.upload', false); + ProgressStore.set('downloadUnpax.unpax', false); + ProgressStore.set('downloadUnpax.getExampleYaml', false); + ProgressStore.set('downloadUnpax.getSchemas', false); + + const currentConfig: any = ConfigurationStore.getConfig(); const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; const savingResult = await this.generateYamlFile(zoweConfig); From 2321349f823d7d8205197e6ff522e75202aceb38 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 12:39:02 +0530 Subject: [PATCH 243/455] Bugfix --- src/actions/InstallationHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index d592fed0..a76691b4 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -443,7 +443,7 @@ class Installation { async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, zoweConfig: any){ // Initialize Progress Store For Certificates - ProgressStore.set('certificate.writeYaml', true); + ProgressStore.set('certificate.writeYaml', false); ProgressStore.set('certificate.uploadYaml', false);; ProgressStore.set('certificate.zweInitCertificate', false); From 2161a8b78069d477462679c7931679a759bd0428 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 17:11:46 +0530 Subject: [PATCH 244/455] Updating the stepper --- src/renderer/components/common/Stepper.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index c64a51db..b11e09f3 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -54,7 +54,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages completeProgress.reviewStatus ]; - const [subStageProgressStatus, setProgressStatus] = useState([ + const [subStageProgressStatus, setSubStageProgressStatus] = useState([ completeProgress.datasetInstallationStatus, completeProgress.networkingStatus, completeProgress.apfAuthStatus, @@ -73,11 +73,11 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages useEffect(() => { const mvsCompleteListener = (completed: boolean) => { - setProgressStatus([true, completeProgress.networkingStatus, - completeProgress.apfAuthStatus, - completeProgress.securityStatus, - completeProgress.certificateStatus, - completeProgress.launchConfigStatus]) + // setProgressStatus([true, completeProgress.networkingStatus, + // completeProgress.apfAuthStatus, + // completeProgress.securityStatus, + // completeProgress.certificateStatus, + // completeProgress.launchConfigStatus]) }; eventDispatcher.on('updateActiveStep', updateActiveStepListener); eventDispatcher.on('initMvsComplete', mvsCompleteListener); From 5ab1fb417e21cfc2c5f502efb7265cfd59412946 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 17:12:14 +0530 Subject: [PATCH 245/455] Updating the dataset instllation --- src/renderer/components/stages/installation/Installation.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index c1bb2484..30533c40 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -210,7 +210,6 @@ const Installation = () => { timer = setInterval(() => { window.electron.ipcRenderer.getInstallationProgress().then((res: any) => { setMvsDatasetInitializationProgress(res); - dispatch(setDatasetInstallationStatus(stageComplete)) eventDispatcher.emit('initMvsComplete', true); }) }, 3000); @@ -236,6 +235,7 @@ const Installation = () => { stages[STAGE_ID].isSkipped = status; mapAndSetSubStepSkipStatus(SUB_STAGE_ID, status); } + const updateProgress = (status: boolean) => { setStateUpdated(!stateUpdated); setStageSkipStatus(!status); @@ -283,7 +283,6 @@ const Installation = () => { toggleEditorVisibility("output"); }) updateProgress(false); - installProceedActions(false); stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; clearInterval(timer); } else { From 0fb7d121dac2682ecbad8e3ac1a2d86b1cadb6c0 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 17:14:07 +0530 Subject: [PATCH 246/455] Removing the eventlisterner --- src/renderer/components/common/Stepper.tsx | 9 --------- .../components/stages/installation/Installation.tsx | 2 -- 2 files changed, 11 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index b11e09f3..59be4489 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -72,18 +72,9 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const [editorContent, setEditorContent] = useState(''); useEffect(() => { - const mvsCompleteListener = (completed: boolean) => { - // setProgressStatus([true, completeProgress.networkingStatus, - // completeProgress.apfAuthStatus, - // completeProgress.securityStatus, - // completeProgress.certificateStatus, - // completeProgress.launchConfigStatus]) - }; eventDispatcher.on('updateActiveStep', updateActiveStepListener); - eventDispatcher.on('initMvsComplete', mvsCompleteListener); return () => { eventDispatcher.off('updateActiveStep', updateActiveStepListener); - eventDispatcher.off('initMvsComplete', mvsCompleteListener); }; }, []); diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 30533c40..6fe6d501 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -210,7 +210,6 @@ const Installation = () => { timer = setInterval(() => { window.electron.ipcRenderer.getInstallationProgress().then((res: any) => { setMvsDatasetInitializationProgress(res); - eventDispatcher.emit('initMvsComplete', true); }) }, 3000); } @@ -226,7 +225,6 @@ const Installation = () => { if(allAttributesTrue) { dispatch(setNextStepEnabled(true)); dispatch(setDatasetInstallationStatus(true)); - eventDispatcher.emit('initMvsComplete', true) } } From 539b60686b2bd074bb7b598ffb05352d411b68a3 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 18:41:48 +0530 Subject: [PATCH 247/455] Handling edge cases for instllation --- .../components/stages/installation/Installation.tsx | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 6fe6d501..43d39a92 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -201,6 +201,7 @@ const Installation = () => { if(allAttributesTrue) { dispatch(setNextStepEnabled(true)); dispatch(setDatasetInstallationStatus(true)); + setStageSkipStatus(false); } }, [mvsDatasetInitProgress]); @@ -210,6 +211,9 @@ const Installation = () => { timer = setInterval(() => { window.electron.ipcRenderer.getInstallationProgress().then((res: any) => { setMvsDatasetInitializationProgress(res); + if(res.success){ + clearInterval(timer); + } }) }, 3000); } @@ -225,6 +229,7 @@ const Installation = () => { if(allAttributesTrue) { dispatch(setNextStepEnabled(true)); dispatch(setDatasetInstallationStatus(true)); + setStageSkipStatus(false); } } @@ -246,7 +251,7 @@ const Installation = () => { const allAttributesTrue = Object.values(mvsDatasetInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; installProceedActions(status); - // setMvsDatasetInitializationProgress(getDatasetInstallationState()); + setMvsDatasetInitializationProgress(getDatasetInstallationState()); } const toggleEditorVisibility = (type: any) => { @@ -260,7 +265,6 @@ const Installation = () => { updateProgress(false); event.preventDefault(); dispatch(setLoading(true)); - setMvsDatasetInitProgress(datasetInstallationStatus) // FIXME: runtime dir is hardcoded, fix there and in InstallActions.ts - Unpax and Install functions Promise.all([ @@ -281,19 +285,14 @@ const Installation = () => { toggleEditorVisibility("output"); }) updateProgress(false); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; clearInterval(timer); } else { updateProgress(res.status); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; clearInterval(timer); } }).catch((err: any) => { clearInterval(timer); updateProgress(false); - installProceedActions(false); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; - stages[STAGE_ID].isSkipped = true; if (typeof err === "string") { console.warn('Installation failed', err); } else { From 25f111d38a36fa33da9dde2ec0d81123b1500c72 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 18:52:32 +0530 Subject: [PATCH 248/455] code cleanup --- src/renderer/components/stages/InitApfAuth.tsx | 4 ---- src/renderer/components/stages/Security.tsx | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index e57ca10d..54ea2185 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -220,12 +220,10 @@ const InitApfAuth = () => { }) updateProgress(false); //res.status may not necessarily be false, even if things go wrong apfAuthProceedActions(false); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; clearInterval(timer); } else { updateProgress(res.status); apfAuthProceedActions(res.status); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; clearInterval(timer); } }).catch((err: any) => { @@ -234,8 +232,6 @@ const InitApfAuth = () => { updateProgress(false); // TODO: Test this //alertEmitter.emit('showAlert', err.toString(), 'error'); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; - stages[STAGE_ID].isSkipped = true; if (typeof err === "string") { console.warn('zwe init apfauth failed', err); } else { diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index d4dd5637..81f2dac5 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -219,11 +219,9 @@ const Security = () => { }) updateProgress(false); securityProceedActions(false); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; clearInterval(timer); } else { securityProceedActions(res.status); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = !res.status; clearInterval(timer); } }).catch((err: any) => { @@ -232,8 +230,6 @@ const Security = () => { updateProgress(false); clearInterval(timer); securityProceedActions(false); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = true; - stages[STAGE_ID].isSkipped = true; if (typeof err === "string") { console.warn('zwe init security failed', err); } else { From 4937dcbc2f3405b65d56142da26c0c6ca8d08089 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 19:35:34 +0530 Subject: [PATCH 249/455] Updating the substep skip array --- src/renderer/components/stages/InitApfAuth.tsx | 1 - src/renderer/components/stages/Security.tsx | 1 + src/renderer/components/stages/installation/Installation.tsx | 1 - src/renderer/components/stages/progress/StageProgressStatus.ts | 1 + 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 54ea2185..4f353493 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -280,7 +280,6 @@ const InitApfAuth = () => { setIsFormValid(isValid); setFormError(errorMsg); setSetupYaml(data); - updateProgress(proceed); } return ( diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 81f2dac5..abf65fb6 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -221,6 +221,7 @@ const Security = () => { securityProceedActions(false); clearInterval(timer); } else { + updateProgress(res.status); securityProceedActions(res.status); clearInterval(timer); } diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 43d39a92..b0b41209 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -173,7 +173,6 @@ const Installation = () => { }) dispatch(setNextStepEnabled(getProgress('datasetInstallationStatus'))); - dispatch(setNextStepEnabled(true)); if(installationType === 'smpe') { const status = getProgress('datasetInstallationStatus'); diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 061f73db..11603375 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -282,6 +282,7 @@ export const mapAndGetSubStepSkipStatus = (subStageId: number): boolean => { skipStatus.networking, skipStatus.apfAuth, skipStatus.security, + skipStatus.stcs, skipStatus.certificate, skipStatus.vsam, skipStatus.launchConfig From 5da1eff15e69ac1a0aec2103c42021da270c2522 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 26 Jun 2024 19:52:41 +0530 Subject: [PATCH 250/455] Removing error prop --- src/renderer/components/common/Stepper.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 59be4489..988011cd 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -164,7 +164,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages } } - const getStepIcon = (error: any, stageId: number, isSubStep?: boolean, subStepId?: number) => { + const getStepIcon = (stageId: number, isSubStep?: boolean, subStepId?: number) => { if ((isSubStep && getProgress(stages[stageId].subStages[subStepId].statusKey)) || (!isSubStep && ((stageId == 0 && connectionStatus) || (getProgress(stages[stageId].statusKey))))) { return } />; @@ -256,8 +256,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages boxShadow: 'rgb(0 0 0 / 15%) 0px 6px 4px -1px inset'} : {}}> : }> - icon={getStepIcon(labelProps.error, stage.id)}> + icon={getStepIcon(stage.id)}> handleStepperClick(stage.id, !!stage.subStage)}>{stage.label}
@@ -275,8 +274,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages : }> - icon={getStepIcon(labelProps.error, activeStep, true, index)}> + icon={getStepIcon(activeStep, true, index)}> handleStepperClick(activeStep, true, stage.id )}>{stage.label} From 4f8f067952c84d02a39ae8e4ea58d3319af1aa39 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 26 Jun 2024 11:16:27 -0400 Subject: [PATCH 251/455] Reset values on new install Signed-off-by: Timothy Gerstel --- src/renderer/components/Home.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 0fdf2494..04a5617a 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -65,12 +65,14 @@ const lastActiveState: ActiveState = { }; const makeCard = (card: ICard) => { + const dispatch = useAppDispatch(); const {id, name, description, link, media} = card; return ( { const flattenedData = flatten(lastActiveState); localStorage.setItem(prevInstallationKey, JSON.stringify(flattenedData)); + if(id === "install") dispatch(setYaml(FALLBACK_YAML)); }}> Date: Wed, 26 Jun 2024 16:09:52 -0400 Subject: [PATCH 252/455] Fix error for undefined object Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index b3f32e39..a5953b0e 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -119,12 +119,15 @@ const Installation = () => { yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; } if (installationArgs.javaHome) { + if(yamlObj.java === undefined) yamlObj.java = {home: ""} yamlObj.java.home = installationArgs.javaHome; } if (installationArgs.nodeHome) { + if(yamlObj.node === undefined) yamlObj.node = {home: ""} yamlObj.node.home = installationArgs.nodeHome; } if (installationArgs.zosmfHost) { + if(yamlObj.zOSMF === undefined) yamlObj.zOSMF = {host: "", port: 443, applId: ""} yamlObj.zOSMF.host = installationArgs.zosmfHost; } if ((yamlObj.zOSMF.port === undefined || yamlObj.zOSMF.port === '') && installationArgs.zosmfPort) { From 9ec8658bb48265a62aa8c59c7bf2d12db219bb4c Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Wed, 26 Jun 2024 16:57:13 -0400 Subject: [PATCH 253/455] Reset counter properly + don't forget the current char Signed-off-by: Leanid Astrakou --- src/services/ServiceUtils.ts | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index e4a49675..f34018ce 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -117,6 +117,7 @@ export function isValidUSSPath(path: string): boolean { // This adds a "\n" inside Unix commands separated by ";" if char limit reached export function parseUnixScriptByNumOfChars(script: string, charCount: number = JCL_UNIX_SCRIPT_CHARS): string { + console.log("I am being fed string '" + script + "'"); const parts: string[] = []; let currentPart = ''; let counter = 0; @@ -128,24 +129,27 @@ export function parseUnixScriptByNumOfChars(script: string, charCount: number = if (lastSpaceIndex !== -1) { // If there's a space within the character limit, backtrack to the last encountered space const backtrackedPart = currentPart.substring(0, lastSpaceIndex); - parts.push(backtrackedPart); - currentPart = currentPart.substring(lastSpaceIndex + 1); - } - if (currentPart.length > 0) { - // Add the current part and reset the counter - parts.push('\n'); - counter = 0; + parts.push(backtrackedPart + '\n'); + currentPart = currentPart.substring(lastSpaceIndex + 1) + script[i]; // Include the current character + } else { + // If no space found, push the currentPart as is + parts.push(currentPart + '\n'); + currentPart = script[i]; // Don't forget the current char we are on } + counter = currentPart.length; + } else { + currentPart += script[i]; + counter++; } - currentPart += script[i]; - counter++; } if (currentPart.length > 0) { parts.push(currentPart); } + console.log("I am returning string '" + parts.join('') + "'"); return parts.join(''); } + export function startBPXBATCHAndShellSession(jobName: string = JCL_JOBNAME_DEFAULT): string { return `//${jobName} EXEC PGM=BPXBATCH,REGION=0M //STDOUT DD SYSOUT=* From f20c23984d182ad3ff32b579dd4852970b04f30a Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Wed, 26 Jun 2024 17:02:06 -0400 Subject: [PATCH 254/455] Remove comments Signed-off-by: Leanid Astrakou --- src/services/ServiceUtils.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index f34018ce..6ed61482 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -117,7 +117,6 @@ export function isValidUSSPath(path: string): boolean { // This adds a "\n" inside Unix commands separated by ";" if char limit reached export function parseUnixScriptByNumOfChars(script: string, charCount: number = JCL_UNIX_SCRIPT_CHARS): string { - console.log("I am being fed string '" + script + "'"); const parts: string[] = []; let currentPart = ''; let counter = 0; @@ -145,7 +144,6 @@ export function parseUnixScriptByNumOfChars(script: string, charCount: number = if (currentPart.length > 0) { parts.push(currentPart); } - console.log("I am returning string '" + parts.join('') + "'"); return parts.join(''); } From e70a6646209f83b8573d90718bd53bd4a148e8ad Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Wed, 26 Jun 2024 17:12:23 -0400 Subject: [PATCH 255/455] Another small edgecase Signed-off-by: Leanid Astrakou --- src/services/RunScript.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/RunScript.ts b/src/services/RunScript.ts index d87fb602..9ba93f19 100644 --- a/src/services/RunScript.ts +++ b/src/services/RunScript.ts @@ -19,8 +19,8 @@ export class Script { const jcl = `${config.jobStatement} ${startBPXBATCHAndShellSession("ZNSCRPT")} -${parseUnixScriptByNumOfChars(script)} && -echo "${JCL_UNIX_SCRIPT_OK}" +${parseUnixScriptByNumOfChars(script)} +&& echo "${JCL_UNIX_SCRIPT_OK}" /* ` console.log(`JOB: ${jcl}`) const resp: IJobResults = await submitJcl(config, jcl, ["STDOUT", "STDERR"]) From 82a4149accaf2acfd42144240a9219ea26e95319 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 26 Jun 2024 17:32:38 -0400 Subject: [PATCH 256/455] Fix undefined port Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index a5953b0e..27aa8d3d 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -126,8 +126,8 @@ const Installation = () => { if(yamlObj.node === undefined) yamlObj.node = {home: ""} yamlObj.node.home = installationArgs.nodeHome; } + if(yamlObj.zOSMF === undefined) yamlObj.zOSMF = {host: "", port: 443, applId: ""} if (installationArgs.zosmfHost) { - if(yamlObj.zOSMF === undefined) yamlObj.zOSMF = {host: "", port: 443, applId: ""} yamlObj.zOSMF.host = installationArgs.zosmfHost; } if ((yamlObj.zOSMF.port === undefined || yamlObj.zOSMF.port === '') && installationArgs.zosmfPort) { From 65519fd515ea0e3cc50e5334ad0473ecad9d5e46 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 26 Jun 2024 18:09:44 -0400 Subject: [PATCH 257/455] Add worpWrap Signed-off-by: Timothy Gerstel --- src/renderer/components/common/MonacoEditor.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/common/MonacoEditor.tsx b/src/renderer/components/common/MonacoEditor.tsx index 12186e31..fa188c77 100644 --- a/src/renderer/components/common/MonacoEditor.tsx +++ b/src/renderer/components/common/MonacoEditor.tsx @@ -49,6 +49,7 @@ const MonacoEditorComponent = ({contentType, initialContent, onContentChange, is editorRef.current = monaco.editor.create(document.getElementById('monaco-editor-container'), { language: lang, theme: theme, + wordWrap: "on", value: initialContent, readOnly: readOnly }); From 2091fee0ce2d0667c8860b6ebd1d5795951f3dbb Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 26 Jun 2024 18:49:02 -0400 Subject: [PATCH 258/455] Fix job output, mostly Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 27aa8d3d..6c5ea41d 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -265,7 +265,7 @@ const Installation = () => { } if (!res.status && res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe install alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); - window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details[3])).then((res: any) => { + window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details[3], null, 2).replace(/\\\\r\\\\n/gm, '\r\n')).then((res: any) => { toggleEditorVisibility("output"); }) updateProgress(false); From 8dc51a5fa4e7dc190e213755843509df8deadb18 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 26 Jun 2024 18:56:48 -0400 Subject: [PATCH 259/455] Dont store password Signed-off-by: Timothy Gerstel --- src/actions/ConnectionHandler.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/actions/ConnectionHandler.ts b/src/actions/ConnectionHandler.ts index ebe9f0a6..ff91b922 100644 --- a/src/actions/ConnectionHandler.ts +++ b/src/actions/ConnectionHandler.ts @@ -37,6 +37,7 @@ export class FTPConnection extends Connection { } } if (response.status) { + config.password = ""; this.saveConnectionData(config); } return response; From 58702ea0809d2dcfd20ef5060f0fd8082a7abedc Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 27 Jun 2024 11:59:56 +0530 Subject: [PATCH 260/455] Removing error attr --- src/renderer/components/common/Stepper.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 988011cd..5bea1dee 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -255,7 +255,6 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages borderTopLeftRadius: '7px', boxShadow: 'rgb(0 0 0 / 15%) 0px 6px 4px -1px inset'} : {}}> handleStepperClick(stage.id, !!stage.subStage)}>{stage.label} @@ -273,7 +272,6 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages return ( handleStepperClick(activeStep, true, stage.id )}>{stage.label} From 8573f1d1109b89311d40d90b4957e8bc76e79072 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 27 Jun 2024 12:09:56 +0530 Subject: [PATCH 261/455] Adding some coditions --- .../components/stages/progress/StageProgressStatus.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 11603375..a93876c2 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -272,6 +272,9 @@ export const initializeProgress = (host: string, user: string) => { } export const mapAndSetSubStepSkipStatus = (subStageId: number, value: boolean): void => { + if(subStageId < 0 || subStageId > 7) { + return; + } setSubStageSkipStatus(subStepSkipKeysArray[subStageId], value); } @@ -292,6 +295,9 @@ export const mapAndGetSubStepSkipStatus = (subStageId: number): boolean => { } export const mapAndSetStepSkipStatus = (stageId: number, value: boolean): void => { + if(stageId < 0 || stageId > 5) { + return; + } setStageSkipStatus(stepSkipKeysArray[stageId-1], value); } From 47dbe7ff757a0570d3a262f4f9e5d1202b06ebd8 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 27 Jun 2024 12:19:38 +0530 Subject: [PATCH 262/455] Updating the consitions --- .../components/stages/progress/StageProgressStatus.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index a93876c2..31f4b13f 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -279,6 +279,9 @@ export const mapAndSetSubStepSkipStatus = (subStageId: number, value: boolean): } export const mapAndGetSubStepSkipStatus = (subStageId: number): boolean => { + if(subStageId < 0 || subStageId > 7) { + return true; // Skip the sub-stage if the id is out of the valid range of the sub-stages (0-5) + } const skipStatus = getSubStageSkipStatus(); const skipStatusArray = [ skipStatus.datasetInstallation, @@ -301,7 +304,10 @@ export const mapAndSetStepSkipStatus = (stageId: number, value: boolean): void = setStageSkipStatus(stepSkipKeysArray[stageId-1], value); } -export const mapAndGetStepSkipStatus = (subStageId: number): boolean => { +export const mapAndGetStepSkipStatus = (stageId: number): boolean => { + if(stageId < 0 || stageId > 5) { + return true; // Skip the stage if the stageId is out of the valid range of the stages (0-5) + } const skipStatus = getStageSkipStatus(); const skipStatusArray = [ skipStatus.planning, @@ -311,7 +317,7 @@ export const mapAndGetStepSkipStatus = (subStageId: number): boolean => { skipStatus.reviewInstallation ] - return skipStatusArray[subStageId-1]; + return skipStatusArray[stageId-1]; } export const setSubStageSkipStatus = (key: keyof subStepState, newValue: boolean): void => { From 10dff9fee3a53e54f3375bfb668d92ea5157ba01 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 27 Jun 2024 20:00:20 +0530 Subject: [PATCH 263/455] Bugfix --- src/renderer/components/stages/Certificates.tsx | 2 +- src/renderer/components/stages/InitApfAuth.tsx | 2 +- src/renderer/components/stages/Security.tsx | 2 +- src/renderer/components/stages/Stcs.tsx | 3 ++- src/renderer/components/stages/Vsam.tsx | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index ec13adbf..309d11da 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -116,7 +116,7 @@ const Certificates = () => { } setShowProgress(initClicked || getProgress('certificateStatus')); - updateProgress(getProgress('certificateStatus')); + updateProgress(getProgress('certificateStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); setIsFormInit(true); return () => { diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 4f353493..62a2a28f 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -110,7 +110,7 @@ const InitApfAuth = () => { nextPosition?.scrollIntoView({behavior: 'smooth'}); } - updateProgress(getProgress('apfAuthStatus')); + // updateProgress(getProgress('apfAuthStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); setInit(true); return () => { diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index abf65fb6..564d771c 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -114,7 +114,7 @@ const Security = () => { nextPosition?.scrollIntoView({behavior: 'smooth'}); } - updateProgress(getProgress('securityStatus')); + // updateProgress(getProgress('securityStatus')); setInit(true); return () => { diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 4cab2864..7b86c0ad 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -114,7 +114,8 @@ const Stcs = () => { nextPosition?.scrollIntoView({behavior: 'smooth'}); } - updateProgress(getProgress('stcsStatus')); + updateProgress(getProgress('stcsStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + // setNextStepEnabled(getProgress('stcsStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); setInit(true); if(!setupYaml) { diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 37f13e62..245b8672 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -99,7 +99,7 @@ const Vsam = () => { nextPosition?.scrollIntoView({behavior: 'smooth'}); } - updateProgress(getProgress('vsamStatus')); + // updateProgress(getProgress('vsamStatus')); setInit(true); return () => { From 15a3fa44f8b0c81734f0e940851aaccc738742ba Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 27 Jun 2024 20:30:42 +0530 Subject: [PATCH 264/455] Updating progress in edge cases --- src/renderer/components/stages/InitApfAuth.tsx | 2 +- src/renderer/components/stages/Security.tsx | 2 +- src/renderer/components/stages/Stcs.tsx | 1 - src/renderer/components/stages/Vsam.tsx | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 62a2a28f..8b8ccb87 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -110,7 +110,7 @@ const InitApfAuth = () => { nextPosition?.scrollIntoView({behavior: 'smooth'}); } - // updateProgress(getProgress('apfAuthStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + updateProgress(getProgress('apfAuthStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); setInit(true); return () => { diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 564d771c..a214bbfe 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -114,7 +114,7 @@ const Security = () => { nextPosition?.scrollIntoView({behavior: 'smooth'}); } - // updateProgress(getProgress('securityStatus')); + updateProgress(getProgress('securityStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); setInit(true); return () => { diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 7b86c0ad..d8e2f075 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -115,7 +115,6 @@ const Stcs = () => { } updateProgress(getProgress('stcsStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); - // setNextStepEnabled(getProgress('stcsStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); setInit(true); if(!setupYaml) { diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 245b8672..fa26d880 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -99,7 +99,7 @@ const Vsam = () => { nextPosition?.scrollIntoView({behavior: 'smooth'}); } - // updateProgress(getProgress('vsamStatus')); + updateProgress(getProgress('vsamStatus') && !stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); setInit(true); return () => { From 32a763264895ae113500d05484f18acecab579a1 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 27 Jun 2024 20:43:59 +0530 Subject: [PATCH 265/455] Fixing the status of the networking and the launch config stage --- src/renderer/components/stages/LaunchConfig.tsx | 3 +-- src/renderer/components/stages/Networking.tsx | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 4b4b760a..b2a19dd6 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -470,8 +470,7 @@ const LaunchConfig = () => { nextPosition.scrollIntoView({behavior: 'smooth'}); dispatch(setNextStepEnabled(getProgress('launchConfigStatus'))); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = false; - stages[STAGE_ID].isSkipped = isInitializationSkipped; + setIsFormInit(true); return () => { diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 09b7aa6b..efafb76d 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -681,8 +681,7 @@ const Networking = () => { if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); dispatch(setNextStepEnabled(getProgress('networkingStatus'))); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = false; - stages[STAGE_ID].isSkipped = isInitializationSkipped; + setIsFormInit(true); return () => { From 02878ec67adf9be4e48e9651ed2ef73d1a172860 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 27 Jun 2024 16:02:39 -0400 Subject: [PATCH 266/455] Only wordwrap non yaml output Signed-off-by: Timothy Gerstel --- src/renderer/components/common/MonacoEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/common/MonacoEditor.tsx b/src/renderer/components/common/MonacoEditor.tsx index fa188c77..8be5fbd6 100644 --- a/src/renderer/components/common/MonacoEditor.tsx +++ b/src/renderer/components/common/MonacoEditor.tsx @@ -49,7 +49,7 @@ const MonacoEditorComponent = ({contentType, initialContent, onContentChange, is editorRef.current = monaco.editor.create(document.getElementById('monaco-editor-container'), { language: lang, theme: theme, - wordWrap: "on", + wordWrap: contentType === "yaml" ? "off" : "on", value: initialContent, readOnly: readOnly }); From a59ed0f39d44534e87347a71e3130f8487c81cf9 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Thu, 27 Jun 2024 20:20:39 -0400 Subject: [PATCH 267/455] Add valid path check for log, workspace, extensions dir Signed-off-by: Leanid Astrakou --- src/actions/InstallationHandler.ts | 2 +- src/renderer/components/Home.tsx | 2 +- src/renderer/components/common/EditorDialog.tsx | 2 +- src/renderer/components/common/Stepper.tsx | 2 +- .../components/common/{Constants.tsx => Utils.tsx} | 6 ++++++ .../components/configuration-wizard/Wizard.tsx | 2 +- src/renderer/components/stages/Certificates.tsx | 2 +- src/renderer/components/stages/InitApfAuth.tsx | 2 +- src/renderer/components/stages/LaunchConfig.tsx | 2 +- src/renderer/components/stages/Networking.tsx | 2 +- src/renderer/components/stages/Planning.tsx | 11 ++++++++++- src/renderer/components/stages/ReviewInstallation.tsx | 2 +- src/renderer/components/stages/Security.tsx | 2 +- src/renderer/components/stages/Stcs.tsx | 2 +- src/renderer/components/stages/Unpax.tsx | 2 +- src/renderer/components/stages/Vsam.tsx | 2 +- .../components/stages/connection/connectionSlice.ts | 2 +- .../stages/installation/InstallTypeSelection.tsx | 2 +- .../components/stages/installation/Installation.tsx | 2 +- src/services/CheckJava.ts | 2 +- src/services/CheckNode.ts | 2 +- src/services/CheckSpace.ts | 2 +- src/services/RunScript.ts | 2 +- src/services/ServiceUtils.ts | 7 +------ src/storage/ConnectionStore.ts | 2 +- src/storage/EditorStore.ts | 2 +- 26 files changed, 40 insertions(+), 30 deletions(-) rename src/renderer/components/common/{Constants.tsx => Utils.tsx} (99%) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 4107986b..613cf98f 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -18,7 +18,7 @@ import { ProgressStore } from "../storage/ProgressStore"; import * as fs from 'fs'; import { ConfigurationStore } from '../storage/ConfigurationStore'; import { InstallationArgs } from '../types/stateInterfaces'; -import { FALLBACK_SCHEMA, deepMerge } from '../renderer/components/common/Constants'; +import { FALLBACK_SCHEMA, deepMerge } from '../renderer/components/common/Utils'; //AJV did not like the regex in our current schema diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 04a5617a..375d066d 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -27,7 +27,7 @@ import HorizontalLinearStepper from './common/Stepper'; import Wizard from './configuration-wizard/Wizard' import { ActiveState } from '../../types/stateInterfaces'; import { getInstallationArguments, getPreviousInstallation } from './stages/progress/StageProgressStatus'; -import { DEF_NO_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from './common/Constants'; +import { DEF_NO_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from './common/Utils'; import { selectInstallationArgs, setInstallationArgs } from './stages/installation/installationSlice'; // REVIEW: Get rid of routing diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index 57ccdafa..dfd0062f 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -15,7 +15,7 @@ import { selectYaml, selectOutput, setNextStepEnabled, setYaml } from '../config import MonacoEditorComponent from "../common/MonacoEditor"; import { parse, stringify } from "yaml"; import { IResponse } from "../../../types/interfaces"; -import { DEF_NO_OUTPUT, schemaValidate } from "./Constants"; +import { DEF_NO_OUTPUT, schemaValidate } from "./Utils"; import { alertEmitter } from "../Header"; const test_jcl = ` diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 57ac584d..764f8100 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -27,7 +27,7 @@ import savedInstall from '../../assets/saved-install-green.png'; import eventDispatcher from '../../../services/eventDispatcher'; import Warning from '@mui/icons-material/Warning'; import CheckCircle from '@mui/icons-material/CheckCircle'; -import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, INIT_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, UNPAX_STAGE_LABEL } from '../common/Constants'; +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, INIT_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, UNPAX_STAGE_LABEL } from '../common/Utils'; import { getProgress, getCompleteProgress, mapAndSetSkipStatus, mapAndGetSkipStatus } from '../stages/progress/StageProgressStatus'; import '../../styles/Stepper.css'; diff --git a/src/renderer/components/common/Constants.tsx b/src/renderer/components/common/Utils.tsx similarity index 99% rename from src/renderer/components/common/Constants.tsx rename to src/renderer/components/common/Utils.tsx index 66f1e83a..ed65f8b3 100644 --- a/src/renderer/components/common/Constants.tsx +++ b/src/renderer/components/common/Utils.tsx @@ -51,6 +51,12 @@ export function deepMerge(base: any, extension:any) { return base; } +// Check if the path starts with a slash and does not contain spaces +export function isValidUSSPath(path: string): boolean { + const validUSSRegex = /^\/[\w\/-]+$/; + return validUSSRegex.test(path); +} + export const SERVER_COMMON = { "$schema": "https://json-schema.org/draft/2019-09/schema", "$id": "https://zowe.org/schemas/v2/server-common", diff --git a/src/renderer/components/configuration-wizard/Wizard.tsx b/src/renderer/components/configuration-wizard/Wizard.tsx index 566634cf..02b600ab 100644 --- a/src/renderer/components/configuration-wizard/Wizard.tsx +++ b/src/renderer/components/configuration-wizard/Wizard.tsx @@ -27,7 +27,7 @@ import Vsam from '../stages/Vsam'; import LaunchConfig from '../stages/LaunchConfig'; import { getProgress } from '../stages/progress/StageProgressStatus'; import Unpax from '../stages/Unpax'; -import { APF_AUTH_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, CONNECTION_STAGE_LABEL, FINISH_INSTALL_STAGE_LABEL, INIT_STAGE_LABEL, INSTALLATION_TYPE_STAGE_LABEL, INSTALL_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL, NETWORKING_STAGE_LABEL, PLANNING_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, SECURITY_STAGE_LABEL, UNPAX_STAGE_LABEL, VSAM_STAGE_LABEL } from '../common/Constants'; +import { APF_AUTH_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, CONNECTION_STAGE_LABEL, FINISH_INSTALL_STAGE_LABEL, INIT_STAGE_LABEL, INSTALLATION_TYPE_STAGE_LABEL, INSTALL_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL, NETWORKING_STAGE_LABEL, PLANNING_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, SECURITY_STAGE_LABEL, UNPAX_STAGE_LABEL, VSAM_STAGE_LABEL } from '../common/Utils'; const mvsDatasetInitProgress = getProgress('datasetInstallationStatus'); diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 11734012..c1496529 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -26,7 +26,7 @@ import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { CertInitSubStepsState } from "../../../types/stateInterfaces"; -import { TYPE_YAML, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv, deepMerge } from "../common/Constants"; +import { TYPE_YAML, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv, deepMerge } from "../common/Utils"; const Certificates = () => { diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index ce8dc4ec..510dbf6b 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -25,7 +25,7 @@ import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { getProgress, setApfAuthState, getApfAuthState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; -import { JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, INIT_STAGE_LABEL, APF_AUTH_STAGE_LABEL, ajv, SERVER_COMMON } from "../common/Constants"; +import { JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, INIT_STAGE_LABEL, APF_AUTH_STAGE_LABEL, ajv, SERVER_COMMON } from "../common/Utils"; const InitApfAuth = () => { diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 950cc9f0..33ff298a 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -20,7 +20,7 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { stages } from "../configuration-wizard/Wizard"; import { selectInitializationStatus, setInitializationStatus, setLaunchConfigStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; -import { TYPE_YAML, TYPE_OUTPUT, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL } from "../common/Constants"; +import { TYPE_YAML, TYPE_OUTPUT, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL } from "../common/Utils"; import { IResponse } from "../../../types/interfaces"; import { getInstallationArguments, getProgress, isInitComplete } from "./progress/StageProgressStatus"; import { selectConnectionArgs } from "./connection/connectionSlice"; diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 8ac5684f..c6c59c86 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -19,7 +19,7 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { stages } from "../configuration-wizard/Wizard"; import { selectInitializationStatus, setInitializationStatus, setNetworkingStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; -import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, ajv } from "../common/Constants"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, ajv } from "../common/Utils"; import { IResponse } from "../../../types/interfaces"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { getInstallationArguments, getProgress, isInitComplete } from "./progress/StageProgressStatus"; diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 467ff1eb..cd55ca4e 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -30,7 +30,7 @@ import { setActiveStep } from './progress/activeStepSlice'; import EditorDialog from "../common/EditorDialog"; import { getStageDetails } from "../../../services/StageDetails"; import { getProgress, getPlanningStageStatus, setPlanningValidationDetailsState, getPlanningValidationDetailsState, getInstallationTypeStatus } from "./progress/StageProgressStatus"; -import { FALLBACK_YAML } from "../common/Constants"; +import { FALLBACK_YAML, isValidUSSPath } from "../common/Utils"; // TODO: Our current theoretical cap is 72 (possibly minus a couple for "\n", 70?) But we force more chars in InstallationHandler.tsx // This is all I want to manually test for now. Future work can min/max this harder @@ -263,6 +263,15 @@ const Planning = () => { setEditorContent(res.map(item=>item?.details).join('\n')); setContentType('output'); + if (localYaml?.zowe?.logDirectory && !isValidUSSPath(localYaml.zowe.logDirectory)) { + details.error = localYaml.zowe.logDirectory + " is not a valid z/OS Unix path" + } + if (localYaml?.zowe?.extensionDirectory && !isValidUSSPath(localYaml.zowe.extensionDirectory)) { + details.error = localYaml.zowe.extensionDirectory + " is not a valid z/OS Unix path" + } + if (localYaml?.zowe?.workspaceDirectory && !isValidUSSPath(localYaml.zowe.workspaceDirectory)) { + details.error = localYaml.zowe.logDirectory + " is not a valid z/OS Unix path" + } // If res[?] doesn't exist, ?-th window.electronc.ipcRender call failed... try { details.javaVersion = res[0].details.split('\n').filter((i: string) => i.trim().startsWith('java version'))[0].trim().slice(14, -1); diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index a0e3d27e..340ec70a 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -24,7 +24,7 @@ import { selectConnectionStatus, setReviewStatus } from './progress/progressSlic import { setActiveStep } from './progress/activeStepSlice'; import { setNextStepEnabled } from '../configuration-wizard/wizardSlice'; import { getStageDetails } from "../../../services/StageDetails"; -import { TYPE_YAML, TYPE_OUTPUT } from '../common/Constants'; +import { TYPE_YAML, TYPE_OUTPUT } from '../common/Utils'; import { getCompleteProgress } from "./progress/StageProgressStatus"; import '../../styles/ReviewInstallation.css'; diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 1a0eea03..9a228f16 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -26,7 +26,7 @@ import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { getProgress, setSecurityInitState, getSecurityInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; -import { JCL_UNIX_SCRIPT_OK, INIT_STAGE_LABEL, SECURITY_STAGE_LABEL, ajv, SERVER_COMMON } from '../common/Constants'; +import { JCL_UNIX_SCRIPT_OK, INIT_STAGE_LABEL, SECURITY_STAGE_LABEL, ajv, SERVER_COMMON } from '../common/Utils'; import { alertEmitter } from "../Header"; const Security = () => { diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 2f52e5bd..f2ca3ed5 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -25,7 +25,7 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { getProgress, setStcsInitState, getStcsInitState, mapAndSetSkipStatus, getInstallationArguments, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; -import { INIT_STAGE_LABEL, STC_STAGE_LABEL, ajv } from "../common/Constants"; +import { INIT_STAGE_LABEL, STC_STAGE_LABEL, ajv } from "../common/Utils"; const Stcs = () => { diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index f813db03..3a7ae643 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -23,7 +23,7 @@ import React from "react"; import ProgressCard from "../common/ProgressCard"; import { alertEmitter } from "../Header"; import { IResponse } from "../../../types/interfaces"; -import { UNPAX_STAGE_LABEL } from "../common/Constants"; +import { UNPAX_STAGE_LABEL } from "../common/Utils"; const Unpax = () => { diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index c0bb9122..a713ff58 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -27,7 +27,7 @@ import { getStageDetails, getSubStageDetails } from "../../../services/StageDeta import { getProgress, setVsamInitState, mapAndSetSkipStatus, getInstallationArguments, getVsamInitState, isInitComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; -import { INIT_STAGE_LABEL, ajv } from "../common/Constants"; +import { INIT_STAGE_LABEL, ajv } from "../common/Utils"; const Vsam = () => { diff --git a/src/renderer/components/stages/connection/connectionSlice.ts b/src/renderer/components/stages/connection/connectionSlice.ts index 8387088e..b4d6e5af 100644 --- a/src/renderer/components/stages/connection/connectionSlice.ts +++ b/src/renderer/components/stages/connection/connectionSlice.ts @@ -11,7 +11,7 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '../../../store'; import { IIpcConnectionArgs, IIpcConnectionArgsSecureOptions } from '../../../../types/interfaces'; -import { DEF_JOB_STATEMENT } from '../../common/Constants'; +import { DEF_JOB_STATEMENT } from '../../common/Utils'; export interface ConnectionState { connectionArgs: IIpcConnectionArgs; diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index b29e4da4..874eda7e 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -21,7 +21,7 @@ import LicenseDialog from "./LicenseDialog"; import { setActiveStep } from "../progress/activeStepSlice"; import { getStageDetails } from "../../../../services/StageDetails"; import { getInstallationTypeStatus } from "../progress/StageProgressStatus"; -import { INSTALLATION_TYPE_STAGE_LABEL } from "../../common/Constants"; +import { INSTALLATION_TYPE_STAGE_LABEL } from "../../common/Utils"; const InstallationType = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 6c5ea41d..f7a935c8 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -24,7 +24,7 @@ import { alertEmitter } from "../../Header"; import { createTheme } from '@mui/material/styles'; import {stages} from "../../configuration-wizard/Wizard"; import { setActiveStep } from "../progress/activeStepSlice"; -import { TYPE_YAML, TYPE_OUTPUT, JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, INSTALL_STAGE_LABEL} from '../../common/Constants'; +import { TYPE_YAML, TYPE_OUTPUT, JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, INSTALL_STAGE_LABEL} from '../../common/Utils'; import { getStageDetails, getSubStageDetails } from "../../../../services/StageDetails"; import { getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus, isInitComplete } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; diff --git a/src/services/CheckJava.ts b/src/services/CheckJava.ts index 021a4ae2..8e1ce497 100644 --- a/src/services/CheckJava.ts +++ b/src/services/CheckJava.ts @@ -8,7 +8,7 @@ * Copyright Contributors to the Zowe Project. */ -import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Constants"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; import { startBPXBATCHAndShellSession } from "./ServiceUtils"; diff --git a/src/services/CheckNode.ts b/src/services/CheckNode.ts index 80af3db4..5fffffd5 100644 --- a/src/services/CheckNode.ts +++ b/src/services/CheckNode.ts @@ -11,7 +11,7 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; import { startBPXBATCHAndShellSession } from "./ServiceUtils"; -import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Constants"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; export class CheckNode { diff --git a/src/services/CheckSpace.ts b/src/services/CheckSpace.ts index 13018bc9..f51f9303 100644 --- a/src/services/CheckSpace.ts +++ b/src/services/CheckSpace.ts @@ -11,7 +11,7 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; import { startBPXBATCHAndShellSession } from "./ServiceUtils"; -import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Constants"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; export class CheckSpace { diff --git a/src/services/RunScript.ts b/src/services/RunScript.ts index 9ba93f19..7dccb41d 100644 --- a/src/services/RunScript.ts +++ b/src/services/RunScript.ts @@ -11,7 +11,7 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; import { parseUnixScriptByNumOfChars, startBPXBATCHAndShellSession } from "./ServiceUtils"; -import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Constants"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; export class Script { diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts index 6ed61482..08c72a62 100644 --- a/src/services/ServiceUtils.ts +++ b/src/services/ServiceUtils.ts @@ -12,6 +12,7 @@ import {IIpcConnectionArgs} from "../types/interfaces"; import Header from "../renderer/components/Header" import { AlertColor } from "@mui/material/Alert"; import zos from 'zos-node-accessor'; +import { isValidUSSPath } from "../renderer/components/common/Utils"; // Note: This file is not usable by the Renderer @@ -109,12 +110,6 @@ export function reducePath(path: string): string { return path.substring(0, path.lastIndexOf('/')); } -// Check if the path starts with a slash and does not contain spaces -export function isValidUSSPath(path: string): boolean { - const validUSSRegex = /^\/[\w\/-]+$/; - return validUSSRegex.test(path); -} - // This adds a "\n" inside Unix commands separated by ";" if char limit reached export function parseUnixScriptByNumOfChars(script: string, charCount: number = JCL_UNIX_SCRIPT_CHARS): string { const parts: string[] = []; diff --git a/src/storage/ConnectionStore.ts b/src/storage/ConnectionStore.ts index d26f0bae..d34ff367 100644 --- a/src/storage/ConnectionStore.ts +++ b/src/storage/ConnectionStore.ts @@ -10,7 +10,7 @@ import Store from 'electron-store'; import { DefaultStore } from './DefaultStore'; -import { DEF_JOB_STATEMENT } from '../renderer/components/common/Constants'; +import { DEF_JOB_STATEMENT } from '../renderer/components/common/Utils'; const STORE_NAME = 'zen-connection-store'; const STORE_SCHEMA = { diff --git a/src/storage/EditorStore.ts b/src/storage/EditorStore.ts index 4cb276bb..681f333b 100644 --- a/src/storage/EditorStore.ts +++ b/src/storage/EditorStore.ts @@ -10,7 +10,7 @@ import Store from 'electron-store'; import { DefaultStore } from './DefaultStore'; -import { TYPE_JCL, TYPE_OUTPUT, TYPE_YAML } from '../renderer/components/common/Constants'; +import { TYPE_JCL, TYPE_OUTPUT, TYPE_YAML } from '../renderer/components/common/Utils'; const STORE_DEFAULT = { [TYPE_OUTPUT]: "", From 9c6c8ab20b7d641a9edf6709f8f9e696d1c6f1f7 Mon Sep 17 00:00:00 2001 From: James Struga Date: Thu, 27 Jun 2024 23:16:26 -0400 Subject: [PATCH 268/455] Fix the release logic Signed-off-by: James Struga --- .github/workflows/build_test.yml | 29 ++++++++++++++++++ .github/workflows/release.yml | 51 -------------------------------- 2 files changed, 29 insertions(+), 51 deletions(-) delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index c3d93b7b..30997d26 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -13,6 +13,11 @@ on: BRANCH_NAME: description: 'Specify branch name or PR (e.g. PR-41)' required: false + PERFORM_RELEASE: + description: '[Release] perform release' + required: false + default: 'false' + type: boolean jobs: @@ -39,6 +44,7 @@ jobs: uses: zowe-actions/zlux-builds/zen/publish@v2.x/main with: os: ubuntu + perform-release: ${{ github.event.inputs.PERFORM_RELEASE }} build-window: @@ -64,6 +70,7 @@ jobs: uses: zowe-actions/zlux-builds/zen/publish@v2.x/main with: os: windows + perform-release: ${{ github.event.inputs.PERFORM_RELEASE }} build-macos: runs-on: macos-latest @@ -93,4 +100,26 @@ jobs: uses: zowe-actions/zlux-builds/zen/publish@v2.x/main with: os: macos + perform-release: ${{ github.event.inputs.PERFORM_RELEASE }} + + post-build: + runs-on: ubuntu-latest + needs: + - build-ubuntu + - build-window + - build-macos + if: ${{ success() && github.event.inputs.PERFORM_RELEASE == 'true' }} + steps: + - name: '[Prep 3] Checkout' + uses: actions/checkout@v3 + + - name: '[Release 1] Release (if necessary)' + if: ${{ success() && github.event.inputs.PERFORM_RELEASE == 'true' }} + uses: zowe-actions/shared-actions/release@main + + - name: '[Release 2] Bump Zen Version (if necessary)' + if: ${{ success() && github.event.inputs.PERFORM_RELEASE == 'true' }} + uses: zowe-actions/zlux-builds/bump-zis-version@v2.x/main + env: + GITHUB_TOKEN: ${{ secrets.ZOWE_ROBOT_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index ee6a9a17..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Release zen draft -on: - workflow_run: - workflows: ["Build zen"] - branches: [v2.x/main] - types: - - completed - workflow_dispatch: - inputs: - BUMP_TYPE: - description: 'When version bumping, set patch, minor, or major. Need this xor RELEASE_TAG.' - required: false - RELEASE_TAG: - description: 'Disable bumping by specifying a semver pattern (without v). Need this xor BUMP_TYPE' - required: false - RUN_ID: - description: 'Specify run id of asset to associate with release.' - required: true - -permissions: - contents: write - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: '[Setup] default env' - if: ${{ inputs.BUMP_TYPE == '' && inputs.RELEASE_TAG == '' }} - run: | - echo "BUMP_TYPE=minor" >> $GITHUB_ENV - - name: '[Setup] input env' - if: ${{ inputs.BUMP_TYPE }} - run: | - echo "BUMP_TYPE=${{ inputs.BUMP_TYPE }}" >> $GITHUB_ENV - - name: Checkout - uses: actions/checkout@v3 - - name: '[Create tag]' - id: tag_version - uses: mathieudutour/github-tag-action@v6.1 - with: - github_token: ${{ github.token }} - default_bump: ${{ env.BUMP_TYPE }} - custom_tag: ${{ inputs.RELEASE_NUMBER }} - - name: '[Create release]' - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{ steps.tag_version.outputs.new_tag }} - name: Release ${{ steps.tag_version.outputs.new_tag }} - draft: true - prerelease: false - token: ${{ github.token }} From 6376ffeade855577d21d82019d86f333aae4c1b2 Mon Sep 17 00:00:00 2001 From: James Struga Date: Thu, 27 Jun 2024 23:19:08 -0400 Subject: [PATCH 269/455] switch github action point Signed-off-by: James Struga --- .github/workflows/build_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 30997d26..777c8410 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -120,6 +120,6 @@ jobs: - name: '[Release 2] Bump Zen Version (if necessary)' if: ${{ success() && github.event.inputs.PERFORM_RELEASE == 'true' }} - uses: zowe-actions/zlux-builds/bump-zis-version@v2.x/main + uses: zowe-actions/zlux-builds/zen/bump-version@v2.x/main env: GITHUB_TOKEN: ${{ secrets.ZOWE_ROBOT_TOKEN }} \ No newline at end of file From 99ab375d41e6e791ec7a50fd82034dc0c33f4eb9 Mon Sep 17 00:00:00 2001 From: kanhaiya04 Date: Mon, 1 Jul 2024 01:46:41 +0530 Subject: [PATCH 270/455] implemented dryRunMode Signed-off-by: kanhaiya04 --- src/renderer/components/Home.tsx | 27 ++-- .../components/stages/Certificates.tsx | 38 ++++-- .../components/stages/InitApfAuth.tsx | 16 ++- .../components/stages/LaunchConfig.tsx | 16 ++- src/renderer/components/stages/Networking.tsx | 22 +++- src/renderer/components/stages/Planning.tsx | 122 +++++++++++------- src/renderer/components/stages/Security.tsx | 26 ++-- src/renderer/components/stages/Stcs.tsx | 13 +- src/renderer/components/stages/Unpax.tsx | 70 ++++++++-- src/renderer/components/stages/Vsam.tsx | 17 ++- .../stages/connection/Connection.tsx | 14 +- .../stages/installation/Installation.tsx | 17 ++- .../stages/installation/installationSlice.ts | 3 +- .../stages/progress/StageProgressStatus.ts | 3 +- src/types/stateInterfaces.ts | 5 +- 15 files changed, 291 insertions(+), 118 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 04a5617a..423e7c3c 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -52,7 +52,7 @@ const cards: Array = [ id: "configure", name: "Zowe Installation Dry Run", description: "It will guide you through the installation steps without running the installation.", - link: "/", + link: "/wizard", media: installationDryImg, } ] @@ -65,15 +65,26 @@ const lastActiveState: ActiveState = { }; const makeCard = (card: ICard) => { - const dispatch = useAppDispatch(); const {id, name, description, link, media} = card; + const installationArgs = useAppSelector(selectInstallationArgs); + const dispatch = useAppDispatch(); + + const handleClick = () => { + const flattenedData = flatten(lastActiveState); + localStorage.setItem(prevInstallationKey, JSON.stringify(flattenedData)); + let newInstallationArgs; + if (id === "install") { + dispatch(setYaml(FALLBACK_YAML)); + newInstallationArgs = {...installationArgs, dryRunMode: false}; + } else if (id === "configure") { + newInstallationArgs = {...installationArgs, dryRunMode: true}; + } + dispatch(setInstallationArgs(newInstallationArgs)); + }; + return ( - { - const flattenedData = flatten(lastActiveState); - localStorage.setItem(prevInstallationKey, JSON.stringify(flattenedData)); - if(id === "install") dispatch(setYaml(FALLBACK_YAML)); - }}> + { - + ) } diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 11734012..875b10f5 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -159,11 +159,12 @@ const Certificates = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { - clearInterval(timer); - updateProgress(res.status); - if(!res.status){ - window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details.jobOutput, null, 2)).then((res: any) => { + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + clearInterval(timer); + updateProgress(res.status); + if(!res.status){ + window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details.jobOutput, null, 2)).then((res: any) => { toggleEditorVisibility("output"); }) } @@ -174,14 +175,25 @@ const Certificates = () => { window.electron.ipcRenderer.setConfig(updatedYaml); dispatch(setYaml(updatedYaml)); } - }).catch((e: any) => { - clearInterval(timer); - updateProgress(false); - console.warn('zwe init certificate failed', e); - window.electron.ipcRenderer.setStandardOutput(`zwe init certificate failed: ${e}`).then((res: any) => { - toggleEditorVisibility("output"); - }) - }); + }).catch((e: any) => { + clearInterval(timer); + updateProgress(false); + console.warn('zwe init certificate failed', e); + window.electron.ipcRenderer.setStandardOutput(`zwe init certificate failed: ${e}`).then((res: any) => { + toggleEditorVisibility("output"); + }) + }); + } + else{ + setCertificateInitState( + { + writeYaml: true, + uploadYaml: true, + zweInitCertificate: true + } + ) + updateProgress(true); + } } const toggleEditorVisibility = (type: any) => { diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index ce8dc4ec..a9f5236c 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -168,9 +168,10 @@ const InitApfAuth = () => { updateProgress(false); event.preventDefault(); dispatch(setApfAuthStatus(false)); - window.electron.ipcRenderer.apfAuthButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { - // Some parts of Zen pass the response as a string directly into the object - if (res.status == false && typeof res.details == "string") { + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.apfAuthButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + // Some parts of Zen pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { res.details = { 3: res.details }; } if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe init apfAuth @@ -200,6 +201,15 @@ const InitApfAuth = () => { toggleEditorVisibility("output"); }) }); + } + else{ + setApfAuthState({ + writeYaml: true, + uploadYaml: true, + success: true + }); + updateProgress(true); + } } // True - a proceed, False - blocked diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 950cc9f0..a11e4c61 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -509,9 +509,10 @@ const LaunchConfig = () => { e.preventDefault(); dispatch(setLaunchConfigStatus(false)); alertEmitter.emit('showAlert', 'Uploading yaml...', 'info'); - window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { - if(res && res.status) { - dispatch(setNextStepEnabled(true)); + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { + if(res && res.status) { + dispatch(setNextStepEnabled(true)); dispatch(setLaunchConfigStatus(true)); alertEmitter.emit('showAlert', res.details, 'success'); } else { @@ -519,7 +520,14 @@ const LaunchConfig = () => { alertEmitter.emit('showAlert', res.details, 'error'); } dispatch(setInitializationStatus(isInitComplete())); - }); + }); + } + else{ + alertEmitter.emit('showAlert', 'success'); + dispatch(setNextStepEnabled(true)); + dispatch(setLaunchConfigStatus(true)); + dispatch(setInitializationStatus(isInitComplete())); + } } return ( diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 8ac5684f..f2907205 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -613,17 +613,25 @@ const Networking = () => { e.preventDefault(); alertEmitter.emit('showAlert', 'Uploading yaml...', 'info'); dispatch(setNetworkingStatus(false)); - window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { - if(res && res.status) { - dispatch(setNextStepEnabled(true)); - dispatch(setNetworkingStatus(true)); - alertEmitter.emit('showAlert', res.details, 'success'); - } else { + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { + if(res && res.status) { + dispatch(setNextStepEnabled(true)); + dispatch(setNetworkingStatus(true)); + alertEmitter.emit('showAlert', res.details, 'success'); + } else { dispatch(setNetworkingStatus(false)); alertEmitter.emit('showAlert', res.details, 'error'); } dispatch(setInitializationStatus(isInitComplete())); - }); + }); + } + else{ + alertEmitter.emit('showAlert', 'success'); + dispatch(setNextStepEnabled(true)); + dispatch(setNetworkingStatus(true)); + dispatch(setInitializationStatus(isInitComplete())); + } } return ( diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 467ff1eb..150c3ff5 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -111,13 +111,14 @@ const Planning = () => { dispatch(setJobStatementVal(jobStatementValue)); - window.electron.ipcRenderer.getZoweVersion().then((res: IResponse) => dispatch(setZoweVersion(res.status ? res.details : '' ))); - - window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.getZoweVersion().then((res: IResponse) => dispatch(setZoweVersion(res.status ? res.details : '' ))); + + window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { if(res != undefined){ setInstArgs((res as any)); } - }) + }) window.electron.ipcRenderer.getConfig().then((res: IResponse) => { if (res.status) { @@ -133,9 +134,9 @@ const Planning = () => { dispatch(setInstallationArgs({...installationArgs, installationDir: res.details?.zowe?.runtimeDirectory ?? '', installationType: getInstallationTypeStatus()?.installationType, userUploadedPaxPath: getInstallationTypeStatus()?.userUploadedPaxPath})); } }) - + } }, []); - + useEffect(() => { setPlanningState(jobHeaderSaved && locationsValidated); }, [jobHeaderSaved, locationsValidated]); @@ -196,7 +197,9 @@ const Planning = () => { } e.preventDefault(); dispatch(setLoading(true)); - window.electron.ipcRenderer.saveJobHeader(jobStatementValue) + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.saveJobHeader(jobStatementValue) .then(() => getENVVars()) .then((res: IResponse) => { setEditorContentAndType(res.details, 'output'); @@ -226,8 +229,20 @@ const Planning = () => { alertEmitter.emit('showAlert', err.message, 'error'); dispatch(setLoading(false)); }); + } + else{ + if(locationsValidated){ + setPlanningState(true); + setStep(2); + } + else if(step<1) + setStep(1); + setJobHeaderSaved(true); + dispatch(setJobStatementValid(true)); + dispatch(setLoading(false)); + } } - + const validateLocations = (e: any, click?: boolean) => { setPlanningState(false); setLocValidations(false); @@ -254,11 +269,12 @@ const Planning = () => { // TODO: Possible feature for future: add to checkDir to see if existing Zowe install exists. // Then give the user ability to use existing zowe.yaml to auto-fill in fields from Zen - Promise.all([ - window.electron.ipcRenderer.checkJava(connectionArgs, localYaml?.java?.home || installationArgs.javaHome), - window.electron.ipcRenderer.checkNode(connectionArgs, localYaml?.node?.home || installationArgs.nodeHome), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.runtimeDirectory || installationArgs.installationDir), - ]).then((res: Array) => { + if(!installationArgs.dryRunMode){ + Promise.all([ + window.electron.ipcRenderer.checkJava(connectionArgs, localYaml?.java?.home || installationArgs.javaHome), + window.electron.ipcRenderer.checkNode(connectionArgs, localYaml?.node?.home || installationArgs.nodeHome), + window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.runtimeDirectory || installationArgs.installationDir), + ]).then((res: Array) => { const details = {javaVersion: '', nodeVersion: '', spaceAvailableMb: '', error: ''}; setEditorContent(res.map(item=>item?.details).join('\n')); setContentType('output'); @@ -282,51 +298,57 @@ const Planning = () => { } //Do not check space because space on ZFS is dynamic. you can have more space than USS thinks. // try { - // const dfOut: string = res[2].details.split('\n').filter((i: string) => i.trim().startsWith(installationArgs.installationDir.slice(0, 3)))[0]; - // details.spaceAvailableMb = dfOut.match(/\d+\/\d+/g)[0].split('/')[0]; - // // FIXME: Space requirement is made up, Zowe 2.9.0 convenience build is 515Mb and growing per version. Make it double for extracted files. + // const dfOut: string = res[2].details.split('\n').filter((i: string) => i.trim().startsWith(installationArgs.installationDir.slice(0, 3)))[0]; + // details.spaceAvailableMb = dfOut.match(/\d+\/\d+/g)[0].split('/')[0]; + // // FIXME: Space requirement is made up, Zowe 2.9.0 convenience build is 515Mb and growing per version. Make it double for extracted files. // if (parseInt(details.spaceAvailableMb, 10) < requiredSpace) { - // details.error = details.error + `Not enough space, you need at least ${requiredSpace}MB; `; - // } - // } catch (error) { - // details.error = details.error + `Can't check space available; `; - // console.warn(res[2].details); - // } - setValidationDetails(details); - setPlanningValidationDetailsState(details); - dispatch(setLocationValidationDetails(details)) - dispatch(setLoading(false)); - if (!details.error) { - alertEmitter.emit('hideAlert'); - setLocValidations(true); - setPlanningState(true); - // setStep(2); // This step is meant to show some usefull status, removing for now. - } else { + // details.error = details.error + `Not enough space, you need at least ${requiredSpace}MB; `; + // } + // } catch (error) { + // details.error = details.error + `Can't check space available; `; + // console.warn(res[2].details); + // } + setValidationDetails(details); + setPlanningValidationDetailsState(details); + dispatch(setLocationValidationDetails(details)) + dispatch(setLoading(false)); + if (!details.error) { + alertEmitter.emit('hideAlert'); + setLocValidations(true); + setPlanningState(true); + // setStep(2); // This step is meant to show some usefull status, removing for now. + } else { dispatch(setPlanningStatus(false)); dispatch(setLoading(false)); alertEmitter.emit('showAlert', details.error, 'error'); } }) } - - const onJobStatementChange = (newJobStatement: string) => { - setIsJobStatementUpdated(true); - setJobStatementValue(newJobStatement); - setJobHeaderSaved(false); - setJobStatementValidation(false); - dispatch(setJobStatement(newJobStatement)); - dispatch(setJobStatementValid(false)); - setPlanningState(false); - setStep(0); + else{ + setPlanningState(true); + setLocValidations(true); + dispatch(setLoading(false)); } - - const formChangeHandler = (key?: string, value?: (string | number), installationArg?: string) => { - setIsLocationsUpdated(true); - setPlanningStatus(false); - setLocationsValidated(false); - dispatch(setPlanningStatus(false)); - dispatch(setNextStepEnabled(false)); - setStep(1); +} + +const onJobStatementChange = (newJobStatement: string) => { + setIsJobStatementUpdated(true); + setJobStatementValue(newJobStatement); + setJobHeaderSaved(false); + setJobStatementValidation(false); + dispatch(setJobStatement(newJobStatement)); + dispatch(setJobStatementValid(false)); + setPlanningState(false); + setStep(0); + } + + const formChangeHandler = (key?: string, value?: (string | number), installationArg?: string) => { + setIsLocationsUpdated(true); + setPlanningStatus(false); + setLocationsValidated(false); + dispatch(setPlanningStatus(false)); + dispatch(setNextStepEnabled(false)); + setStep(1); if (!key || !value) { return; diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 1a0eea03..811c17a4 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -162,14 +162,15 @@ const Security = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { - // Some parts of Zen pass the response as a string directly into the object - if (res.status == false && typeof res.details == "string") { - res.details = { 3: res.details }; - } - if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe init security - alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); - window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + // Some parts of Zen pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { + res.details = { 3: res.details }; + } + if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe init security + alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); + window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { toggleEditorVisibility("output"); }) updateProgress(false); @@ -194,6 +195,15 @@ const Security = () => { }) }); } + else{ + setSecurityInitState({ + writeYaml: true, + uploadYaml: true, + success: true + }); + updateProgress(true); + } + } // True - a proceed, False - blocked const securityProceedActions = (status: boolean) => { diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index 2f52e5bd..c8ecccd2 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -179,7 +179,9 @@ const Stcs = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initStcsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.initStcsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { updateProgress(res.status); if(res.error) { alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); @@ -192,6 +194,15 @@ const Stcs = () => { toggleEditorVisibility("output"); }) }); + } + else{ + setStcsInitState({ + writeYaml: true, + uploadYaml: true, + success: true + }); + updateProgress(true); + } } const handleFormChange = (data: any) => { diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index f813db03..e753fa91 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -72,22 +72,45 @@ const Unpax = () => { dispatch(setDownloadUnpaxStatus(false)); setDownloadUnpaxProgress(downloadUnpaxStatus); dispatch(setNextStepEnabled(false)); - window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, {...installationArgs, userUploadedPaxPath: paxPath}, version).then((res: IResponse) => { - if(!res.status){ //errors during runInstallation() - alertEmitter.emit('showAlert', res.details, 'error'); - } - if(res.details?.mergedYaml != undefined){ - dispatch(setYaml(res.details.mergedYaml)); - window.electron.ipcRenderer.setConfig(res.details.mergedYaml); - } - dispatch(setNextStepEnabled(res.status)); - dispatch(setDownloadUnpaxStatus(res.status)); + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, {...installationArgs, userUploadedPaxPath: paxPath}, version).then((res: IResponse) => { + if(!res.status){ //errors during runInstallation() + alertEmitter.emit('showAlert', res.details, 'error'); + } + if(res.details?.mergedYaml != undefined){ + dispatch(setYaml(res.details.mergedYaml)); + window.electron.ipcRenderer.setConfig(res.details.mergedYaml); + } + dispatch(setNextStepEnabled(res.status)); + dispatch(setDownloadUnpaxStatus(res.status)); clearInterval(timer); }).catch(() => { clearInterval(timer); dispatch(setNextStepEnabled(false)); }); } + else{ + setDownloadUnpaxProgress({ + uploadYaml: true, + download: true, + upload: true, + unpax: true, + getExampleYaml: true, + getSchemas: true, + }); + setDownloadUnpaxState({ + uploadYaml: true, + download: true, + upload: true, + unpax: true, + getExampleYaml: true, + getSchemas: true, + }); + dispatch(setNextStepEnabled(true)); + dispatch(setDownloadUnpaxStatus(true)); + } + } const fetchExampleYaml = (event: any) => { event.preventDefault(); @@ -95,8 +118,10 @@ const Unpax = () => { dispatch(setDownloadUnpaxStatus(false)); setDownloadUnpaxProgress(downloadUnpaxStatus); dispatch(setNextStepEnabled(false)); - window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { - if(!res.status){ //errors during runInstallation() + if(!installationArgs.dryRunMode){ + + window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details.message ? res.details.message : res.details, 'error'); } if(res.details?.mergedYaml != undefined){ @@ -111,6 +136,27 @@ const Unpax = () => { dispatch(setNextStepEnabled(false)); }); } + else{ + setDownloadUnpaxProgress({ + uploadYaml: true, + download: true, + upload: true, + unpax: true, + getExampleYaml: true, + getSchemas: true, + }); + setDownloadUnpaxState({ + uploadYaml: true, + download: true, + upload: true, + unpax: true, + getExampleYaml: true, + getSchemas: true, + }); + dispatch(setNextStepEnabled(true)); + dispatch(setDownloadUnpaxStatus(true)); + } + } useEffect(() => { window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index c0bb9122..f5154026 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -174,9 +174,11 @@ const Vsam = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initVsamButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { - updateProgress(res.status); - if(res.error) { + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.initVsamButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + updateProgress(res.status); + if(res.error) { alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); } clearInterval(timer); @@ -187,6 +189,15 @@ const Vsam = () => { toggleEditorVisibility("output"); }) }); + } + else{ + setVsamInitState({ + writeYaml: true, + uploadYaml: true, + success: true + }); + updateProgress(true); + } } const handleFormChange = (data: any) => { diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 9200e194..66518064 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -36,6 +36,7 @@ import { getStageDetails, initStageSkipStatus } from "../../../../services/Stage import { initializeProgress, getActiveStage, setPlanningStageStatus } from "../progress/StageProgressStatus"; import eventDispatcher from "../../../../services/eventDispatcher"; import { setLocationValidationDetails } from "../PlanningSlice"; +import { selectInstallationArgs } from "../installation/installationSlice"; const Connection = () => { @@ -116,6 +117,8 @@ const FTPConnectionForm = () => { const [isResume, setIsResume] = useState(useAppSelector(selectResumeProgress)); + const installationArgs = useAppSelector(selectInstallationArgs); + const handleFormChange = (ftpConnection?:boolean, acceptCerts?:boolean) => { dispatch(setConnectionStatus(false)); dispatch(setNextStepEnabled(false)); @@ -128,7 +131,9 @@ const FTPConnectionForm = () => { } alertEmitter.emit('hideAlert'); dispatch(setLoading(true)); - window.electron.ipcRenderer + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer .connectionButtonOnClick(connectionArgs) .then((res: IResponse) => { dispatch(setConnectionStatus(res.status)); @@ -143,6 +148,13 @@ const FTPConnectionForm = () => { dispatch(setConnectionValidationDetails(res.details)); dispatch(setLoading(false)); }); + } + else{ + dispatch(setConnectionStatus(true)); + toggleFormProcessed(true); + dispatch(setNextStepEnabled(true)); + dispatch(setLoading(false)); + } }; const setResume = () => { diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 6c5ea41d..4f529e0e 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -79,7 +79,7 @@ const Installation = () => { if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); } - if(installationArgs != undefined){ + if(installationArgs != undefined && !installationArgs.dryRunMode){ window.electron.ipcRenderer.getConfig().then((res: IResponse) => { function mergeInstallationArgsAndYaml(yaml: any){ let yamlObj = JSON.parse(JSON.stringify(yaml)); @@ -250,7 +250,7 @@ const Installation = () => { setMvsDatasetInitProgress(datasetInstallationStatus) dispatch(setDatasetInstallationStatus(false)); // FIXME: runtime dir is hardcoded, fix there and in InstallActions.ts - Unpax and Install functions - + if(!installationArgs.dryRunMode){ Promise.all([ window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.setup.dataset', setupYaml), ]).then(async () => { @@ -288,10 +288,19 @@ const Installation = () => { toggleEditorVisibility("output"); }) }); - }) } - + else{ + dispatch(setLoading(false)); + setMvsDatasetInitializationProgress({ + uploadYaml: true, + install: true, + initMVS: true + }) + updateProgress(true); + } + } + // True - a proceed, False - blocked const installProceedActions = (status: boolean) => { dispatch(setNextStepEnabled(status)); diff --git a/src/renderer/components/stages/installation/installationSlice.ts b/src/renderer/components/stages/installation/installationSlice.ts index c8a7a280..872c74b7 100644 --- a/src/renderer/components/stages/installation/installationSlice.ts +++ b/src/renderer/components/stages/installation/installationSlice.ts @@ -37,7 +37,8 @@ const initialState: InstallationState = { cookieId: '1', zosmfHost: '', zosmfPort: '443', - zosmfApplId: 'IZUDFLT' + zosmfApplId: 'IZUDFLT', + dryRunMode: false }, zoweVersion: '', licenseAgreement: getInstallationTypeStatus()?.licenseAgreement || false, diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index dc6102f5..592460c4 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -127,7 +127,8 @@ const installationArgsStatus: InstallationArgs = { cookieId: '1', zosmfHost: '', zosmfPort: '443', - zosmfApplId: 'IZUDFLT' + zosmfApplId: 'IZUDFLT', + dryRunMode:false } let progressStateKey = 'stage_progress'; diff --git a/src/types/stateInterfaces.ts b/src/types/stateInterfaces.ts index 66bd97db..7747a65e 100644 --- a/src/types/stateInterfaces.ts +++ b/src/types/stateInterfaces.ts @@ -108,8 +108,9 @@ export interface InstallationArgs { cookieId: string; zosmfHost: string, zosmfPort: string, - zosmfApplId: string -}; + zosmfApplId: string, + dryRunMode: boolean, +} From fa01780e535dcfb1fbe9374b210161107c7bc327 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 30 Jun 2024 17:23:07 -0400 Subject: [PATCH 271/455] Rest yaml and schema fetching progress Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 4107986b..c19b9324 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -120,6 +120,8 @@ class Installation { installationArgs: InstallationArgs, ): Promise { try{ + ProgressStore.set('downloadUnpax.getSchemas', false); + ProgressStore.set('downloadUnpax.getExampleYaml', false); const currentConfig: any = ConfigurationStore.getConfig(); let yamlObj const zoweRuntimePath = installationArgs.installationDir; From c0bf7e05c50ae2d2f2fec790eb558c0dd1858b81 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 1 Jul 2024 09:15:54 -0400 Subject: [PATCH 272/455] Improve schema setting logic Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index c19b9324..e4fde293 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -174,6 +174,11 @@ class Installation { ConfigurationStore.setSchema(FALLBACK_SCHEMA); return {status: false, details: {message: e.message}} } + } else { + console.log('no schema found from pax'); + ProgressStore.set('downloadUnpax.getSchemas', false); + ConfigurationStore.setSchema(FALLBACK_SCHEMA); + return {status: false, details: {message: 'no schemas found from pax'}} } return {status: parsedSchema && parsedYaml, details: {message: "Successfully retrieved example-zowe.yaml and schemas", mergedYaml: yamlObj}} } From cc25349abd59ea127147e90d275bbfa7f364daf6 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 1 Jul 2024 10:37:14 -0400 Subject: [PATCH 273/455] Remove useless and detrimental code duplication which was causing input lag Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Vsam.tsx | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index a713ff58..6ce329f2 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -217,26 +217,6 @@ const Vsam = () => { if(updatedYaml?.zowe) { setLYaml(updatedYaml); } - handleUpdateYaml(data, updatedYaml); - } - - const handleUpdateYaml = (data: any, newYaml: any) => { - const currentYaml = newYaml?.zowe ? newYaml : yaml; - const updatedYaml = { - ...currentYaml, - zowe: { - ...currentYaml.zowe, - setup: { - ...currentYaml.zowe.setup, - vsam: { - ...data, - } - } - } - }; - setLYaml(updatedYaml); - window.electron.ipcRenderer.setConfig(updatedYaml); - dispatch(setYaml(updatedYaml)); } const handleUpdateVsamName = (newName: string) => { From 807a44e0259f93c1b704716984cdabe3d848c8ab Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 1 Jul 2024 11:12:58 -0400 Subject: [PATCH 274/455] Remove password affter attempted connect regardless Signed-off-by: Timothy Gerstel --- src/actions/ConnectionHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/ConnectionHandler.ts b/src/actions/ConnectionHandler.ts index ff91b922..428f6766 100644 --- a/src/actions/ConnectionHandler.ts +++ b/src/actions/ConnectionHandler.ts @@ -36,8 +36,8 @@ export class FTPConnection extends Connection { response.details = e.message; } } + config.password = ""; if (response.status) { - config.password = ""; this.saveConnectionData(config); } return response; From cd7ad16519a7dbe3c8df147009e8741191f713e2 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 1 Jul 2024 11:15:57 -0400 Subject: [PATCH 275/455] Fix unpax progress not setting for real this time Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Unpax.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 3a7ae643..69410444 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -64,13 +64,17 @@ const Unpax = () => { return () => { clearInterval(timer); }; - }, [showProgress]); + }, [showProgress, downloadUnpaxProgress]); const process = (event: any) => { event.preventDefault(); setShowProgress(true); dispatch(setDownloadUnpaxStatus(false)); - setDownloadUnpaxProgress(downloadUnpaxStatus); + setDownloadUnpaxProgress({ + ...downloadUnpaxProgress, + getExampleYaml: false, + getSchemas: false, + }); dispatch(setNextStepEnabled(false)); window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, {...installationArgs, userUploadedPaxPath: paxPath}, version).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() From 85759d185f72dc5149f43c9da37c3caba92d6daf Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 1 Jul 2024 11:26:13 -0400 Subject: [PATCH 276/455] fix fetch schema status resetting Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Unpax.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 69410444..278b5c90 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -48,7 +48,7 @@ const Unpax = () => { useEffect(() => { const stageComplete = downloadUnpaxProgress.uploadYaml && downloadUnpaxProgress.download && downloadUnpaxProgress.upload && downloadUnpaxProgress.unpax; - if(!stageComplete && showProgress) { + if(!stageComplete && showProgress && !(downloadUnpaxProgress.getExampleYaml && downloadUnpaxProgress.getSchemas)) { timer = setInterval(() => { window.electron.ipcRenderer.getDownloadUnpaxProgress().then((res: any) => { setDownloadUnpaxProgress(res); @@ -70,11 +70,6 @@ const Unpax = () => { event.preventDefault(); setShowProgress(true); dispatch(setDownloadUnpaxStatus(false)); - setDownloadUnpaxProgress({ - ...downloadUnpaxProgress, - getExampleYaml: false, - getSchemas: false, - }); dispatch(setNextStepEnabled(false)); window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, {...installationArgs, userUploadedPaxPath: paxPath}, version).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() @@ -100,6 +95,11 @@ const Unpax = () => { setDownloadUnpaxProgress(downloadUnpaxStatus); dispatch(setNextStepEnabled(false)); window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + setDownloadUnpaxProgress({ + ...downloadUnpaxProgress, + getExampleYaml: false, + getSchemas: false, + }); if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details.message ? res.details.message : res.details, 'error'); } From a4d4ef1c14603451c2f6bd4d6e410ea32d0cb64c Mon Sep 17 00:00:00 2001 From: kanhaiya04 Date: Tue, 2 Jul 2024 02:21:39 +0530 Subject: [PATCH 277/455] upload zowe PAX for offline install is now working Signed-off-by: kanhaiya04 --- .../installation/InstallTypeSelection.tsx | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index 874eda7e..ba657c1c 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -131,15 +131,19 @@ const InstallationType = () => { {`${paxPath === "" ? "No pax file selected." : paxPath}`} From 107e188607da18d64efbdaf8e8ae1c6adbb4d738 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Mon, 1 Jul 2024 17:35:53 -0400 Subject: [PATCH 278/455] Some code clean-up Signed-off-by: Leanid Astrakou --- src/renderer/components/Home.tsx | 83 +++++++++---------- src/renderer/components/stages/Planning.tsx | 8 +- src/renderer/components/stages/Unpax.tsx | 49 ++++------- .../installation/InstallTypeSelection.tsx | 4 +- 4 files changed, 64 insertions(+), 80 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index feb6f0cd..6716794f 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -64,48 +64,6 @@ const lastActiveState: ActiveState = { activeSubStepIndex: 0, }; -const makeCard = (card: ICard) => { - const {id, name, description, link, media} = card; - const installationArgs = useAppSelector(selectInstallationArgs); - const dispatch = useAppDispatch(); - - const handleClick = () => { - const flattenedData = flatten(lastActiveState); - localStorage.setItem(prevInstallationKey, JSON.stringify(flattenedData)); - let newInstallationArgs; - if (id === "install") { - dispatch(setYaml(FALLBACK_YAML)); - newInstallationArgs = {...installationArgs, dryRunMode: false}; - } else if (id === "configure") { - newInstallationArgs = {...installationArgs, dryRunMode: true}; - } - dispatch(setInstallationArgs(newInstallationArgs)); - }; - - return ( - - - - - - - - {name} - - - {description} - - - - - - - ) -} - const Home = () => { const dispatch = useAppDispatch(); @@ -114,6 +72,7 @@ const Home = () => { const [showLoginDialog, setShowLogin] = useState(false); const [yaml] = useState(useAppSelector(selectYaml)); const [schema, setLocalSchema] = useState(useAppSelector(selectSchema)); + const installationArgs = useAppSelector(selectInstallationArgs); const { activeStepIndex, isSubStep, activeSubStepIndex, lastActiveDate } = getPreviousInstallation(); @@ -123,6 +82,46 @@ const Home = () => { const defaultTooltip: string = "Resume"; const resumeTooltip = connectionStatus ? defaultTooltip : `Validate Credentials & ${defaultTooltip}`; + const makeCard = (card: ICard) => { + const {id, name, description, link, media} = card; + + const handleClick = () => { + const flattenedData = flatten(lastActiveState); + localStorage.setItem(prevInstallationKey, JSON.stringify(flattenedData)); + let newInstallationArgs; + if (id === "install") { + dispatch(setYaml(FALLBACK_YAML)); + newInstallationArgs = {...installationArgs, dryRunMode: false}; + } else if (id === "configure") { + newInstallationArgs = {...installationArgs, dryRunMode: true}; + } + dispatch(setInstallationArgs(newInstallationArgs)); + }; + + return ( + + + + + + + + {name} + + + {description} + + + + + + + ) + } + useEffect(() => { eventDispatcher.on('saveAndCloseEvent', () => setShowWizard(false)); diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 3606bef8..c30d018b 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -229,14 +229,14 @@ const Planning = () => { alertEmitter.emit('showAlert', err.message, 'error'); dispatch(setLoading(false)); }); - } - else{ + } else{ if(locationsValidated){ setPlanningState(true); setStep(2); - } - else if(step<1) + } else if (step<1) + { setStep(1); + } setJobHeaderSaved(true); dispatch(setJobStatementValid(true)); dispatch(setLoading(false)); diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index f6259b43..4d4924c6 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -66,6 +66,15 @@ const Unpax = () => { }; }, [showProgress]); + const downloadUnpaxProgressAndStateTrue = { + uploadYaml: true, + download: true, + upload: true, + unpax: true, + getExampleYaml: true, + getSchemas: true, + }; + const process = (event: any) => { event.preventDefault(); setShowProgress(true); @@ -91,22 +100,8 @@ const Unpax = () => { }); } else{ - setDownloadUnpaxProgress({ - uploadYaml: true, - download: true, - upload: true, - unpax: true, - getExampleYaml: true, - getSchemas: true, - }); - setDownloadUnpaxState({ - uploadYaml: true, - download: true, - upload: true, - unpax: true, - getExampleYaml: true, - getSchemas: true, - }); + setDownloadUnpaxProgress(downloadUnpaxProgressAndStateTrue); + setDownloadUnpaxState(downloadUnpaxProgressAndStateTrue); dispatch(setNextStepEnabled(true)); dispatch(setDownloadUnpaxStatus(true)); } @@ -137,22 +132,8 @@ const Unpax = () => { }); } else{ - setDownloadUnpaxProgress({ - uploadYaml: true, - download: true, - upload: true, - unpax: true, - getExampleYaml: true, - getSchemas: true, - }); - setDownloadUnpaxState({ - uploadYaml: true, - download: true, - upload: true, - unpax: true, - getExampleYaml: true, - getSchemas: true, - }); + setDownloadUnpaxProgress(downloadUnpaxProgressAndStateTrue); + setDownloadUnpaxState(downloadUnpaxProgressAndStateTrue); dispatch(setNextStepEnabled(true)); dispatch(setDownloadUnpaxStatus(true)); } @@ -199,7 +180,9 @@ const Unpax = () => { {installValue === "download" && {`Zen will download the latest Zowe convenience build in PAX archive format from `} - {'https://zowe.org/'} + + {'https://zowe.org'} + {` Skip this step if you have already downloaded Zowe.`} {!showProgress && diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index 874eda7e..2380aa38 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -114,7 +114,9 @@ const InstallationType = () => { Zen will download the latest Zowe convenience build in PAX archive format from. { !agreeLicense && <>
Please accept the license agreement to continue.
} - {'https://zowe.org'} + + {'https://zowe.org'} +
+ +
+ +
+
+ ); +}; + +export default PasswordDialog; \ No newline at end of file From 7e5b461f1ea4cd8ff944ef6ec82f6c893f02e031 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 5 Jul 2024 16:50:44 +0530 Subject: [PATCH 324/455] Updating the password dialog --- src/renderer/components/common/passwordDialog.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/renderer/components/common/passwordDialog.tsx b/src/renderer/components/common/passwordDialog.tsx index 17fc708c..0a9c0466 100644 --- a/src/renderer/components/common/passwordDialog.tsx +++ b/src/renderer/components/common/passwordDialog.tsx @@ -16,7 +16,7 @@ import { setLoading } from '../configuration-wizard/wizardSlice'; import { IResponse } from '../../../types/interfaces' import { setConnectionStatus } from '../stages/progress/progressSlice'; -const PasswordDialog = ({ onSubmit }:{onSubmit: any}) => { +const PasswordDialog = ({ onPasswordSubmit }:{onPasswordSubmit: any}) => { const dispatch = useAppDispatch(); @@ -29,10 +29,10 @@ const PasswordDialog = ({ onSubmit }:{onSubmit: any}) => { const handleClose = () => { setIsDialogVisible(false); - onSubmit(false); + onPasswordSubmit(false); }; - const onPasswordSubmit = () => { + const onSubmit = () => { dispatch(setLoading(true)); console.log("connectionArgs: aftersubmit", connectionArgs); @@ -43,7 +43,7 @@ const PasswordDialog = ({ onSubmit }:{onSubmit: any}) => { if(res.status) { console.log("RESPONSE STATUS: ", res.status); setIsDialogVisible(false); - onSubmit(res.status); + onPasswordSubmit(res.status); setError(false, ''); } else { setError(true, 'Incorrect Password'); @@ -56,7 +56,7 @@ const PasswordDialog = ({ onSubmit }:{onSubmit: any}) => { dispatch(setLoading(false)); console.log("ERR: ",err); setError(true, err); - onSubmit(false); + onPasswordSubmit(false); }); } @@ -104,7 +104,7 @@ const PasswordDialog = ({ onSubmit }:{onSubmit: any}) => {
- +
From 10b7733b4369e5b13cca54b94ea62b10105a4d7e Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 5 Jul 2024 17:31:23 +0530 Subject: [PATCH 325/455] Updating the loader --- .../components/common/passwordDialog.tsx | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/renderer/components/common/passwordDialog.tsx b/src/renderer/components/common/passwordDialog.tsx index 0a9c0466..f29dabc9 100644 --- a/src/renderer/components/common/passwordDialog.tsx +++ b/src/renderer/components/common/passwordDialog.tsx @@ -9,14 +9,14 @@ */ import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, FormControl, TextField } from '@mui/material'; +import CircularProgress from '@mui/material/CircularProgress'; import React, { useEffect, useRef, useState } from 'react'; import { selectConnectionArgs, setConnectionValidationDetails, setPassword } from '../stages/connection/connectionSlice'; import { useAppDispatch, useAppSelector } from '../../hooks'; -import { setLoading } from '../configuration-wizard/wizardSlice'; import { IResponse } from '../../../types/interfaces' import { setConnectionStatus } from '../stages/progress/progressSlice'; -const PasswordDialog = ({ onPasswordSubmit }:{onPasswordSubmit: any}) => { +const PasswordDialog = ({ onPasswordSubmit }:{ onPasswordSubmit: any }) => { const dispatch = useAppDispatch(); @@ -26,44 +26,41 @@ const PasswordDialog = ({ onPasswordSubmit }:{onPasswordSubmit: any}) => { const [isDialogVisible, setIsDialogVisible] = useState(true); const [isError, setIsError] = useState(false); const [errorMessage, setErrorMessage] = useState(''); + const [isLoading, setIsLoading] = useState(false); const handleClose = () => { setIsDialogVisible(false); onPasswordSubmit(false); }; - const onSubmit = () => { - dispatch(setLoading(true)); - console.log("connectionArgs: aftersubmit", connectionArgs); + const onPasswordUpdate = (password: string) => { + setIsLoading(true); + dispatch(setPassword(password)); + } + const onSubmit = () => { + setIsLoading(true); window.electron.ipcRenderer .connectionButtonOnClick(connectionArgs) .then((res: IResponse) => { dispatch(setConnectionStatus(res.status)); if(res.status) { - console.log("RESPONSE STATUS: ", res.status); - setIsDialogVisible(false); onPasswordSubmit(res.status); setError(false, ''); + setIsDialogVisible(false); } else { setError(true, 'Incorrect Password'); - console.log("INCPRRECT PASSWORD"); } dispatch(setConnectionValidationDetails(res.details)); - dispatch(setLoading(false)); + setIsLoading(false); }) .catch((err: any) => { - dispatch(setLoading(false)); - console.log("ERR: ",err); - setError(true, err); + setError(true, err.message); onPasswordSubmit(false); + setIsLoading(false); }); } - const onPasswordUpdate = (password: string) => { - dispatch(setPassword(password)); - } - const setError = (err: boolean, errMsg: string) => { setIsError(err); setErrorMessage(errMsg); @@ -82,6 +79,7 @@ const PasswordDialog = ({ onPasswordSubmit }:{onPasswordSubmit: any}) => { }}> Enter Password + {isLoading && } Date: Fri, 5 Jul 2024 17:37:17 +0530 Subject: [PATCH 326/455] Updating the progress loader --- src/renderer/components/common/passwordDialog.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/common/passwordDialog.tsx b/src/renderer/components/common/passwordDialog.tsx index f29dabc9..83acf56b 100644 --- a/src/renderer/components/common/passwordDialog.tsx +++ b/src/renderer/components/common/passwordDialog.tsx @@ -34,7 +34,6 @@ const PasswordDialog = ({ onPasswordSubmit }:{ onPasswordSubmit: any }) => { }; const onPasswordUpdate = (password: string) => { - setIsLoading(true); dispatch(setPassword(password)); } @@ -78,8 +77,8 @@ const PasswordDialog = ({ onPasswordSubmit }:{ onPasswordSubmit: any }) => { }, }}> Enter Password - - {isLoading && } + + {isLoading && } Date: Fri, 5 Jul 2024 18:05:13 +0530 Subject: [PATCH 327/455] Updating the connection stage --- src/renderer/components/stages/connection/Connection.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 9200e194..25164a40 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -137,6 +137,7 @@ const FTPConnectionForm = () => { initializeProgress(connectionArgs.host, connectionArgs.user, isResume); initStageSkipStatus(); setResume(); + dispatch(setPassword('')); } toggleFormProcessed(true); setValidationDetails(res.details); From cdbc532819edb1324634054953a89f5e16676a9e Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 5 Jul 2024 18:06:02 +0530 Subject: [PATCH 328/455] Updating the progress dialod to not save the password --- src/renderer/components/common/passwordDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/common/passwordDialog.tsx b/src/renderer/components/common/passwordDialog.tsx index 83acf56b..a3b0ff78 100644 --- a/src/renderer/components/common/passwordDialog.tsx +++ b/src/renderer/components/common/passwordDialog.tsx @@ -42,11 +42,11 @@ const PasswordDialog = ({ onPasswordSubmit }:{ onPasswordSubmit: any }) => { window.electron.ipcRenderer .connectionButtonOnClick(connectionArgs) .then((res: IResponse) => { - dispatch(setConnectionStatus(res.status)); if(res.status) { onPasswordSubmit(res.status); setError(false, ''); setIsDialogVisible(false); + dispatch(setPassword('')); } else { setError(true, 'Incorrect Password'); } From 6e7f750f4b9f0d9412202982e82ffffed77ea43c Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 5 Jul 2024 18:06:59 +0530 Subject: [PATCH 329/455] Updating the home component --- src/renderer/components/Home.tsx | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 375d066d..abebbf48 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -14,7 +14,7 @@ import { Link } from 'react-router-dom'; import { Box, Card, CardContent, CardMedia, Typography, Button } from '@mui/material'; import flatten, { unflatten } from 'flat'; import { IResponse, IIpcConnectionArgs } from '../../types/interfaces'; -import { setConnectionArgs, setResumeProgress, selectInitJobStatement } from './stages/connection/connectionSlice'; +import { setConnectionArgs, setResumeProgress, selectInitJobStatement, selectResumeProgress } from './stages/connection/connectionSlice'; import { setJobStatement } from './stages/PlanningSlice'; import { selectSchema, selectYaml, setSchema, setYaml, setZoweCLIVersion } from './configuration-wizard/wizardSlice'; import { useAppDispatch, useAppSelector } from '../hooks'; @@ -29,6 +29,7 @@ import { ActiveState } from '../../types/stateInterfaces'; import { getInstallationArguments, getPreviousInstallation } from './stages/progress/StageProgressStatus'; import { DEF_NO_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from './common/Utils'; import { selectInstallationArgs, setInstallationArgs } from './stages/installation/installationSlice'; +import PasswordDialog from './common/PasswordDialog'; // REVIEW: Get rid of routing @@ -111,12 +112,12 @@ const Home = () => { const stages: any = []; const defaultTooltip: string = "Resume"; const resumeTooltip = connectionStatus ? defaultTooltip : `Validate Credentials & ${defaultTooltip}`; + const [showPasswordDialog, setShowPasswordDialog] = useState(false); + const [updatedConnection, setUpdatedConnection] = useState(false); useEffect(() => { eventDispatcher.on('saveAndCloseEvent', () => setShowWizard(false)); - - //Home is the first screen the user will always see 100% of the time. Therefore, we will call the loading of the configs, schemas, and installation args here and set them to the redux memory states //YAML LOADING - necessary for editor state as well as form values @@ -150,17 +151,17 @@ const Home = () => { } }) - - window.electron.ipcRenderer.checkZoweCLI().then((res: IResponse) => { if (res.status) { dispatch(setZoweCLIVersion(res.details)); } else { console.info('No Zowe CLI found on local machine'); } - }); + }); + window.electron.ipcRenderer.setStandardOutput(DEF_NO_OUTPUT).then((res: any) => { }) + window.electron.ipcRenderer.findPreviousInstallations().then((res: IResponse) => { const connectionStore = res.details; if (connectionStore["connection-type"] === 'ftp') { @@ -198,6 +199,15 @@ const Home = () => { const resumeProgress = () => { setShowWizard(true); dispatch(setResumeProgress(true)); + + if(connectionStatus) { + setShowPasswordDialog(true); + } + } + + const confirmConnection = (status: boolean) => { + setUpdatedConnection(status); + setShowWizard(status); } return ( @@ -237,7 +247,12 @@ const Home = () => {
}
} - {showWizard && } + {showWizard && + <> + {showPasswordDialog && } + {} + + } ); }; From 26e566268bf4ca4de0bad16958943fc9c03821fd Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 5 Jul 2024 18:16:24 +0530 Subject: [PATCH 330/455] Last updates --- src/renderer/components/common/passwordDialog.tsx | 1 - src/renderer/components/stages/connection/Connection.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/src/renderer/components/common/passwordDialog.tsx b/src/renderer/components/common/passwordDialog.tsx index a3b0ff78..4499802b 100644 --- a/src/renderer/components/common/passwordDialog.tsx +++ b/src/renderer/components/common/passwordDialog.tsx @@ -46,7 +46,6 @@ const PasswordDialog = ({ onPasswordSubmit }:{ onPasswordSubmit: any }) => { onPasswordSubmit(res.status); setError(false, ''); setIsDialogVisible(false); - dispatch(setPassword('')); } else { setError(true, 'Incorrect Password'); } diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 25164a40..9200e194 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -137,7 +137,6 @@ const FTPConnectionForm = () => { initializeProgress(connectionArgs.host, connectionArgs.user, isResume); initStageSkipStatus(); setResume(); - dispatch(setPassword('')); } toggleFormProcessed(true); setValidationDetails(res.details); From ab5695cd9c475d3342600939be392bbfdfd2984b Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 5 Jul 2024 18:20:51 +0530 Subject: [PATCH 331/455] Updating the save and close --- src/renderer/components/common/Stepper.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 764f8100..55427f2e 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -34,7 +34,7 @@ import '../../styles/Stepper.css'; import { StepIcon } from '@mui/material'; import { getStageDetails } from '../../../services/StageDetails'; import { IResponse } from '../../../types/interfaces'; -import { selectConnectionArgs } from '../stages/connection/connectionSlice'; +import { selectConnectionArgs, setPassword } from '../stages/connection/connectionSlice'; import { selectInstallationArgs } from '../stages/installation/installationSlice'; // TODO: define props, stages, stage interfaces // TODO: One rule in the store to enable/disable button @@ -238,6 +238,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const onSaveAndClose = () => { alertEmitter.emit('hideAlert'); eventDispatcher.emit('saveAndCloseEvent'); + dispatch(setPassword('')); } const isNextStepEnabled = useAppSelector(selectNextStepEnabled); From 7e572b9028d51adcbbc6154db19380d9229a9966 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 5 Jul 2024 18:59:41 +0530 Subject: [PATCH 332/455] Updating the edge cases --- src/renderer/components/common/Stepper.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 7f7756e9..3888971a 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -235,6 +235,10 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const completion = getProgress(stages[activeStep].subStages[activeSubStep].statusKey); return !completion; } else { + if(activeStep == 0) { + // Because the status for the Connection stage is not persisted + return !connectionStatus; + } const completion = getProgress(stages[activeStep].statusKey); return !completion; } From 5f4cf0af948216943a440dd05227993d7571cdb2 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Sat, 6 Jul 2024 13:15:07 +0530 Subject: [PATCH 333/455] Restoring the status --- src/renderer/components/common/Stepper.tsx | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 3888971a..fcd69e5d 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -229,23 +229,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages eventDispatcher.emit('saveAndCloseEvent'); } - const nextStepButtonDisabled = (stages: any, activeStep: number, activeSubStep: number) => { - if(stages[activeStep]) { - if(stages[activeStep].subStages) { - const completion = getProgress(stages[activeStep].subStages[activeSubStep].statusKey); - return !completion; - } else { - if(activeStep == 0) { - // Because the status for the Connection stage is not persisted - return !connectionStatus; - } - const completion = getProgress(stages[activeStep].statusKey); - return !completion; - } - } else { - return true; - } - } + const isNextStepEnabled = useAppSelector(selectNextStepEnabled); const skipButtonDisabled = (stages: any, activeStep: number, activeSubStep: number) => { if(stages[activeStep]) { @@ -370,7 +354,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages } {stages[activeStep] && stages[activeStep].nextButton && - {editorVisible && } + {editorVisible && { + if(data?.zowe?.verifyCertificates){ + setVerifyCerts(data.zowe.verifyCertificates); + } + const newData = isFormInit ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.certificate) : (data?.zowe?.setup?.certificate ? data?.zowe?.setup?.certificate : data); + setStageConfig(true, '', newData); + } + }/> } dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
} diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 0a472901..ffa18c96 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -538,7 +538,12 @@ const LaunchConfig = () => {
- {editorVisible && } + {editorVisible && { + const newData = isFormInit ? (Object.keys(setupYaml).length > 0 ? setupYaml : data.zowe) : (data.zowe ? data.zowe : data); + setIsFormInit(false); + setStageConfig(true, '', newData); + } + }/>} {!isFormValid &&
{formError}
} diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 1afbaa13..752b93de 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -642,7 +642,16 @@ const Networking = () => {
- {editorVisible && } + {editorVisible && { + let newYaml; + if (data.zowe && data.zowe.externalDomains && data.zowe.externalPort) { + newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: data.zowe.externalDomains, externalPort: data.zowe.externalPort}}; + } + if(data.components){ + newYaml = {...newYaml, components: data.components}; + } + setStageConfig(true, '', newYaml); + }}/>} dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
}

External Domains { diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index aae4dcd4..e92c2990 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -245,7 +245,11 @@ const Security = () => { - {editorVisible && } + {editorVisible && { + const newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security) : (data?.zowe?.setup?.security ? data?.zowe?.setup?.security : data); + setStageConfig(true, '', newData); + } + }/> } dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&

{formError}
} handleFormChange(data)} formData={setupYaml}/> diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx index bfc43810..c4ff937e 100644 --- a/src/renderer/components/stages/Stcs.tsx +++ b/src/renderer/components/stages/Stcs.tsx @@ -238,7 +238,11 @@ const Stcs = () => {
- {editorVisible && } + {editorVisible && { + const newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security?.stcs) : (data?.zowe?.setup?.security?.stcs ? data?.zowe?.setup?.security?.stcs : data); + setStageConfig(true, '', newData); + } + }/> } {`Please review the following started task (STC) configuration values from the security stage before initializing stcs.\n`} diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 0f6d80dd..56466c6f 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -274,7 +274,12 @@ const Vsam = () => { - {editorVisible && } + {editorVisible && { + const newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.vsam) : (data?.zowe?.setup?.vsam ? data?.zowe?.setup?.vsam : data); + setInit(false); + setStageConfig(true, '', newData); + } + }/> } dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
} diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index e57d3c74..2366efe8 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -347,7 +347,11 @@ const Installation = () => {
- {editorVisible && } + {editorVisible && { + const updatedData = isFormInit ? (Object.keys(setupYaml).length > 0 ? setupYaml : data.zowe.setup.dataset) : (data.zowe?.setup?.dataset ? data.zowe.setup.dataset : data); + setStageConfig(true, '', updatedData); + } + }/>} {installationType === 'smpe' ? `Please input the corresponding values used during the SMPE installation process.` : `Ready to download Zowe ${version} and deploy it to the ${installationArgs.installationDir}\nThen we will install the MVS data sets, please provide the HLQ below.\n`} From 1ebfb147f4bc72b8905ffb44bd745dfd3c05fe5e Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 10 Jul 2024 17:03:51 -0400 Subject: [PATCH 364/455] Fix resume not showing button when previous session did exist Signed-off-by: Timothy Gerstel --- src/renderer/components/Home.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index 7d9e28d0..e611fe74 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -90,8 +90,6 @@ const Home = () => { const {id, name, description, link, media} = card; const handleClick = () => { - const flattenedData = flatten(lastActiveState); - localStorage.setItem(prevInstallationKey, JSON.stringify(flattenedData)); let newInstallationArgs = installationSlice.getInitialState().installationArgs; if (id === "install") { newInstallationArgs = {...newInstallationArgs, dryRunMode: false}; @@ -205,7 +203,7 @@ const Home = () => { setIsNewInstallation(true); } else { const data: ActiveState = unflatten(JSON.parse(lastInstallation)); - setIsNewInstallation(!(data && data.lastActiveDate)); + setIsNewInstallation(false); } @@ -252,7 +250,7 @@ const Home = () => { -
Last updated on: {lastActiveDate}
+ {lastActiveDate &&
Last updated on: {lastActiveDate}
}
diff --git a/src/services/DatasetValidation.ts b/src/services/DatasetValidation.ts new file mode 100644 index 00000000..e3ec5926 --- /dev/null +++ b/src/services/DatasetValidation.ts @@ -0,0 +1,15 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +export const isDatasetValid = (dsName: string) : boolean => { + const DsNamePattern = "^[a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}([.][a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}){0,21}$"; + const regEx = new RegExp(DsNamePattern); + return regEx.test(dsName); +} \ No newline at end of file From 93c9b5ef2163fda3a4dee1b05c2c682dc03ce85a Mon Sep 17 00:00:00 2001 From: James Struga Date: Thu, 1 Aug 2024 22:19:32 -0400 Subject: [PATCH 372/455] Fix broken github action and improve test logic Signed-off-by: James Struga --- .github/workflows/build_test.yml | 14 +- package.json | 2 +- playwright_test/Pages/apfAuth.page.ts | 10 ++ playwright_test/Pages/connection.page.ts | 19 ++- playwright_test/Pages/installation.page.ts | 36 ++++- .../Pages/installationType.page.ts | 26 +++- playwright_test/Pages/networking.page.ts | 1 - playwright_test/Pages/planning.page.ts | 20 +-- playwright_test/Tests/ApfAuth.spec.ts | 133 ++++++++---------- playwright_test/Tests/Connection.spec.ts | 46 +++--- playwright_test/utils/config.ts | 51 +++++++ 11 files changed, 222 insertions(+), 136 deletions(-) create mode 100644 playwright_test/utils/config.ts diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 777c8410..bc8e4409 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -111,8 +111,20 @@ jobs: - build-macos if: ${{ success() && github.event.inputs.PERFORM_RELEASE == 'true' }} steps: - - name: '[Prep 3] Checkout' + - name: 'Checkout' uses: actions/checkout@v3 + + - name: 'Set tag value' + run: | + COMMIT_HASH=$(git rev-parse --verify HEAD) + CURRENT_TIME=$(date +%s%3N) + if [ -z ${{ github.event.pull_request.number }} ] + then + CURRENT_BRANCH=${GITHUB_REF#refs/heads/} + else + CURRENT_BRANCH=PR-${{ github.event.pull_request.number }} + fi + P_VERSION=$(cat package.json | grep -o '"version": *"[^"]*"' | sed 's/"version": "\(.*\)"/\1/') - name: '[Release 1] Release (if necessary)' if: ${{ success() && github.event.inputs.PERFORM_RELEASE == 'true' }} diff --git a/package.json b/package.json index 7c9d4c92..86e49446 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "author": "Zowe", "description": "Zowe Server Install Wizard", "productName": "zowe-install-wizard", - "version": "1.0.0", + "version": "1.0.1", "main": ".webpack/main", "scripts": { "start": "electron-forge start --enable-logging", diff --git a/playwright_test/Pages/apfAuth.page.ts b/playwright_test/Pages/apfAuth.page.ts index 92d3e5f6..ab389ffa 100644 --- a/playwright_test/Pages/apfAuth.page.ts +++ b/playwright_test/Pages/apfAuth.page.ts @@ -83,6 +83,9 @@ class ApfAuthPage{ this.dataset_prefix_value = page.getByLabel('Dataset Prefix') this.auth_load_lib_value = page.getByLabel('APF Authorized Load Library') this.auth_plugin_lib_value = page.getByLabel('Zowe ZIS Plugins Load Library') + + //this.select_SMPE = page.getByLabel('//button[contains(text(),"SMP/E")]') + this.select_SMPE = page.locator('span:has-text("SMP/E")'); } async returnTitleOfApfAuthPage(){ @@ -93,6 +96,13 @@ class ApfAuthPage{ async movetoApfAuthPage(){ await this.click_ApfAuth.click({timeout: 9000}) } + + async selectInstallationType(){ + await this.select_SMPE.waitFor({ state: 'visible', timeout: 9000 }); // Adjust timeout if needed + console.log('SMP/E span is visible.'); + await this.select_SMPE.click({timeout: 9000}) + } + async movetoInstallationPage(){ await this.licenseAgreement.click({timeout: 9000}) await this.acceptLicense.click({timeout: 9000}) diff --git a/playwright_test/Pages/connection.page.ts b/playwright_test/Pages/connection.page.ts index b1ff61a7..8e3085f3 100644 --- a/playwright_test/Pages/connection.page.ts +++ b/playwright_test/Pages/connection.page.ts @@ -24,19 +24,17 @@ class ConnectionPage{ this.resumeProgress = page.locator('//button[contains(text(),"Resume Progress")]') this.continueButton = page.locator('.MuiButton-containedPrimary.MuiButton-sizeMedium') this.greenCheckIconSelector = page.locator('.MuiContainer-root svg[data-testid="CheckCircleIcon"]') - - - } async fillConnectionDetails(host: string, port: string, username: string, password: string){ - await this.page.waitForTimeout(1000); - await this.host.fill(host) + console.log("Filling connection details..."); + await this.host.fill(host); await this.page.waitForTimeout(1000); await this.port.fill(port) await this.page.waitForTimeout(1000); await this.userName.fill(username) await this.page.waitForTimeout(1000); - await this.password.fill(password) + await this.password.fill(password); + console.log("Connection details filled."); } async getHostValue(){ @@ -60,8 +58,10 @@ class ConnectionPage{ } async SubmitValidateCredential(){ + console.log("Submitting credentials..."); await this.page.waitForTimeout(1000); - await this.validateCredential.click() + await this.validateCredential.click(); + console.log("Credentials submitted."); } async clickContinueButton() { @@ -75,12 +75,9 @@ class ConnectionPage{ async isContinueButtonVisible() { return await this.continueButton.isDisabled(); } - async clickContinueButton() { - return await this.continueButton.click(); - } async isGreenCheckIconVisible() { return await this.greenCheckIconSelector.isHidden(); } } - export default ConnectionPage; \ No newline at end of file +export default ConnectionPage; \ No newline at end of file diff --git a/playwright_test/Pages/installation.page.ts b/playwright_test/Pages/installation.page.ts index e4752476..3813bacf 100644 --- a/playwright_test/Pages/installation.page.ts +++ b/playwright_test/Pages/installation.page.ts @@ -96,13 +96,13 @@ class InstallationPage{ } async enterAuthLoadLib(authloadlib: any){ - await this.page.waitForTimeout(500) await this.authLoadLib.fill(authloadlib); + await this.page.waitForTimeout(5000) } async getAuthLoadLibValue(){ - await this.page.waitForTimeout(500) return await this.authLoadLib.textContent(); + await this.page.waitForTimeout(5000) } async enterAuthPluginLib(authpluginlib: any){ @@ -116,8 +116,8 @@ class InstallationPage{ } async clickInstallMvsDatasets(){ - await this.page.waitForTimeout(1000) - await this.installMVSDatasets.click(); + await this.installMVSDatasets.click(); + await this.waitForContinueButtonToBeEnabled(); } async clickViewEditYaml(){ @@ -165,6 +165,20 @@ class InstallationPage{ await this.page.waitForTimeout(500) return await this.continueToNetworkSetup.isEnabled() } + + private async waitForContinueButtonToBeEnabled(): Promise { + const timeout = 100000; + const interval = 500; + const endTime = Date.now() + timeout; + while (Date.now() < endTime) { + if (await this.isContinueToNetworkSetupEnabled()) { + return; + } + await this.page.waitForTimeout(interval); + } + + throw new Error('Continue button was not enabled within the timeout period'); + } async open_monacoEditor(){ await this.page.waitForTimeout(1000) @@ -177,5 +191,19 @@ class InstallationPage{ await this.page.waitForTimeout(500) await this.closeEditorButton.click(); } + + async fillAllFields(datasetPrefix: string, parmLib: string, procLib: string, jclLib: string, loadLib: string, authLoadLib: string, authPluginLib: string){ + await this.enterPrefix(datasetPrefix); + await this.enterParmLib(parmLib); + await this.enterProcLib(procLib); + await this.enterJclLib(jclLib); + await this.enterLoadLib(loadLib); + await this.enterAuthLoadLib(authLoadLib); + await this.enterAuthPluginLib(authPluginLib); + await this.enterAuthLoadLib(authLoadLib); + await this.enterAuthPluginLib(authPluginLib); + await this.enterAuthLoadLib(authLoadLib); + await this.enterAuthPluginLib(authPluginLib); + } } export default InstallationPage; diff --git a/playwright_test/Pages/installationType.page.ts b/playwright_test/Pages/installationType.page.ts index b451ce2c..31958877 100644 --- a/playwright_test/Pages/installationType.page.ts +++ b/playwright_test/Pages/installationType.page.ts @@ -26,7 +26,7 @@ class InstallationTypePage{ this.uploadPax = page.locator("//span[text()='Upload Zowe PAX for offline install']/preceding-sibling::span/input") this.smpe = page.locator("//span[text()='SMP/E']/preceding-sibling::span/input") this.licenseAgreement = page.locator("//button[text()='License Agreement']") - this.saveAndClose = page.locator("//button[contains(text(),'Save & close')]") + this.saveAndClose = page.locator("//button[contains(text(),'Save & close')]") this.previousStep = page.locator("//button[contains(text(),'Previous step')]") this.continueToComponentInstallation = page.locator("//button[text()='Continue to Components Installation']") this.zoweLink = page.locator("//a[@href='zowe.org']") @@ -36,6 +36,9 @@ class InstallationTypePage{ this.validateLocation = page.locator("//button[text()= 'Validate location']") this.validateLocationGreenCheck = page.locator("//button[text()='Validate location']//following-sibling::*[@data-testid='CheckCircleIcon']") this.licenseAgreementGreenCheck = page.locator("//button[text()='License Agreement']//following-sibling::*[@data-testid='CheckCircleIcon']") + this.continueUpnax = page.locator("//button[contains(text(),'Continue to Unpax')]") + this.retrieveExampleZoweYaml = page.locator("//button[contains(text(),'Retrieve example-zowe.yaml')]") + this.continueCompInstallation = page.locator("//button[contains(text(),'Continue to Components Installation')]") } async getInstallationTypePageTitle(){ @@ -57,6 +60,27 @@ class InstallationTypePage{ await this.page.waitForTimeout(1000) await this.smpe.click({timeout: 5000}); } + + async continueToUnpax(){ + await this.continueUpnax.click({timeout: 5000}); + } + + async retrieveExampleYaml(){ + await this.retrieveExampleZoweYaml.click({timeout: 5000}); + } + + async continueComponentInstallation(){ + const timeout = 5000; + const interval = 500; + while (true) { + if (await this.continueCompInstallation.isEnabled()) { + await this.continueCompInstallation.click(); + return; + } + await this.page.waitForTimeout(interval); + } + await this.continueCompInstallation.click({timeout: timeout}); + } async clickZoweLink(){ await this.page.waitForTimeout(1000) diff --git a/playwright_test/Pages/networking.page.ts b/playwright_test/Pages/networking.page.ts index eaff91ef..58294fdc 100644 --- a/playwright_test/Pages/networking.page.ts +++ b/playwright_test/Pages/networking.page.ts @@ -86,7 +86,6 @@ class NetworkingPage{ this.deleteDomainName = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/div[2]/button'); this.readYaml = page.locator('div.view-lines'); this.previous_step_button = page.locator('//button[contains(text(),"Previous step")]'); - this.skip_button = page.locator('//button[contains(text(),"Skip")]'); this.editor_title_element = page.locator('//h2[text()="Editor"]'); this.NETWORKING_TITLE = page.locator(' //div[text()="Networking"]'); this.licenseAgreement = page.locator('//button[contains(text(), "License Agreement")]'); diff --git a/playwright_test/Pages/planning.page.ts b/playwright_test/Pages/planning.page.ts index 63b8c87e..8e3afee7 100644 --- a/playwright_test/Pages/planning.page.ts +++ b/playwright_test/Pages/planning.page.ts @@ -45,11 +45,12 @@ class PlanningPage{ this.jobName = page.locator("//label[contains(text(),'Job Name')]//following-sibling::div/input") this.jobPrefix = page.locator("//label[contains(text(),'Job Prefix')]//following-sibling::div/input") this.cookieIdentifier = page.locator("//label[contains(text(),'Cookie Identifier')]//following-sibling::div/input") - this.javaLocation = page.locator("//label[contains(text(),'Java location')]//following-sibling::div/input") - this.nodeJsLocation = page.locator("//label[contains(text(),'Node.js location')]//following-sibling::div/input") + this.javaLocation = page.locator("//label[contains(text(),'Java Home Directory')]//following-sibling::div/input") + this.nodeJsLocation = page.locator("//label[contains(text(),'Node.js Home Directory')]//following-sibling::div/input") this.setZosmf = page.locator("//span[text()='Set z/OSMF Attributes (optional)']/preceding-sibling::span/input") this.zosmfHost = page.locator("//label[contains(text(),'z/OSMF Host')]//following-sibling::div/input") - this.zosmfPort = page.locator("//label[contains(text(),'z/OSMF Port')]//following-sibling::div/input") + this.zosmfPort = page.locator('//label[contains(text(), "z/OSMF Port")]/following-sibling::div/input[@id="zosmf-port"]') + //this.zosmfPort = page.locator('//input[@id="zosmf-port"]'); this.zosmfApplicationId = page.locator("//label[contains(text(),'z/OSMF Application Id')]//following-sibling::div/input") this.validateLocations = page.locator("//button[contains(text(), 'Validate locations')]") this.ValidateLocationsGreenCheck = page.locator("//button[text()='Validate locations']//following-sibling::*[@data-testid='CheckCircleIcon']") @@ -97,7 +98,7 @@ class PlanningPage{ async enterRuntimeDir(runtimeDir: any){ await this.page.waitForTimeout(500); - await this.runtimeDir.clear({timeout: 2000}) + //await this.runtimeDir.clear({timeout: 2000}) await this.runtimeDir.fill(runtimeDir); } @@ -213,7 +214,7 @@ class PlanningPage{ async clickContinueToInstallation(){ await this.page.waitForTimeout(500); - await this.continueInstallationOptions.click(); + await this.continueInstallationOptions.click(); } async isContinueToInstallationDisabled(){ @@ -232,12 +233,11 @@ class PlanningPage{ } async clickSaveValidate(){ - await this.page.waitForTimeout(500); - await this.jobStatement.fill("//HELLOJOB JOB 'HELLO, WORLD!',CLASS=A,MSGCLASS=A\n//STEP01 EXEC PGM=IEFBR14\n//SYSPRINT DD SYSOUT=A\n//SYSIN DD DUMMY") + await this.jobStatement.fill("//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A,\n// MSGLEVEL=(1,1),MSGCLASS=A") await this.saveAndValidate.click(); + await this.page.waitForTimeout(500); } async fillPlanningPageWithRequiredFields(runtimeDir: any, workspaceDir: any, extensionDir: any, logDir: any, profileIdentifier:any, jobPrefix:any,jobname:any, javaLocation:any,nodejsLocation:any,zOSMFHost:any,zOSMFPort:any,zOSMFAppID:any){ - await this.page.waitForTimeout(2000); await this.clickSaveValidate(); await this.enterRuntimeDir(runtimeDir); await this.enterWorkspaceDir(workspaceDir); @@ -248,8 +248,8 @@ class PlanningPage{ await this.enterJobPrefix(jobPrefix); await this.enterJavaLocation(javaLocation); await this.enterNodeJsLocation(nodejsLocation); - await this.enterZosmfHost(zOSMFHost); - await this.enterZosmfPort(zOSMFPort); + //await this.enterZosmfHost(zOSMFHost); + //await this.enterZosmfPort(zOSMFPort); await this.enterZosmfApplicationId(zOSMFAppID); await this.page.waitForTimeout(2000); } diff --git a/playwright_test/Tests/ApfAuth.spec.ts b/playwright_test/Tests/ApfAuth.spec.ts index 5c86a5c9..3ad50342 100644 --- a/playwright_test/Tests/ApfAuth.spec.ts +++ b/playwright_test/Tests/ApfAuth.spec.ts @@ -4,6 +4,10 @@ import ApfAuthPage from '../Pages/ApfAuth.page'; import TitlePage from '../Pages/title.page'; import ConnectionPage from '../Pages/connection.page'; import PlanningPage from '../Pages/planning.page'; +import InstallationTypePage from '../Pages/installationType.page'; +import InstallationPage from '../Pages/installation.page.ts'; +import NetworkingPage from '../Pages/networking.page'; +import config from '../utils/config'; import { spawn } from 'child_process'; import path from 'path'; let page: Page; @@ -14,24 +18,7 @@ const APF_AUTH_TITLE ='APF Authorize Load Libraries' const NETWORKING_TITLE = 'Networking' const INSTALLATION_TITLE = 'Installation' const SECURITY_TITLE = 'Security' -const DATASET_PREFIX = 'IBMUSER.ZWEV1' -const AUTH_LOAD_LIB = 'IBMUSER.ZWEV1.ZWEAUTH' -const AUTH_PLUGIN_LIB = 'IBMUSER.ZWEV1.CUST.ZWESAPL' -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR= process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR=process.env.ZOWE_LOG_DIR; -const ZOWE_ROOT_DIR=process.env.ZOWE_ROOT_DIR; -const ZOWE_WORKSPACE_DIR=process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME= process.env.JOB_NAME; -const JOB_PREFIX=process.env.JOB_PREFIX; -const JAVA_HOME=process.env.JAVA_HOME; -const NODE_HOME=process.env.NODE_HOME; -const ZOSMF_HOST=process.env.ZOSMF_HOST; -const ZOSMF_PORT=process.env.ZOSMF_PORT; -const ZOSMF_APP_ID=process.env.ZOSMF_APP_ID; + test.beforeAll(async () => { try { @@ -42,64 +29,84 @@ test.beforeAll(async () => { } }); + test.describe('ApfAuthTab', () => { let connectionPage: ConnectionPage; let titlePage : TitlePage; let apfAuthPage : ApfAuthPage; let planningPage : PlanningPage; + let installationTypePage : InstallationTypePage; + let installationPage : InstallationPage; + let networkingPage : NetworkingPage; test.beforeEach(async ({ page }) => { test.setTimeout(900000); electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) - page= await electronApp.firstWindow() + page = await electronApp.firstWindow() connectionPage = new ConnectionPage(page); titlePage = new TitlePage(page); planningPage = new PlanningPage(page) apfAuthPage = new ApfAuthPage(page); + installationTypePage = new InstallationTypePage(page); + installationPage = new InstallationPage(page); + networkingPage = new NetworkingPage(page); titlePage.navigateToConnectionTab() - connectionPage.fillConnectionDetails(SSH_HOST,SSH_PORT,SSH_USER,SSH_PASSWD) - connectionPage.SubmitValidateCredential() - await page.waitForTimeout(5000); - connectionPage.clickContinueButton() - planningPage.clickSaveValidate() - await page.waitForTimeout(20000); - planningPage.fillPlanningPageWithRequiredFields(ZOWE_ROOT_DIR, ZOWE_WORKSPACE_DIR,ZOWE_EXTENSION_DIR,ZOWE_LOG_DIR,'1',JOB_NAME,JOB_PREFIX,JAVA_HOME,NODE_HOME,ZOSMF_HOST,ZOSMF_PORT,ZOSMF_APP_ID) - await page.waitForTimeout(20000); - planningPage.clickValidateLocations() - await page.waitForTimeout(30000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); - apfAuthPage.movetoInstallationPage() - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() + await installationTypePage.selectSmpe() + await installationTypePage.continueToUnpax() + await installationTypePage.retrieveExampleYaml() + await installationTypePage.continueComponentInstallation() + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickInstallMvsDatasets() + await installationPage.clickContinueToNetworkSetup() + await networkingPage.click_skipNetworking() + await page.waitForTimeout(1000); }) test.afterEach(async () => { await electronApp.close() }) test('Test Resume Progress', async ({ page }) => { - await page.waitForTimeout(8000); - apfAuthPage.fillApfDetails(DATASET_PREFIX,AUTH_LOAD_LIB,AUTH_PLUGIN_LIB) - await page.waitForTimeout(5000); + apfAuthPage.fillApfDetails(config.DATASET_PREFIX, config.AUTH_LOAD_LIB, config.AUTH_PLUGIN_LIB) apfAuthPage.click_saveAndClose() - await page.waitForTimeout(8000); connectionPage.click_resumeProgress() - await page.waitForTimeout(8000); const title = await apfAuthPage.returnTitleOfApfAuthPage(); - expect(title).toBe(APF_AUTH_TITLE); + expect(title).toBe(config.APF_AUTH_TITLE); const datatsetPrefixValue = await apfAuthPage.get_datasetPrefix_value(); const AuthLoadLib_Value = await apfAuthPage.get_authLoadLib_value(); const AuthPluginLib_Value = await apfAuthPage.get_authPluginLib_value(); - expect(datatsetPrefixValue).toBe(DATASET_PREFIX); - expect(AuthLoadLib_Value).toBe(AUTH_LOAD_LIB); - expect(AuthPluginLib_Value).toBe(AUTH_PLUGIN_LIB); + expect(datatsetPrefixValue).toBe(config.DATASET_PREFIX); + expect(AuthLoadLib_Value).toBe(config.AUTH_LOAD_LIB); + expect(AuthPluginLib_Value).toBe(config.AUTH_PLUGIN_LIB); }) test('Verify title', async ({ page }) => { - await page.waitForTimeout(5000); apfAuthPage.fillApfDetails(DATASET_PREFIX,AUTH_LOAD_LIB,AUTH_PLUGIN_LIB) - await page.waitForTimeout(5000); apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); await expect(apfAuthPage.datasetPrefix).toBeTruthy() await expect(apfAuthPage.authLoadLib).toBeTruthy() await expect(apfAuthPage.authpluginLib).toBeTruthy() @@ -112,13 +119,9 @@ test.describe('ApfAuthTab', () => { }) test('test apfAuth with empty data', async ({ page }) => { - await page.waitForTimeout(5000); apfAuthPage.fillApfDetails('','','') - await page.waitForTimeout(5000); apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); apfAuthPage.initializeApfauth() - await page.waitForTimeout(5000); const isWriteConfig_check_visible = await apfAuthPage.isWriteConfigGreenCheckVisible(); expect(isWriteConfig_check_visible).toBe(false); const isUploadConfig_check_visible = await apfAuthPage.isUploadConfig_check_visible(); @@ -127,13 +130,9 @@ test.describe('ApfAuthTab', () => { expect(isInitApf_check_visible).toBe(false); }) test('test apfAuth with valid data', async ({ page }) => { - await page.waitForTimeout(5000); apfAuthPage.fillApfDetails(DATASET_PREFIX,AUTH_LOAD_LIB,AUTH_PLUGIN_LIB) - await page.waitForTimeout(5000); apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); apfAuthPage.initializeApfauth() - await page.waitForTimeout(5000); const isWriteConfig_check_visible = await apfAuthPage.isWriteConfigGreenCheckVisible(); expect(isWriteConfig_check_visible).toBe(true); const isUploadConfig_check_visible = await apfAuthPage.isUploadConfig_check_visible(); @@ -143,7 +142,6 @@ test.describe('ApfAuthTab', () => { }) test('click Previous step', async ({ page }) => { - await page.waitForTimeout(5000); apfAuthPage.movetoApfAuthPage() const title = await apfAuthPage.returnTitleOfPrevPage(); expect(title).toBe(NETWORKING_TITLE); @@ -153,31 +151,25 @@ test.describe('ApfAuthTab', () => { apfAuthPage.movetoApfAuthPage() const isSkipApfAuthEnable = await apfAuthPage.is_skipApfAuthButtonEnable(); expect(isSkipApfAuthEnable).toBe(true); - await page.waitForTimeout(2000); }) test('test previous button is enabled', async ({ page }) => { apfAuthPage.movetoApfAuthPage() const is_prevButtonEnable = await apfAuthPage.isPreviousButtonEnable(); expect(is_prevButtonEnable).toBe(true); - await page.waitForTimeout(2000); }) test('test continue button is disable', async ({ page }) => { apfAuthPage.movetoApfAuthPage() const is_ContinueButtonDisable = await apfAuthPage.isContinueButtonDisable(); expect(is_ContinueButtonDisable).toBe(true); - await page.waitForTimeout(2000); }) test('click view yaml button', async ({ page }) => { apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); apfAuthPage.viewYaml() - await page.waitForTimeout(5000); await expect(apfAuthPage.editor_title_element).toBeTruthy(); apfAuthPage.closeButton() - await page.waitForTimeout(2000); }) test('test click skip APFAuth button', async ({ page }) => { @@ -189,44 +181,31 @@ test.describe('ApfAuthTab', () => { test('Test view and submit button', async ({ page }) => { apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); apfAuthPage.click_viewAndSubmitJob() - await page.waitForTimeout(5000); await expect(apfAuthPage.editor_title_element).toBeTruthy() apfAuthPage.closeButton() - await page.waitForTimeout(2000); }) test('Test view job', async ({ page }) => { apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); apfAuthPage.click_previewJob() - await page.waitForTimeout(5000); await expect(apfAuthPage.editor_title_element).toBeTruthy() apfAuthPage.closeButton() - await page.waitForTimeout(5000); }) test('Test save and close and Resume Progress', async ({ page }) => { - await page.waitForTimeout(5000); - apfAuthPage.fillApfDetails(DATASET_PREFIX,AUTH_LOAD_LIB,AUTH_PLUGIN_LIB) - await page.waitForTimeout(5000); + apfAuthPage.fillApfDetails(config.DATASET_PREFIX, config.AUTH_LOAD_LIB, config.AUTH_PLUGIN_LIB) apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); apfAuthPage.click_saveAndClose() - await page.waitForTimeout(3000); titlePage.clickOnResumeProgress(); - await page.waitForTimeout(15000); const title = await securityPage.returnTitleOfSecurityPage(); expect(title).toBe(SECURITY_TITLE); const datatsetPrefixValue = await apfAuthPage.get_datasetPrefix_value(); const authPluginLibValue = await apfAuthPage.get_authPluginLib_value(); const authLoadLibValue = await apfAuthPage.get_authLoadLib_value(); - expect(datatsetPrefixValue).toBe(DATASET_PREFIX); - expect(authLoadLibValue).toBe(AUTH_LOAD_LIB); - expect(authPluginLibValue).toBe(AUTH_PLUGIN_LIB); + expect(datatsetPrefixValue).toBe(config.DATASET_PREFIX); + expect(authLoadLibValue).toBe(config.AUTH_LOAD_LIB); + expect(authPluginLibValue).toBe(config.AUTH_PLUGIN_LIB); }) - - }) \ No newline at end of file diff --git a/playwright_test/Tests/Connection.spec.ts b/playwright_test/Tests/Connection.spec.ts index 16284e19..5b5071c1 100644 --- a/playwright_test/Tests/Connection.spec.ts +++ b/playwright_test/Tests/Connection.spec.ts @@ -4,17 +4,16 @@ import TitlePage from '../Pages/title.page'; import path from 'path'; import { spawn } from 'child_process'; import { prepareEnvironment } from '../prepare.js'; +import config from '../utils/config'; +let page: Page; let electronApp: ElectronApplication -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; const CONNECTION_PAGE_TITLE = 'Connection' +const INSTALLATION_TITLE = 'Installation' test.beforeAll(async () => { try { - await prepareEnvironment({ install: true, remove: false }); + await prepareEnvironment({ install: false, remove: false }); } catch (error) { console.error('Error during environment preparation:', error); process.exit(1); @@ -31,6 +30,7 @@ test.describe('ConnectionTab', () => { page= await electronApp.firstWindow() connectionPage = new ConnectionPage(page); titlePage = new TitlePage(page); + await titlePage.navigateToConnectionTab() }); test.afterEach(async () => { @@ -38,31 +38,23 @@ test.describe('ConnectionTab', () => { }); test('Test Save and close and Resume Progress', async ({ page }) => { - titlePage.navigateToConnectionTab() - connectionPage.fillConnectionDetails(SSH_HOST,SSH_PORT,SSH_USER,SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.SubmitValidateCredential() - await page.waitForTimeout(2000); - connectionPage.click_saveAndClose() - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential() + await connectionPage.click_saveAndClose() + await titlePage.clickOnResumeProgress(); const title = await connectionPage.getConnectionPageTitle(); expect(title).toBe(CONNECTION_PAGE_TITLE); const hostValue = await connectionPage.getHostValue(); - expect(hostValue).toBe(SSH_HOST); + expect(hostValue).toBe(config.SSH_HOST); const portValue = await connectionPage.getPortValue(); - expect(portValue).toBe(SSH_PORT); + expect(portValue).toBe(config.SSH_PORT); const userNameValue = await connectionPage.getUsernameValue(); - expect(userNameValue).toBe(SSH_USER); + expect(userNameValue).toBe(config.SSH_USER); }) test('test invalid credentials', async ({ page }) => { - titlePage.navigateToConnectionTab() - connectionPage.fillConnectionDetails(SSH_HOST,SSH_PORT,SSH_USER,SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.SubmitValidateCredential() - await page.waitForTimeout(2000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential() const isGreenIconHidden = await connectionPage.isGreenCheckIconVisible(); expect(isGreenIconHidden).toBe(true); const isContinueDisable = await connectionPage.isContinueButtonVisible(); @@ -70,11 +62,8 @@ test.describe('ConnectionTab', () => { }) test('test valid credentials', async ({ page }) => { - titlePage.navigateToConnectionTab() - connectionPage.fillConnectionDetails(SSH_HOST,SSH_PORT,SSH_USER,SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.SubmitValidateCredential() - await page.waitForTimeout(8000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential() const isGreenIconHidden = await connectionPage.isGreenCheckIconVisible(); expect(isGreenIconHidden).toBe(false); const isContinueDisable = await connectionPage.isContinueButtonVisible(); @@ -86,13 +75,10 @@ test.describe('ConnectionTab', () => { await expect(connectionPage.password).toBeTruthy() await expect(connectionPage.port).toBeTruthy() await expect(connectionPage.host).toBeTruthy() - await page.waitForTimeout(2000); }) test('test continue disable', async ({ page }) => { - titlePage.navigateToConnectionTab() const isContinueButtonDisable = await connectionPage.isContinueButtonVisible(); expect(isContinueButtonDisable).toBe(true); - await page.waitForTimeout(2000); }) }) \ No newline at end of file diff --git a/playwright_test/utils/config.ts b/playwright_test/utils/config.ts new file mode 100644 index 00000000..eb879463 --- /dev/null +++ b/playwright_test/utils/config.ts @@ -0,0 +1,51 @@ +interface Config { + SSH_HOST: string | undefined; + SSH_PASSWD: string | undefined; + SSH_PORT: string | undefined; + SSH_USER: string | undefined; + ZOWE_EXTENSION_DIR: string | undefined; + ZOWE_LOG_DIR: string | undefined; + ZOWE_ROOT_DIR: string | undefined; + ZOWE_WORKSPACE_DIR: string | undefined; + JOB_NAME: string | undefined; + JOB_PREFIX: string | undefined; + JAVA_HOME: string | undefined; + NODE_HOME: string | undefined; + ZOSMF_HOST: string | undefined; + ZOSMF_PORT: string | undefined; + ZOSMF_APP_ID: string | undefined; + DATASET_PREFIX: string | undefined; + AUTH_LOAD_LIB: string | undefined; + AUTH_PLUGIN_LIB: string | undefined; + PROC_LIB: string | undefined; + PARM_LIB: string | undefined; + JCL_LIB: string | undefined; + LOAD_LIB: string | undefined; +} + +const config: Config = { + SSH_HOST: process.env.SSH_HOST, + SSH_PASSWD: process.env.SSH_PASSWD, + SSH_PORT: process.env.SSH_PORT, + SSH_USER: process.env.SSH_USER, + ZOWE_EXTENSION_DIR: process.env.ZOWE_EXTENSION_DIR, + ZOWE_LOG_DIR: process.env.ZOWE_LOG_DIR, + ZOWE_ROOT_DIR: process.env.ZOWE_ROOT_DIR, + ZOWE_WORKSPACE_DIR: process.env.ZOWE_WORKSPACE_DIR, + JOB_NAME: process.env.JOB_NAME, + JOB_PREFIX: process.env.JOB_PREFIX, + JAVA_HOME: process.env.JAVA_HOME, + NODE_HOME: process.env.NODE_HOME, + ZOSMF_HOST: process.env.ZOSMF_HOST, + ZOSMF_PORT: process.env.ZOSMF_PORT, + ZOSMF_APP_ID: process.env.ZOSMF_APP_ID, + DATASET_PREFIX: process.env.DATASET_PREFIX, + AUTH_LOAD_LIB: process.env.AUTH_LOAD_LIB, + AUTH_PLUGIN_LIB: process.env.AUTH_PLUGIN_LIB, + PROC_LIB: process.env.PROC_LIB, + PARM_LIB: process.env.PARM_LIB, + JCL_LIB: process.env.JCL_LIB, + LOAD_LIB: process.env.LOAD_LIB +}; + +export default config; From b78aa569bc10fe4d71eea8a33a0a9f63e4b851f4 Mon Sep 17 00:00:00 2001 From: James Struga Date: Tue, 6 Aug 2024 20:46:34 -0400 Subject: [PATCH 373/455] fix installtion Signed-off-by: James Struga --- playwright_test/Pages/installation.page.ts | 58 ++-- .../Pages/installationType.page.ts | 30 +- playwright_test/Pages/planning.page.ts | 15 +- playwright_test/Tests/Installation.spec.ts | 266 ++++++------------ .../Tests/InstallationType.spec.ts | 18 +- 5 files changed, 129 insertions(+), 258 deletions(-) diff --git a/playwright_test/Pages/installation.page.ts b/playwright_test/Pages/installation.page.ts index 3813bacf..ee8a1753 100644 --- a/playwright_test/Pages/installation.page.ts +++ b/playwright_test/Pages/installation.page.ts @@ -50,69 +50,65 @@ class InstallationPage{ return await this.pageTitle.textContent({ timeout: 2000 }); } - async enterPrefix(prefix: any){ + async enterPrefix(prefix: string): Promise{ await this.page.waitForTimeout(500) await this.prefix.fill(prefix); } - async getPrefixValue(){ - await this.page.waitForTimeout(500) - return await this.prefix.textContent(); + async getPrefixValue(): Promise { + return await this.prefix.inputValue(); } - async enterProcLib(proclib: any){ + async enterProcLib(proclib: string): Promise { await this.page.waitForTimeout(500) await this.procLib.fill(proclib); } - async getProclibValue(){ - await this.page.waitForTimeout(500) - return await this.procLib.textContent(); + + async getProclibValue(): Promise { + return await this.procLib.inputValue(); } - async enterParmLib(parmlib: any){ + async enterParmLib(parmlib: string): Promise{ await this.page.waitForTimeout(500) await this.parmLib.fill(parmlib); } - async getParmlibValue(){ - await this.page.waitForTimeout(500) - return await this.parmLib.textContent(); + async getParmlibValue(): Promise { + return await this.parmLib.inputValue(); } - async enterZis(zis: any){ + async enterZis(zis: string): Promise { await this.page.waitForTimeout(500) await this.zis.fill(zis); } - async enterJclLib(Jcllib: any){ + async enterJclLib(Jcllib: string): Promise { await this.page.waitForTimeout(500) await this.jclLib.fill(Jcllib); } - async enterLoadLib(loadlib: any){ + async enterLoadLib(loadlib: string): Promise{ await this.page.waitForTimeout(500) await this.loadLib.fill(loadlib); } - async enterAuthLoadLib(authloadlib: any){ + async enterAuthLoadLib(authloadlib: string): Promise { await this.authLoadLib.fill(authloadlib); await this.page.waitForTimeout(5000) } - async getAuthLoadLibValue(){ - return await this.authLoadLib.textContent(); - await this.page.waitForTimeout(5000) + async getAuthLoadLibValue(): Promise { + return await this.authLoadLib.inputValue(); } - async enterAuthPluginLib(authpluginlib: any){ - await this.page.waitForTimeout(500) + async enterAuthPluginLib(authpluginlib: string): Promise { await this.authPluginLib.fill(authpluginlib); + await this.page.waitForTimeout(5000) } - async getAuthPluginLibValue(){ - await this.page.waitForTimeout(500) - return await this.authPluginLib.textContent(); + async getAuthPluginLibValue(): Promise { + return await this.authPluginLib.inputValue(); } async clickInstallMvsDatasets(){ @@ -121,23 +117,19 @@ class InstallationPage{ } async clickViewEditYaml(){ - await this.page.waitForTimeout(500) await this.viewEditYaml.click(); } async clickViewSubmitJob(){ - await this.page.waitForTimeout(500) await this.viewSubmitJob.click(); } async clickViewJobOutput(){ - await this.page.waitForTimeout(500) await this.viewJobOutput.click(); await this.page.waitForTimeout(2000); } async clickSaveAndClose(){ - await this.page.waitForTimeout(500) await this.saveAndClose.click({timeout: 2000}); } @@ -157,15 +149,17 @@ class InstallationPage{ } async isContinueToNetworkSetupDisabled(){ - await this.page.waitForTimeout(500) return await this.continueToNetworkSetup.isDisabled() } async isContinueToNetworkSetupEnabled(){ - await this.page.waitForTimeout(500) return await this.continueToNetworkSetup.isEnabled() } + async isSkipToNetworkSetupEnabled(){ + return await this.skipInstallation.isEnabled() + } + private async waitForContinueButtonToBeEnabled(): Promise { const timeout = 100000; const interval = 500; @@ -192,6 +186,10 @@ class InstallationPage{ await this.closeEditorButton.click(); } + async clickInstallMvsDatasetsInvalid(){ + await this.installMVSDatasets.click(); + } + async fillAllFields(datasetPrefix: string, parmLib: string, procLib: string, jclLib: string, loadLib: string, authLoadLib: string, authPluginLib: string){ await this.enterPrefix(datasetPrefix); await this.enterParmLib(parmLib); diff --git a/playwright_test/Pages/installationType.page.ts b/playwright_test/Pages/installationType.page.ts index 31958877..417abbd1 100644 --- a/playwright_test/Pages/installationType.page.ts +++ b/playwright_test/Pages/installationType.page.ts @@ -39,25 +39,22 @@ class InstallationTypePage{ this.continueUpnax = page.locator("//button[contains(text(),'Continue to Unpax')]") this.retrieveExampleZoweYaml = page.locator("//button[contains(text(),'Retrieve example-zowe.yaml')]") this.continueCompInstallation = page.locator("//button[contains(text(),'Continue to Components Installation')]") + this.skipUnpaxButton = page.locator("//button[text()='Skip ']") } async getInstallationTypePageTitle(){ - await this.page.waitForTimeout(1000) return await this.pageTitle.textContent({ timeout: 2000 }); } async selectDownloadZowePax(){ - await this.page.waitForTimeout(1000) await this.downloadPax.click({timeout: 5000}) } async selectUploadZowePax(){ - await this.page.waitForTimeout(2000) await this.uploadPax.click({timeout: 5000}); } async selectSmpe(){ - await this.page.waitForTimeout(1000) await this.smpe.click({timeout: 5000}); } @@ -83,72 +80,59 @@ class InstallationTypePage{ } async clickZoweLink(){ - await this.page.waitForTimeout(1000) await this.zoweLink.click(); } async clickLicenseAgreement(){ - await this.page.waitForTimeout(1000) await this.licenseAgreement.click({timeout: 5000}); } async clickSaveAndClose(){ - await this.page.waitForTimeout(1000) await this.saveAndClose.click({timeout: 5000}); - await this.page.waitForTimeout(2000) } async clickPreviousStep(){ - await this.page.waitForTimeout(1000) await this.previousStep.click(); - await this.page.waitForTimeout(2000) } async clickContinueToInstallation(){ - await this.page.waitForTimeout(1000) await this.continueToComponentInstallation.click(); - await this.page.waitForTimeout(5000); } async isContinueToComponentInstallationDisabled(){ - await this.page.waitForTimeout(1000) return await this.continueToComponentInstallation.isDisabled() } async isContinueToComponentInstallationEnabled(){ - await this.page.waitForTimeout(1000) return await this.continueToComponentInstallation.isEnabled() } async clickAgreeLicense(){ - await this.page.waitForTimeout(1000) await this.agreeLicense.click({timeout: 5000}); } async isLicenseAgreementGreenCheckVisible(){ - await this.page.waitForTimeout(1000) return await this.licenseAgreementGreenCheck.isVisible(); } async clickUploadPaxButton(){ - await this.page.waitForTimeout(1000) await this.uploadPaxButton.click({timeout: 5000}); } + + async skipUnpax(){ + await this.skipUnpaxButton.click({timeout: 5000}); + } async enterRuntimeDir(runtimeDir: any){ - await this.page.waitForTimeout(1000) await this.runtimeDir.clear({timeout: 5000}) await this.runtimeDir.fill(runtimeDir); } async clickValidateLocation(){ - await this.page.waitForTimeout(1000) await this.validateLocation.click({timeout: 5000}); - await this.page.waitForTimeout(2000) } async isValidateLocationGreenCheckVisible(){ - await this.page.waitForTimeout(1000) return await this.validateLocationGreenCheck.isVisible(); } @@ -160,15 +144,13 @@ class InstallationTypePage{ async uploadZowePaxAndNavigateToInstallationPage(uploadPaxPath: any){ this.selectUploadZowePax() - await this.page.waitForTimeout(2000) await this.uploadPaxButton.setInputFiles(uploadPaxPath) - await this.page.waitForTimeout(2000) } async smpeZowePaxAndNavigateToInstallationPage(runtimeDir: any){ this.selectSmpe() this.enterRuntimeDir(runtimeDir) this.clickValidateLocation() - } + } } export default InstallationTypePage; diff --git a/playwright_test/Pages/planning.page.ts b/playwright_test/Pages/planning.page.ts index 8e3afee7..5fcac658 100644 --- a/playwright_test/Pages/planning.page.ts +++ b/playwright_test/Pages/planning.page.ts @@ -193,8 +193,8 @@ class PlanningPage{ } async clickValidateLocations(){ - await this.page.waitForTimeout(500); await this.validateLocations.click({timeout: 5000}); + await this.isContinueToInstallationEnabled() } async isValidateLocationsGreenCheckVisible(){ @@ -213,7 +213,18 @@ class PlanningPage{ } async clickContinueToInstallation(){ - await this.page.waitForTimeout(500); + const timeout = 30000; + const interval = 100; + const startTime = Date.now(); + const isButtonEnabled = async (): Promise => { + return await this.isContinueToInstallationEnabled(); + }; + while (!(await isButtonEnabled())) { + if (Date.now() - startTime > timeout) { + throw new Error('Timed out waiting for the button to be enabled.'); + } + await new Promise(resolve => setTimeout(resolve, interval)); + } await this.continueInstallationOptions.click(); } diff --git a/playwright_test/Tests/Installation.spec.ts b/playwright_test/Tests/Installation.spec.ts index 38d84ee5..5fa352eb 100644 --- a/playwright_test/Tests/Installation.spec.ts +++ b/playwright_test/Tests/Installation.spec.ts @@ -5,34 +5,14 @@ import PlanningPage from '../Pages/planning.page.ts'; import InstallationTypePage from '../Pages/installationType.page.ts'; import InstallationPage from '../Pages/installation.page.ts'; import NetworkingPage from '../Pages/networking.page.ts'; +import config from '../utils/config'; let electronApp: ElectronApplication const NETWORKING_PAGE_TITLE = 'Networking' -const INSTALLATION_TYPE_TITLE = 'Installation Type'; -const RUNTIME_DIR = process.env.ZOWE_ROOT_DIR; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR= process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR=process.env.ZOWE_LOG_DIR; -const ZOWE_WORKSPACE_DIR=process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME= process.env.JOB_NAME; -const JOB_PREFIX=process.env.JOB_PREFIX; -const JAVA_HOME=process.env.JAVA_HOME; -const NODE_HOME=process.env.NODE_HOME; -const ZOSMF_HOST=process.env.ZOSMF_HOST; -const ZOSMF_PORT=process.env.ZOSMF_PORT; -const ZOSMF_APP_ID=process.env.ZOSMF_APP_ID; -const DATASET_PREFIX= process.env.DATASET_PREFIX; -const PROC_LIB = process.env.PROC_LIB; -const PARM_LIB = process.env.PARM_LIB; -const ZIS = process.env.SECURITY_STC_ZIS; -const JCL_LIB = process.env.JCL_LIB; -const LOAD_LIB = process.env.LOAD_LIB; -const AUTH_LOAD_LIB = process.env.AUTH_LOAD_LIB; -const AUTH_PLUGIN_LIB = process.env.AUTH_PLUGIN_LIB; -const UPLOAD_PAX_PATH= process.env.ZOWE_ROOT_DIR +const INSTALLATION_TYPE_TITLE = 'Installation'; +const DOWNLOAD_ZOWE_TITLE = 'Download Zowe Pax'; + + test.describe('InstallationTab', () => { let connectionPage: ConnectionPage; @@ -46,27 +26,36 @@ test.describe('InstallationTab', () => { test.beforeEach(async ({ page }) => { test.setTimeout(900000); electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) - page= await electronApp.firstWindow() + page = await electronApp.firstWindow() connectionPage = new ConnectionPage(page); titlePage = new TitlePage(page); planningPage = new PlanningPage(page); installationTypePage = new InstallationTypePage(page); installationPage = new InstallationPage(page); networkingPage = new NetworkingPage(page); + titlePage.navigateToConnectionTab() - connectionPage.fillConnectionDetails(SSH_HOST,SSH_PORT,SSH_USER,SSH_PASSWD) - connectionPage.SubmitValidateCredential() - await page.waitForTimeout(5000); - connectionPage.clickContinueButton() - await page.waitForTimeout(2000); - planningPage.clickSaveValidate() - await page.waitForTimeout(20000); - planningPage.fillPlanningPageWithRequiredFields(RUNTIME_DIR, ZOWE_WORKSPACE_DIR,ZOWE_EXTENSION_DIR,ZOWE_LOG_DIR,'1',JOB_NAME,JOB_PREFIX,JAVA_HOME,NODE_HOME,ZOSMF_HOST,ZOSMF_PORT,ZOSMF_APP_ID) - await page.waitForTimeout(20000); - planningPage.clickValidateLocations() - await page.waitForTimeout(20000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() + await installationTypePage.downloadZowePaxAndNavigateToInstallationPage() + await installationTypePage.continueToUnpax() + await installationTypePage.skipUnpax() }) test.afterEach(async () => { @@ -74,10 +63,6 @@ test.describe('InstallationTab', () => { }) test('Test all required fields on Installation page', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); expect(installationPage.prefix).toBeTruthy() expect(installationPage.procLib).toBeTruthy() expect(installationPage.parmLib).toBeTruthy() @@ -93,182 +78,91 @@ test.describe('InstallationTab', () => { expect(installationPage.saveAndClose).toBeTruthy() expect(installationPage.previousStep).toBeTruthy() expect(installationPage.skipInstallation).toBeTruthy() - expect(installationPage.continueToNetworkSetup).toBeTruthy() - const is_Continue_Button_disable = await installationPage.isContinueToNetworkSetupDisabled(); + expect(installationPage.clickContinueToNetworkSetup).toBeTruthy() + const is_Continue_Button_disable = await installationPage.isContinueToNetworkSetupEnabled(); expect(is_Continue_Button_disable).toBe(true); }) test('Test Installation with Valid Data with Download Pax', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix(DATASET_PREFIX) - installationPage.enterProcLib(PROC_LIB) - installationPage.enterParmLib(PARM_LIB) - installationPage.enterZis(ZIS) - installationPage.enterJclLib(JCL_LIB) - installationPage.enterLoadLib(LOAD_LIB) - installationPage.enterAuthLoadLib(AUTH_LOAD_LIB) - installationPage.enterAuthPluginLib(AUTH_PLUGIN_LIB) - installationPage.clickInstallMvsDatasets(); - await page.waitForTimeout(1800000); - const is_Continue_Button_enable = await installationPage.isContinueToNetworkSetupEnabled(); - expect(is_Continue_Button_enable).toBe(true); - installationPage.clickContinueToNetworkSetup(); - await page.waitForTimeout(2000); - const networkSetup_title = await networkingPage.returnTitleOfNetworkingPage() - expect (networkSetup_title).toBe(NETWORKING_PAGE_TITLE); - }) - - test('Test Installation with Valid Data with Upload Pax', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.uploadZowePaxAndNavigateToInstallationPage(UPLOAD_PAX_PATH) - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix(DATASET_PREFIX) - installationPage.enterProcLib(PROC_LIB) - installationPage.enterParmLib(PARM_LIB) - installationPage.enterZis(ZIS) - installationPage.enterJclLib(JCL_LIB) - installationPage.enterLoadLib(LOAD_LIB) - installationPage.enterAuthLoadLib(AUTH_LOAD_LIB) - installationPage.enterAuthPluginLib(AUTH_PLUGIN_LIB) - installationPage.clickInstallMvsDatasets(); - await page.waitForTimeout(1800000); - const is_Continue_Button_enable = await installationPage.isContinueToNetworkSetupEnabled(); - expect(is_Continue_Button_enable).toBe(true); - installationPage.clickContinueToNetworkSetup(); - await page.waitForTimeout(2000); - const networkSetup_title = await networkingPage.returnTitleOfNetworkingPage() - expect (networkSetup_title).toBe(NETWORKING_PAGE_TITLE); - }) - - test('Test Installation with Valid Data with SMPE', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.smpeZowePaxAndNavigateToInstallationPage(RUNTIME_DIR) - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix(DATASET_PREFIX) - installationPage.enterProcLib(PROC_LIB) - installationPage.enterParmLib(PARM_LIB) - installationPage.enterZis(ZIS) - installationPage.enterJclLib(JCL_LIB) - installationPage.enterLoadLib(LOAD_LIB) - installationPage.enterAuthLoadLib(AUTH_LOAD_LIB) - installationPage.enterAuthPluginLib(AUTH_PLUGIN_LIB) - installationPage.clickInstallMvsDatasets(); - await page.waitForTimeout(1800000); + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickInstallMvsDatasets(); const is_Continue_Button_enable = await installationPage.isContinueToNetworkSetupEnabled(); expect(is_Continue_Button_enable).toBe(true); - installationPage.clickContinueToNetworkSetup(); - await page.waitForTimeout(2000); - const networkSetup_title = await networkingPage.returnTitleOfNetworkingPage() - expect (networkSetup_title).toBe(NETWORKING_PAGE_TITLE); + await installationPage.clickContinueToNetworkSetup(); + const networkconfig_title = await networkingPage.returnTitleOfNetworkingPage() + expect (networkconfig_title).toBe(NETWORKING_PAGE_TITLE); }) test('Test Installation with the Invalid Data', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix('DSPREFID') - installationPage.enterProcLib('') - installationPage.enterParmLib(9999) - installationPage.enterZis(ZIS) - installationPage.enterJclLib('BLANK') - installationPage.enterLoadLib('') - installationPage.enterAuthLoadLib('AuthLoad') - installationPage.enterAuthPluginLib('') - installationPage.clickInstallMvsDatasets(); - await page.waitForTimeout(1800000); + await installationPage.enterPrefix('DSPREFID') + await installationPage.enterProcLib('') + await installationPage.enterParmLib('test') + await installationPage.enterJclLib('BLANK') + await installationPage.enterLoadLib('') + await installationPage.enterAuthLoadLib('AuthLoad') + await installationPage.enterAuthPluginLib('') + await installationPage.clickInstallMvsDatasetsInvalid(); + await installationPage.clickCloseEditor(); const is_Continue_Button_enable = await installationPage.isContinueToNetworkSetupEnabled(); expect(is_Continue_Button_enable).toBe(false); }) test('Test Previous step', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.clickPreviousStep(); - await page.waitForTimeout(2000); + await installationPage.clickPreviousStep(); const title = await installationTypePage.getInstallationTypePageTitle(); - expect(title).toBe(INSTALLATION_TYPE_TITLE); + expect(title).toBe(DOWNLOAD_ZOWE_TITLE); }) test('Test Skip Installation Button', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - const is_Continue_Button_disable = await installationPage.isContinueToNetworkSetupDisabled(); - expect(is_Continue_Button_disable).toBe(true); - installationPage.clickSkipInstallation() - await page.waitForTimeout(2000); - const title = await networkingPage.returnTitleOfNetworkingPage(); - expect(title).toBe(NETWORKING_PAGE_TITLE); + const is_Continue_Button_disable = await installationPage.isContinueToNetworkSetupEnabled(); + expect(is_Continue_Button_disable).toBe(false); + const is_Skip_Button_disable = await installationPage.isSkipToNetworkSetupEnabled(); + expect(is_Skip_Button_disable).toBe(false); + const title = await installationTypePage.getInstallationTypePageTitle(); + expect(title).toBe(INSTALLATION_TYPE_TITLE); }) test('Test View Yaml Button', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.clickViewEditYaml() - await page.waitForTimeout(5000); - expect(installationPage.editorTitleElement).toBeTruthy(); - installationPage.clickCloseEditor() - await page.waitForTimeout(2000); - }) - - test('Test View and Submit button', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.clickViewSubmitJob() - await page.waitForTimeout(5000); + await installationPage.clickViewEditYaml() expect(installationPage.editorTitleElement).toBeTruthy(); - installationPage.clickCloseEditor() - await page.waitForTimeout(2000); + await installationPage.clickCloseEditor() }) test('Test View Job Output', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.clickViewJobOutput() - await page.waitForTimeout(5000); + await installationPage.clickViewJobOutput() expect(installationPage.editorTitleElement).toBeTruthy(); - installationPage.clickCloseEditor() - await page.waitForTimeout(2000); + await installationPage.clickCloseEditor() }) test('Test Save and Close and Resume Progress', async ({page}) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix(DATASET_PREFIX) - installationPage.enterProcLib(PROC_LIB) - installationPage.enterParmLib(PARM_LIB) - installationPage.enterAuthLoadLib(AUTH_LOAD_LIB) - installationPage.enterAuthPluginLib(AUTH_PLUGIN_LIB) - installationPage.clickSaveAndClose(); - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(5000); + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickSaveAndClose(); + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); const prefix_value = await installationPage.getPrefixValue(); const procLib_value = await installationPage.getProclibValue(); const parmLib_value = await installationPage.getParmlibValue(); const authLoadLib_value = await installationPage.getAuthLoadLibValue(); const authPluginLib_value = await installationPage.getAuthPluginLibValue(); - expect(prefix_value).toBe(DATASET_PREFIX); - expect(parmLib_value).toBe(PARM_LIB); - expect(procLib_value).toBe(PROC_LIB); - expect(authLoadLib_value).toBe(AUTH_LOAD_LIB); - expect(authPluginLib_value).toBe(AUTH_PLUGIN_LIB); + expect(prefix_value).toBe(config.DATASET_PREFIX); + expect(parmLib_value).toBe(config.PARM_LIB); + expect(procLib_value).toBe(config.PROC_LIB); + expect(authLoadLib_value).toBe(config.AUTH_LOAD_LIB); + expect(authPluginLib_value).toBe(config.AUTH_PLUGIN_LIB); }) }) \ No newline at end of file diff --git a/playwright_test/Tests/InstallationType.spec.ts b/playwright_test/Tests/InstallationType.spec.ts index 76cc395f..452ba2fe 100644 --- a/playwright_test/Tests/InstallationType.spec.ts +++ b/playwright_test/Tests/InstallationType.spec.ts @@ -4,26 +4,12 @@ import ConnectionPage from '../Pages/connection.page.ts'; import PlanningPage from '../Pages/planning.page.ts'; import InstallationTypePage from '../Pages/installationType.page.ts'; import InstallationPage from '../Pages/installation.page.ts'; +import config from '../utils/config'; let electronApp: ElectronApplication const PLANNING_TITLE = 'Before you start'; const INSTALLATION_PAGE_TITLE = 'Installation'; -const RUNTIME_DIR = process.env.ZOWE_ROOT_DIR; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR= process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR=process.env.ZOWE_LOG_DIR; -const ZOWE_WORKSPACE_DIR=process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME= process.env.JOB_NAME; -const JOB_PREFIX=process.env.JOB_PREFIX; -const JAVA_HOME=process.env.JAVA_HOME; -const NODE_HOME=process.env.NODE_HOME; -const ZOSMF_HOST=process.env.ZOSMF_HOST; -const ZOSMF_PORT=process.env.ZOSMF_PORT; -const ZOSMF_APP_ID=process.env.ZOSMF_APP_ID; -const UPLOAD_PAX_PATH= process.env.ZOWE_ROOT_DIR + test.describe('InstallationTypeTab', () => { let connectionPage: ConnectionPage; From 709dffbdcc740a4f174c03874f7fd2dbf5bfeb6f Mon Sep 17 00:00:00 2001 From: James Struga Date: Tue, 6 Aug 2024 23:30:12 -0400 Subject: [PATCH 374/455] update install type Signed-off-by: James Struga --- .../Pages/installationType.page.ts | 4 + .../Tests/InstallationType.spec.ts | 128 +++++++----------- 2 files changed, 53 insertions(+), 79 deletions(-) diff --git a/playwright_test/Pages/installationType.page.ts b/playwright_test/Pages/installationType.page.ts index 417abbd1..b7730c22 100644 --- a/playwright_test/Pages/installationType.page.ts +++ b/playwright_test/Pages/installationType.page.ts @@ -106,6 +106,10 @@ class InstallationTypePage{ async isContinueToComponentInstallationEnabled(){ return await this.continueToComponentInstallation.isEnabled() } + + async isContinueUnpaxEnabled(){ + return await this.continueUpnax.isEnabled() + } async clickAgreeLicense(){ await this.agreeLicense.click({timeout: 5000}); diff --git a/playwright_test/Tests/InstallationType.spec.ts b/playwright_test/Tests/InstallationType.spec.ts index 452ba2fe..80a67e1e 100644 --- a/playwright_test/Tests/InstallationType.spec.ts +++ b/playwright_test/Tests/InstallationType.spec.ts @@ -9,6 +9,7 @@ import config from '../utils/config'; let electronApp: ElectronApplication const PLANNING_TITLE = 'Before you start'; const INSTALLATION_PAGE_TITLE = 'Installation'; +const DOWNLOAD_ZOWE_PAX = 'Download Zowe Pax'; test.describe('InstallationTypeTab', () => { @@ -21,26 +22,31 @@ test.describe('InstallationTypeTab', () => { test.beforeEach(async ({ page }) => { test.setTimeout(900000); electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) - page= await electronApp.firstWindow() + page = await electronApp.firstWindow() connectionPage = new ConnectionPage(page); titlePage = new TitlePage(page); planningPage = new PlanningPage(page); installationTypePage = new InstallationTypePage(page); installationPage = new InstallationPage(page); titlePage.navigateToConnectionTab() - connectionPage.fillConnectionDetails(SSH_HOST,SSH_PORT,SSH_USER,SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.SubmitValidateCredential() - await page.waitForTimeout(2000); - connectionPage.clickContinueButton() - planningPage.clickSaveValidate() - await page.waitForTimeout(20000); - planningPage.fillPlanningPageWithRequiredFields(RUNTIME_DIR, ZOWE_WORKSPACE_DIR,ZOWE_EXTENSION_DIR,ZOWE_LOG_DIR,'1',JOB_NAME,JOB_PREFIX,JAVA_HOME,NODE_HOME,ZOSMF_HOST,ZOSMF_PORT,ZOSMF_APP_ID) - await page.waitForTimeout(20000); - planningPage.clickValidateLocations() - await page.waitForTimeout(20000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() }) test.afterEach(async () => { @@ -48,7 +54,6 @@ test.describe('InstallationTypeTab', () => { }) test('Test all required fields on Installation Type page', async ({ page }) => { - await page.waitForTimeout(5000) expect(installationTypePage.downloadPax).toBeTruthy() expect(installationTypePage.uploadPax).toBeTruthy() expect(installationTypePage.smpe).toBeTruthy() @@ -56,97 +61,62 @@ test.describe('InstallationTypeTab', () => { expect(installationTypePage.saveAndClose).toBeTruthy() expect(installationTypePage.previousStep).toBeTruthy() expect(installationTypePage.continueToComponentInstallation).toBeTruthy() - const is_Continue_Button_disable = await installationTypePage.isContinueToComponentInstallationDisabled(); - expect(is_Continue_Button_disable).toBe(true); + const is_continue_button_enabled = await installationTypePage.isContinueUnpaxEnabled(); + expect(is_continue_button_enabled).toBe(false); }) test('Test Downlad Zowe Pax', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectDownloadZowePax() - installationTypePage.clickLicenseAgreement() - installationTypePage.clickAgreeLicense() + await installationTypePage.selectDownloadZowePax() + await installationTypePage.clickLicenseAgreement() + await installationTypePage.clickAgreeLicense() const is_GreenCheck_Visible = await installationTypePage.isLicenseAgreementGreenCheckVisible(); expect(is_GreenCheck_Visible).toBe(true); - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); - expect(Is_Continue_Button_Enable).toBe(true); + const is_continue_button_enabled = await installationTypePage.isContinueUnpaxEnabled(); + expect(is_continue_button_enabled).toBe(true); }) + /* Need to figure out new logic test('Test Upload Zowe Pax', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.uploadZowePaxAndNavigateToInstallationPage(UPLOAD_PAX_PATH) - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); + await installationTypePage.uploadZowePaxAndNavigateToInstallationPage(UPLOAD_PAX_PATH) + const Is_Continue_Button_Enable = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable).toBe(true); - }) + })*/ - test('Test SMPE with Valid Path', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectSmpe() - installationTypePage.enterRuntimeDir(RUNTIME_DIR) - installationTypePage.clickValidateLocation() - await page.waitForTimeout(5000) - const is_GreenCheck_Visible = await installationTypePage.isValidateLocationGreenCheckVisible(); - expect(is_GreenCheck_Visible).toBe(true); - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); + test('Test SMPE ', async ({ page }) => { + await installationTypePage.selectSmpe() + const Is_Continue_Button_Enable = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable).toBe(true); }) - test('Test SMPE with Invalid Path', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectSmpe() - installationTypePage.enterRuntimeDir('ABCDE') - installationTypePage.clickValidateLocation() - await page.waitForTimeout(5000) - const is_GreenCheck_Visible = await installationTypePage.isValidateLocationGreenCheckVisible(); - expect(is_GreenCheck_Visible).toBe(false); - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); - expect(Is_Continue_Button_Enable).toBe(false); - }) - - test('Test SMPE with Empty Path', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectSmpe() - installationTypePage.enterRuntimeDir('') - installationTypePage.clickValidateLocation() - await page.waitForTimeout(5000) - const is_GreenCheck_Visible = await installationTypePage.isValidateLocationGreenCheckVisible(); - expect(is_GreenCheck_Visible).toBe(false); - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); - expect(Is_Continue_Button_Enable).toBe(false); - }) - test('Test Previous step', async ({ page }) => { - installationTypePage.clickPreviousStep(); - await page.waitForTimeout(2000); + await installationTypePage.clickPreviousStep(); const title = await planningPage.getPlanningPageTitle(); expect(title).toBe(PLANNING_TITLE); }) test('Test Continue To Components Installation Button', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectDownloadZowePax() - installationTypePage.clickLicenseAgreement() - installationTypePage.clickAgreeLicense() - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); + await installationTypePage.selectDownloadZowePax() + await installationTypePage.clickLicenseAgreement() + await installationTypePage.clickAgreeLicense() + const Is_Continue_Button_Enable = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable).toBe(true); - installationTypePage.clickContinueToInstallation() + await installationTypePage.continueToUnpax() const title = await installationPage.getInstallationPageTitle(); - expect(title).toBe(INSTALLATION_PAGE_TITLE); + expect(title).toBe(DOWNLOAD_ZOWE_PAX); }) test('Test Save and Close and Resume Progress', async ({page}) => { - await page.waitForTimeout(5000) - installationTypePage.selectDownloadZowePax() - installationTypePage.clickLicenseAgreement() - installationTypePage.clickAgreeLicense() - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); + await installationTypePage.selectDownloadZowePax() + await installationTypePage.clickLicenseAgreement() + await installationTypePage.clickAgreeLicense() + const Is_Continue_Button_Enable = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable).toBe(true); - installationTypePage.clickSaveAndClose(); - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(5000); + await installationTypePage.clickSaveAndClose(); + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); const is_GreenCheck_Visible = await installationTypePage.isLicenseAgreementGreenCheckVisible(); expect(is_GreenCheck_Visible).toBe(true); - const Is_Continue_Button_Enable_After_Save = await installationTypePage.isContinueToComponentInstallationEnabled(); + const Is_Continue_Button_Enable_After_Save = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable_After_Save).toBe(true); }) }) \ No newline at end of file From 2e233f068e1e7e15b9e144bed989bba491e56a7c Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 7 Aug 2024 12:37:40 +0530 Subject: [PATCH 375/455] Adding the utility functions Signed-off-by: Sakshi Bobade --- .vscode/launch.json | 13 ++++++++++ src/actions/InstallationHandler.ts | 3 ++- src/services/ResolveRef.ts | 40 ++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .vscode/launch.json create mode 100644 src/services/ResolveRef.ts diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..1ae7ee52 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Electron: Renderer", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000/main_window", // Change this to the URL your Electron app serves on + "webRoot": "${workspaceFolder}/src/services/ResolveRef", + "timeout": 30000 + } + ], +} diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 439638c4..4d57e3fd 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -19,7 +19,7 @@ import * as fs from 'fs'; import { ConfigurationStore } from '../storage/ConfigurationStore'; import { InstallationArgs } from '../types/stateInterfaces'; import { FALLBACK_SCHEMA, deepMerge } from '../renderer/components/common/Utils'; - +import { updateSchemaReferences } from '../services/ResolveRef'; //AJV did not like the regex in our current schema const zoweDatasetMemberRegexFixed = { @@ -157,6 +157,7 @@ class Installation { let yamlSchema = JSON.parse(readPaxYamlAndSchema.details.yamlSchema); const serverCommon = JSON.parse(readPaxYamlAndSchema.details.serverCommon); if(yamlSchema && serverCommon){ + updateSchemaReferences(yamlSchema, serverCommon); yamlSchema.additionalProperties = true; yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = zoweDatasetMemberRegexFixed; yamlSchema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverCommon.$defs.path; diff --git a/src/services/ResolveRef.ts b/src/services/ResolveRef.ts new file mode 100644 index 00000000..114eaf40 --- /dev/null +++ b/src/services/ResolveRef.ts @@ -0,0 +1,40 @@ +export const updateSchemaReferences = (schema: any, serverCommon: any): void => { + + const traverseAndUpdate = (node: any) => { + if (node !== null && typeof node === "object") { + for (const key in node) { + console.log("-------------key: ", key); + if (key === "$ref" && typeof node[key] === "string") { + try { + const refValue = resolveRef(node[key]); + console.log("---------refValue: ", refValue); + Object.assign(node, refValue); + delete node['$ref']; + } catch(error){ + console.error("Error resolving reference:", error.message); + } + } else { + traverseAndUpdate(node[key]); // Pass down the node[key] for recursive traversal + } + } + } + } + + const resolveRef = (ref: string) => { + const refPath = ref.replace('#/$defs/', '').split('/'); + let result = serverCommon.$defs; + for (const part of refPath) { + console.log('---------------resolve[part]: ', result[part]); + if (result[part] !== undefined) { + result = result[part]; + } else { + console.log('-------------error: not found: ', result[part]); + throw new Error(`Reference ${ref} not found in serverCommon`); + } + } + return result; + } + + traverseAndUpdate(schema); +} + \ No newline at end of file From f6c6ecdc2355e9daef67783fb6e3371fa1d564da Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 7 Aug 2024 18:06:01 +0530 Subject: [PATCH 376/455] Updating the json forms to be stateless --- src/renderer/components/common/JsonForms.tsx | 53 +++++++++----------- src/renderer/components/stages/Security.tsx | 2 +- 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/src/renderer/components/common/JsonForms.tsx b/src/renderer/components/common/JsonForms.tsx index fc2dbd23..18c38659 100644 --- a/src/renderer/components/common/JsonForms.tsx +++ b/src/renderer/components/common/JsonForms.tsx @@ -105,47 +105,40 @@ const conditionalSchema = (schema: any, formData: any, prop: any): boolean=> { return false; } +const getDefaultFormData = (schema: any, formData: any) => { + if (schema && schema.properties) { + const defaultFormData = { ...formData }; + Object.keys(schema.properties).forEach((property) => { + if (schema.properties[property].type && schema.properties[property].default !== undefined || schema.properties[property].type === 'object') { + // If the property is an object, recursively set default values + if (schema.properties[property].type === 'object') { + defaultFormData[property] = getDefaultFormData( + schema.properties[property], + defaultFormData[property] || {} + ); + } else { + defaultFormData[property] = schema.properties[property].default; + } + } + }); + return defaultFormData; + } + return null; +}; + export default function JsonForm(props: any) { const {schema, onChange, formData} = props; const isFormDataEmpty = formData === null || formData === undefined || Object.keys(formData).length < 1; - useEffect(() => { - if (isFormDataEmpty) { - const defaultFormData = getDefaultFormData(schema, formData); - onChange(defaultFormData); - } - }, [isFormDataEmpty, schema, onChange]); - - const getDefaultFormData = (schema: any, formData: any) => { - if (schema && schema.properties) { - const defaultFormData = { ...formData }; - Object.keys(schema.properties).forEach((property) => { - if (schema.properties[property].type && schema.properties[property].default !== undefined || schema.properties[property].type === 'object') { - // If the property is an object, recursively set default values - if (schema.properties[property].type === 'object') { - defaultFormData[property] = getDefaultFormData( - schema.properties[property], - defaultFormData[property] || {} - ); - } else { - defaultFormData[property] = schema.properties[property].default; - } - } - }); - return defaultFormData; - } - return null; - }; - - // const [formState, setFormState] = useState(isFormDataEmpty ? getDefaultFormData(schema, {}) : formData); + const formDataToUse = isFormDataEmpty ? getDefaultFormData(schema, {}) : formData; return ( { } const handleFormChange = (data: any) => { - let newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security) : (data?.zowe?.setup?.security ? data?.zowe?.setup?.security : data); + let newData = (init && setupYaml) ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security) : (data?.zowe?.setup?.security ? data?.zowe?.setup?.security : data); setInit(false); if (newData) { From 15c0975fd1fd368f361c449c0fe180b8f49fda2e Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 7 Aug 2024 20:09:19 +0530 Subject: [PATCH 377/455] Updating the validation for the datsets --- .../stages/installation/Installation.tsx | 47 ++++++++----------- src/services/DatasetValidation.ts | 15 ++++++ 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index fdca275e..2e96d9f8 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -29,7 +29,7 @@ import { getStageDetails, getSubStageDetails } from "../../../../services/StageD import { getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments, datasetInstallationStatus, isInitComplete } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; import eventDispatcher from '../../../../services/eventDispatcher'; -import { isDatasetValid } from '../../../../services/DatasetValidation'; +import { validateDatasetIterator } from '../../../../services/DatasetValidation'; import ErrorIcon from '@mui/icons-material/Error'; const Installation = () => { @@ -56,8 +56,6 @@ const Installation = () => { const [showProgress, setShowProgress] = useState(getProgress('datasetInstallationStatus')); const [isFormInit, setIsFormInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); - const [isFormValid, setIsFormValid] = useState(false); - const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); const [mvsDatasetInitProgress, setMvsDatasetInitProgress] = useState(getDatasetInstallationState()); const [stateUpdated, setStateUpdated] = useState(false); @@ -70,6 +68,8 @@ const Installation = () => { const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(setupSchema)); + const datasetPropertiesCount = setupSchema ? Object.keys(setupSchema.properties).length : 0; + useEffect(() => { dispatch(setInitializationStatus(isInitComplete())); if(getProgress("datasetInstallationStatus")) { @@ -169,6 +169,7 @@ const Installation = () => { return () => { dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); + alertEmitter.emit('hideAlert'); } }, []); @@ -251,6 +252,7 @@ const Installation = () => { return; } + alertEmitter.emit('hideAlert'); setInitClicked(true); updateProgress(false); event.preventDefault(); @@ -306,30 +308,25 @@ const Installation = () => { initMVS: true }) updateProgress(true); - } + } } const validateDatasets = () => { - for (const key of Object.keys(setupYaml)) { - let value = setupYaml[key]; - if (typeof value === 'object' && value !== null) { - const firstKey = Object.keys(value)[0]; - value = value[firstKey]; - } - - const isValid = isDatasetValid(value); - if (!isValid) { - setIsFormValid(false); - setFormError(`The dataset '${key.toUpperCase()}' is invalid. Please verify the dataset name and try again.`); - return false; - } + if(Object.keys(setupYaml).length < datasetPropertiesCount) { + const errorMessage = `One or more required dataset values are missing. Please ensure all fields are filled in.`; + alertEmitter.emit('showAlert', errorMessage, 'error'); + return false; } - if(Object.keys(setupYaml).length < 8) { - setIsFormValid(false); - setFormError(`One or more required dataset values are missing. Please ensure all fields are filled in.`); + + const {isValid, key} = validateDatasetIterator(setupYaml); + + if (!isValid) { + const errorMessage = `The dataset '${key.toUpperCase()}' is invalid. Please verify the dataset name and try again.`; + alertEmitter.emit('showAlert', errorMessage, 'error'); return false; } + return true; }; @@ -367,8 +364,9 @@ const Installation = () => { } const setStageConfig = (isValid: boolean, errorMsg: string, data: any) => { - setIsFormValid(isValid); - setFormError(errorMsg); + if(!isValid) { + alertEmitter.emit('showAlert', errorMsg, 'error'); + } setSetupYaml(data); } @@ -391,11 +389,6 @@ const Installation = () => { dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> - {!isFormValid && formError && -
- - {formError} -
}
{!showProgress ? diff --git a/src/services/DatasetValidation.ts b/src/services/DatasetValidation.ts index e3ec5926..41dd8334 100644 --- a/src/services/DatasetValidation.ts +++ b/src/services/DatasetValidation.ts @@ -8,6 +8,21 @@ * Copyright Contributors to the Zowe Project. */ +export const validateDatasetIterator = (schema: any) : { isValid: boolean, key: string } => { + for (const key of Object.keys(schema)) { + let value = schema[key]; + if (typeof value === 'object' && value !== null) { + const result = validateDatasetIterator(value); + if(!result.isValid) { + return {isValid: false, key: key}; + } + } else if(!isDatasetValid(value)) { + return {isValid: false, key: key}; + } + } + return {isValid: true, key: ''}; +} + export const isDatasetValid = (dsName: string) : boolean => { const DsNamePattern = "^[a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}([.][a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}){0,21}$"; const regEx = new RegExp(DsNamePattern); From ca25fed4797a27b29b919bcbdc840307e30d33ce Mon Sep 17 00:00:00 2001 From: James Struga Date: Thu, 8 Aug 2024 18:04:29 -0400 Subject: [PATCH 378/455] fix newtork and planning page Signed-off-by: James Struga --- playwright_test/Pages/networking.page.ts | 140 ++++++++-------- playwright_test/Pages/planning.page.ts | 29 +++- playwright_test/Tests/Networking.spec.ts | 182 ++++++++------------- playwright_test/Tests/Planning.spec.ts | 199 +++++++---------------- playwright_test/utils/config.ts | 6 +- 5 files changed, 224 insertions(+), 332 deletions(-) diff --git a/playwright_test/Pages/networking.page.ts b/playwright_test/Pages/networking.page.ts index 58294fdc..92c9fe67 100644 --- a/playwright_test/Pages/networking.page.ts +++ b/playwright_test/Pages/networking.page.ts @@ -22,8 +22,6 @@ class NetworkingPage{ CONFPAGE_TITLE: Locator; continueToComponentInstallation: Locator; - - constructor(page: Page) { this.page = page; this.addDomainField = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/p[1]/button'); @@ -37,7 +35,7 @@ class NetworkingPage{ this.metricService = page.locator('//strong[text()="metrics-service"]'); this.metricServiceEnbaled = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[2]'); this.metricServiceDebug = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[1]'); - this.metricServicePort = page.locator('//html/body/div/div[2]/div/div[4]/div/form/div/div[2]/div[4]/div/input'); + this.metricServicePort = page.locator('input[id=":rq:"]'); this.zss = page.getByLabel('zss'); this.zssTls = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[3]'); this.zssPort = page.locator('//*[@id=":r1l:-label"]'); @@ -80,8 +78,9 @@ class NetworkingPage{ this.discoveryDebug = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[22]'); this.discoveryEnabled = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[23]'); this.discoveryPort = page.locator('//*[@id=":r25:-label"]'); - - this.metricService_debug_checkbox = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[1]/span[1]/input'); + this.explorerUSS_debug_checkbox = page.locator('//*[@id="container-box-id"]/form/div/div[2]/div[4]/div/div[4]/div[1]/label/span[1]/input'); + this.app_server_debug = page.locator('//*[@id="container-box-id"]/form/div/div[2]/div[4]/div/div[11]/div[1]/label/span[1]/input'); + this.metricService_debug_checkbox = page.locator('//*[@id="container-box-id"]/form/div/div[2]/div[4]/div/div[1]/div[1]/label/span[1]/input'); this.metricService_enabled_checkbox = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[2]/span[1]/input'); this.deleteDomainName = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/div[2]/button'); this.readYaml = page.locator('div.view-lines'); @@ -91,13 +90,13 @@ class NetworkingPage{ this.licenseAgreement = page.locator('//button[contains(text(), "License Agreement")]'); this.acceptLicense = page.locator('//html/body/div[2]/div[3]/div/div[2]/button[1]'); this.continueToComponentInstallation = page.locator('//button[contains(text(), "Continue to Components Installation")]'); - this.view_yaml = page.locator('//button[contains(text(),"View Yaml")]'); + this.view_yaml = page.locator('//button[contains(text(), "View/Edit Yaml")]'); this.viewAndSubmitJob = page.locator('//button[contains(text(), "Preview Job")]'); this.view_job_output = page.locator('//button[contains(text(), "Submit Job")]'); this.save_and_close = page.locator('//button[contains(text(),"Save & close")]'); this.previous_step = page.locator('//button[contains(text(),"Previous step")]'); this.skip_button = page.locator('//button[contains(text(),"Skip")]'); - this.close_button = page.locator('//button[contains(text(), "Close")]'); + this.close_button = page.locator("//button[text()='Close']"); this.APFAUTH_TITLE = page.locator('//div[text()="APF Authorize Load Libraries"]'); this.continue_ReviewSelector = page.locator('//button[contains(text(), "Continue to APF Auth Setup")]'); this.installationTitle = page.locator('//div[text()="Installation"]'); @@ -115,30 +114,24 @@ class NetworkingPage{ return networking_title; } - async fillExternalDomainPort(port:string){ + async fillExternalDomainPort(port: number){ await this.externalPort.fill(port, { timeout: 10000 }) } - async fillMetricServicePort(port:string){ - // Scroll down a bit - await this.page.evaluate(() => { - window.scrollBy(0, 200); - }); - // Add a wait after scrolling - await this.page.waitForTimeout(5000); - await this.metricServicePort.fill(port, { timeout: 10000 }) + async fillMetricServicePort(port: string){ + await this.metricServicePort.waitFor({ state: 'visible', timeout: 10000 }); + await this.metricServicePort.fill(port, { timeout: 10000 }); } - async get_metricServiceport_value(){ - const value = await this.metricServicePort.inputValue(); - return value; + async get_metricServiceport_value(): Promise { + return await this.metricServicePort.inputValue(); } async fillExternalDomainName(externalDomainName: string){ await this.domainName.fill(externalDomainName, { timeout: 10000 }); } - async fillexternal_domainvalues(externalDomainName:string, port: string){ + async fillexternal_domainvalues(externalDomainName:string, port: number){ await this.fillExternalDomainName(externalDomainName, { timeout: 10000 }); await this.fillExternalDomainPort(port, { timeout: 10000 }) } @@ -151,43 +144,62 @@ class NetworkingPage{ return value; } - async click_checkBox(n:string){ - const xpathLocator = `//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[${n}]/span[1]/input`; - - const checkbox = await this.page.waitForSelector(xpathLocator, { state: 'visible' }); - - if (checkbox) { - const isChecked = await checkbox.evaluate((input) => input.checked); - console.log('Is checkbox checked:', isChecked); - - if (!isChecked) { - await checkbox.click(); - console.log('Checkbox clicked'); - } else { - console.log('Checkbox is already checked'); - } - } else { - console.log('Checkbox not found'); - } -} - - - async isCheckboxCheckedAndBlue(nthChild: string){ - const xpathLocator = `//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[${nthChild}]/span[1]/input`; - - const checkbox = await this.page.waitForSelector(xpathLocator); - - if (checkbox) { - // Check if the checkbox is clicked - const isChecked = await checkbox.evaluate((input) => input.checked); - console.log('Is checkbox clicked:', isChecked); - return isChecked; - } else { - console.log('Checkbox not found'); + async click_checkBox(xpath: string): Promise { + //const html = await this.page.content(); // Get the HTML content + //console.log(html); + try { + const checkbox = await this.page.waitForSelector(xpath, { state: 'visible' }); + const isChecked = await checkbox.evaluate((input) => input.checked); + if (!isChecked) { + await checkbox.click(); + } + } catch (error) { + console.error(`Error checking checkbox with XPath "${xpath}":`, error); return false; - } + } + } + + + + async isCheckboxCheckedAndBlue(xpath: string): Promise{ + try{ + const checkbox = await this.page.waitForSelector(xpath); + if (checkbox) { + const isChecked = await checkbox.evaluate((input) => input.checked); + return isChecked; + } else { + return false; + } + } catch (error){ + console.log('Checkbox not found'); + return false; + + } + } + + async isMetricsServiceDebugChecked(): Promise { + return await this.isCheckboxCheckedAndBlue(this.metricService_debug_checkbox); + } + + async clickMetricsServiceDebug(): Promise { + await this.click_checkBox(this.metricService_debug_checkbox); + } + + async isExplorerUssDebugChecked(): Promise { + return await this.isCheckboxCheckedAndBlue(this.explorerUSS_debug_checkbox); } + async isAppServerDebugChecked(): Promise { + return await this.isCheckboxCheckedAndBlue(this.app_server_debug); + } + + async clickExplorerUssDebug(): Promise { + await this.click_checkBox(this.explorerUSS_debug_checkbox); + } + + async clickAppServerDebug(): Promise { + await this.click_checkBox(this.app_server_debug); + } async delete_DomainNameField(){ await this.deleteDomainName.click(); @@ -244,7 +256,6 @@ class NetworkingPage{ let allText = ''; while (true) { - // Extract text from all div.view-line elements const newText = await this.page.evaluate(() => { const viewLines = document.querySelectorAll('.view-lines .view-line'); let text = ''; @@ -253,36 +264,21 @@ class NetworkingPage{ }); return text; }); - - // Append the new text to the existing text allText += newText; - console.log(allText) - - // Scroll a little to load more content await this.page.evaluate(() => { const editor = document.querySelector('.monaco-scrollable-element.editor-scrollable.vs'); - editor.scrollTop += 100; // Adjust the scroll amount as needed + editor.scrollTop += 100; }); - - // Wait for a brief moment for new content to load - await this.page.waitForTimeout(1000); // Adjust timeout as needed - - // Get the current scroll height + await this.page.waitForTimeout(1000); const currentScrollHeight = await this.page.evaluate(() => { const editor = document.querySelector('.monaco-scrollable-element.editor-scrollable.vs'); return editor.scrollHeight; }); - - // If the scroll height hasn't changed since the last iteration, we've reached the end if (currentScrollHeight === previousScrollHeight) { break; } - - // Update the previous scroll height for the next iteration previousScrollHeight = currentScrollHeight; } - - console.log('All text:', allText); return allText; } diff --git a/playwright_test/Pages/planning.page.ts b/playwright_test/Pages/planning.page.ts index 5fcac658..31757b92 100644 --- a/playwright_test/Pages/planning.page.ts +++ b/playwright_test/Pages/planning.page.ts @@ -82,13 +82,17 @@ class PlanningPage{ } async clickSaveAndValidate(){ - await this.page.waitForTimeout(1000); await this.saveAndValidate.click({ timeout: 5000 }); } - async isSaveAndValidateGreenCheckVisible(){ - await this.page.waitForTimeout(1000); - return await this.saveAndValidateGreenCheck.isVisible({ timeout: 5000 }); + async isSaveAndValidateGreenCheckVisible(): Promise { + try { + await this.saveAndValidateGreenCheck.waitFor({ state: 'visible', timeout: 10000 }); + return true; + } catch (error) { + console.error('Error checking visibility:', error); + return false; + } } async getErrorMessage(){ @@ -197,14 +201,19 @@ class PlanningPage{ await this.isContinueToInstallationEnabled() } - async isValidateLocationsGreenCheckVisible(){ - await this.page.waitForTimeout(500); - return await this.ValidateLocationsGreenCheck.isVisible(); + async isValidateLocationsGreenCheckVisible(): Promise { + try { + await this.ValidateLocationsGreenCheck.waitFor({ state: 'visible', timeout: 15000 }); + return true; + } catch (error) { + console.error('Error checking visibility:', error); + return false; + } } + async clickSaveAndClose(){ - await this.page.waitForTimeout(500); - await this.saveAndClose.click({timeout: 2000}); + await this.saveAndClose.click({timeout: 15000}); } async clickPreviousStep(){ @@ -248,6 +257,8 @@ class PlanningPage{ await this.saveAndValidate.click(); await this.page.waitForTimeout(500); } + + async fillPlanningPageWithRequiredFields(runtimeDir: any, workspaceDir: any, extensionDir: any, logDir: any, profileIdentifier:any, jobPrefix:any,jobname:any, javaLocation:any,nodejsLocation:any,zOSMFHost:any,zOSMFPort:any,zOSMFAppID:any){ await this.clickSaveValidate(); await this.enterRuntimeDir(runtimeDir); diff --git a/playwright_test/Tests/Networking.spec.ts b/playwright_test/Tests/Networking.spec.ts index ca101094..67921daf 100644 --- a/playwright_test/Tests/Networking.spec.ts +++ b/playwright_test/Tests/Networking.spec.ts @@ -4,9 +4,12 @@ import ApfAuthPage from '../Pages/ApfAuth.page'; import { prepareEnvironment } from '../prepare.js'; import TitlePage from '../Pages/title.page'; import ConnectionPage from '../Pages/connection.page'; +import InstallationPage from '../Pages/installation.page.ts'; +import InstallationTypePage from '../Pages/installationType.page.ts'; import PlanningPage from '../Pages/planning.page'; import NetworkingPage from '../Pages/networking.page'; import path from 'path'; +import config from '../utils/config'; let page: Page; @@ -14,27 +17,11 @@ let electronApp: ElectronApplication const NETWORKING_TITLE = 'Networking'; const APFAUTH_TITLE = 'APF Authorize Load Libraries'; const INSTALLATION_TITLE = 'Installation'; -const DOMAIN_NAME = process.env.DOMAIN_NAME; -const EXTERNAL_PORT = process.env.EXTERNAL_PORT; -const ZOWE_ROOT_DIR = process.env.ZOWE_ROOT_DIR; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR= process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR=process.env.ZOWE_LOG_DIR; -const ZOWE_WORKSPACE_DIR=process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME= process.env.JOB_NAME; -const JOB_PREFIX=process.env.JOB_PREFIX; -const JAVA_HOME=process.env.JAVA_HOME; -const NODE_HOME=process.env.NODE_HOME; -const ZOSMF_HOST=process.env.ZOSMF_HOST; -const ZOSMF_PORT=process.env.ZOSMF_PORT; -const ZOSMF_APP_ID=process.env.ZOSMF_APP_ID; + test.beforeAll(async () => { try { - await prepareEnvironment({ install: true, remove: false }); + await prepareEnvironment({ install: false, remove: false }); } catch (error) { console.error('Error during environment preparation:', error); process.exit(1); @@ -47,30 +34,51 @@ test.describe('networkingTab', () => { let securityPage : SecurityPage; let planningPage : PlanningPage; let networkingPage : NetworkingPage; + let installationTypePage : InstallationTypePage; + let installationPage : InstallationPage; test.beforeEach(async ({ page }) => { test.setTimeout(900000); electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) - page= await electronApp.firstWindow() + page = await electronApp.firstWindow() connectionPage = new ConnectionPage(page); networkingPage = new NetworkingPage(page); titlePage = new TitlePage(page); planningPage = new PlanningPage(page); + installationPage = new InstallationPage(page); + installationTypePage = new InstallationTypePage(page); titlePage.navigateToConnectionTab() - connectionPage.fillConnectionDetails(SSH_HOST,SSH_PORT,SSH_USER,SSH_PASSWD) - connectionPage.SubmitValidateCredential() - await page.waitForTimeout(5000); - connectionPage.clickContinueButton() - planningPage.clickSaveValidate() - await page.waitForTimeout(20000); - planningPage.fillPlanningPageWithRequiredFields(ZOWE_ROOT_DIR, ZOWE_WORKSPACE_DIR,ZOWE_EXTENSION_DIR,ZOWE_LOG_DIR,'1',JOB_NAME,JOB_PREFIX,JAVA_HOME,NODE_HOME,ZOSMF_HOST,ZOSMF_PORT,ZOSMF_APP_ID) - await page.waitForTimeout(20000); - planningPage.clickValidateLocations() - await page.waitForTimeout(20000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); - networkingPage.movetoNetworkingPage() - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() + await installationTypePage.downloadZowePaxAndNavigateToInstallationPage() + await installationTypePage.continueToUnpax() + await installationTypePage.skipUnpax() + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickInstallMvsDatasets(); + await installationPage.clickContinueToNetworkSetup(); }) test.afterEach(async () => { @@ -78,12 +86,11 @@ test.describe('networkingTab', () => { }) test('test title of page', async ({ page }) => { - await page.waitForTimeout(5000); const title = await networkingPage.returnTitleOfNetworkingPage(); expect(title).toBe(NETWORKING_TITLE); }) + test('test all required fields', async ({ page }) => { - await page.waitForTimeout(5000); await expect(networkingPage.externalDomains).toBeTruthy() await expect(networkingPage.externalPort).toBeTruthy() await expect(networkingPage.components).toBeTruthy() @@ -101,135 +108,86 @@ test.describe('networkingTab', () => { await expect(networkingPage.appServer).toBeTruthy() await expect(networkingPage.cachingService).toBeTruthy() await expect(networkingPage.discovery).toBeTruthy() - }) test('test external domain field', async ({ page }) => { - await page.waitForTimeout(5000); - await networkingPage.fillexternal_domainvalues(DOMAIN_NAME,EXTERNAL_PORT); - await page.waitForTimeout(5000); + await networkingPage.fillexternal_domainvalues(config.DOMAIN_NAME, config.EXTERNAL_PORT); const port = await networkingPage.get_externalDomainport_value(); const domainName = await networkingPage.get_externalDomainName_value(); - console.log(port,domainName) - expect(port).toBe(DOMAIN_NAME); - expect(domainName).toBe(EXTERNAL_PORT); - await page.waitForTimeout(5000); + expect(port).toBe(config.EXTERNAL_PORT); + expect(domainName).toBe(config.DOMAIN_NAME); }) test('test deleting domain name field', async ({ page }) => { await networkingPage.delete_DomainNameField(); - await page.waitForTimeout(5000); const isDomainNameVisible = await networkingPage.domainName.isVisible(); expect(isDomainNameVisible).toBeFalsy() }) test('test add more domain name field', async ({ page }) => { - await page.waitForTimeout(5000); await networkingPage.add_DomainNameField(); - await page.waitForTimeout(5000); await expect(networkingPage.domainName).toBeTruthy() }) + test('test add special char in other port no', async ({ page }) => { - await page.waitForTimeout(5000); + const originalValue = await networkingPage.get_metricServiceport_value(); await networkingPage.fillMetricServicePort('*^%$^&'); - await page.waitForTimeout(5000); - const port = await networkingPage.get_metricServiceport_value(); - expect(port).toBe(''); + const newValue = await networkingPage.get_metricServiceport_value(); + expect(newValue).toBe(originalValue); }) - test('test enabled debug component', async ({ page }) => { - await page.waitForTimeout(5000); - await networkingPage.click_checkBox('1'); - await networkingPage.click_checkBox('2'); - await page.waitForTimeout(10000); - const isEnabled = await networkingPage.isCheckboxCheckedAndBlue('2'); - const isDebug = await networkingPage.isCheckboxCheckedAndBlue('1'); - expect(isEnabled).toBe(true); - expect(isDebug).toBe(true); + test('test enabled metric service debug', async ({ page }) => { + const beforeClick = await networkingPage.isMetricsServiceDebugChecked(); + expect(beforeClick).toBe(false); + await networkingPage.clickMetricsServiceDebug(); + const afterClick = await networkingPage.isMetricsServiceDebugChecked(); + expect(afterClick).toBe(true); }) test('Test view yaml button', async ({ page }) => { - await page.waitForTimeout(7000); - networkingPage.viewYaml() - await page.waitForTimeout(5000); + await networkingPage.viewYaml() await expect(networkingPage.editor_title_element).toBeTruthy(); - await page.waitForTimeout(5000); - networkingPage.closeButton() - await page.waitForTimeout(2000); - }) - - test('Test view and submit button', async ({ page }) => { - await page.waitForTimeout(5000); - networkingPage.click_viewAndSubmitJob() - await page.waitForTimeout(5000); - await expect(networkingPage.editor_title_element).toBeTruthy() - networkingPage.closeButton() - await page.waitForTimeout(2000); + await networkingPage.closeButton() }) - test('Test view job', async ({ page }) => { - await page.waitForTimeout(5000); - networkingPage.click_previewJob() - await page.waitForTimeout(5000); - await expect(networkingPage.editor_title_element).toBeTruthy() - networkingPage.closeButton() - await page.waitForTimeout(5000); - }) - test('Test save and close', async ({ page }) => { - await page.waitForTimeout(5000); - await networkingPage.fillexternal_domainvalues(DOMAIN_NAME,EXTERNAL_PORT); - await page.waitForTimeout(5000); - networkingPage.click_saveAndClose() - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(15000); + await networkingPage.fillexternal_domainvalues(config.DOMAIN_NAME, config.EXTERNAL_PORT); + await networkingPage.click_saveAndClose() + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); const title = await networkingPage.returnTitleOfNetworkingPage(); expect(title).toBe(NETWORKING_TITLE); const port = await networkingPage.get_externalDomainport_value(); const domainName = await networkingPage.get_externalDomainName_value(); - expect(port).toBe(EXTERNAL_PORT); - expect(domainName).toBe(DOMAIN_NAME); - await page.waitForTimeout(5000); - + expect(port).toBe(config.EXTERNAL_PORT); + expect(domainName).toBe(config.DOMAIN_NAME); }) test('click Previous step button', async ({ page }) => { - await page.waitForTimeout(5000); - const title = await networkingPage.returnTitleOfPrevPage(); - expect(title).toBe(INSTALLATION_TITLE); - }) - test('Test previous button is enabled', async ({ page }) => { const is_prevButtonEnable = await networkingPage.isPreviousButtonEnable(); expect(is_prevButtonEnable).toBe(true); - await page.waitForTimeout(2000); + const title = await networkingPage.returnTitleOfPrevPage(); + expect(title).toBe(INSTALLATION_TITLE); }) test('Test continue to APF Auth button is disable', async ({ page }) => { - await page.waitForTimeout(2000); const is_ContinueButtonDisable = await networkingPage.isContinueButtonDisable(); expect(is_ContinueButtonDisable).toBe(true); - await page.waitForTimeout(2000); }) + test('Test Skip networking button is enable', async ({ page }) => { - await page.waitForTimeout(2000); const isLaunchConfigEnable = await networkingPage.is_skipNetworkingButtonEnable(); expect(isLaunchConfigEnable).toBe(true); - await page.waitForTimeout(2000); }) test('Test yaml should be updated', async ({ page }) => { - await page.waitForTimeout(5000); - await networkingPage.fillexternal_domainvalues(DOMAIN_NAME,EXTERNAL_PORT); - await page.waitForTimeout(5000); + await networkingPage.fillexternal_domainvalues(config.DOMAIN_NAME, config.EXTERNAL_PORT); await networkingPage.viewYaml(); - await page.waitForTimeout(10000); await expect(networkingPage.editor_title_element).toBeTruthy(); - await page.waitForTimeout(5000); const yaml = await networkingPage.read_yaml(); - await page.waitForTimeout(5000); - expect(yaml).toContain(DOMAIN_NAME); - expect(yaml).toContain(EXTERNAL_PORT); + expect(yaml).toContain(config.DOMAIN_NAME); + expect(yaml).toContain(config.EXTERNAL_PORT); }) }); diff --git a/playwright_test/Tests/Planning.spec.ts b/playwright_test/Tests/Planning.spec.ts index 61ed9f54..f05de8d6 100644 --- a/playwright_test/Tests/Planning.spec.ts +++ b/playwright_test/Tests/Planning.spec.ts @@ -5,31 +5,15 @@ import PlanningPage from '../Pages/planning.page.ts'; import InstallationTypePage from '../Pages/installationType.page.ts'; import path from 'path'; let page: Page; +import config from '../utils/config'; let electronApp: ElectronApplication const CONNECTION_PAGE_TITLE = 'Connection'; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; const PLANNING_TITLE = 'Before you start'; const INSTALLATION_TYPE_TITLE = 'Installation Type'; -const JOB_STATEMENT = "//HELLOJOB JOB 'HELLO, WORLD!',CLASS=A,MSGCLASS=A\n//STEP01 EXEC PGM=IEFBR14\n//SYSPRINT DD SYSOUT=A\n//SYSIN DD DUMMY"; const INVALID_JOB_STATEMENT = "//HELLOJOB JOB 'HELLO, WORLD!',CLASS=A,MSGCLASS"; -const ERROR_MESSAGE = "Failed to verify job statement"; -const RUNTIME_DIR = process.env.ZOWE_ROOT_DIR; -const WORKSPACE_DIR = process.env.ZOWE_WORKSPACE_DIR; -const LOG_DIR = process.env.ZOWE_LOG_DIR; -const EXTENSIONS_DIR = process.env.ZOWE_EXTENSION_DIR; -const RBAC_IDENTIFIER = '1'; -const JOB_NAME = process.env.JOB_NAME; -const JOB_PREFIX = process.env.JOB_PREFIX; -const COOKIE_IDENTIFIER = '1'; -const JAVA_LOCATION = process.env.JAVA_HOME; -const NODEJS_LOCATION = process.env.NODE_HOME; -const ZOSMF_HOST=process.env.ZOSMF_HOST; -const ZOSMF_PORT=process.env.ZOSMF_PORT; -const ZOSMF_APP_ID=process.env.ZOSMF_APP_ID; +const ERROR_MESSAGE = "Failed to verify job statement STMT NO. MESSAGE\n 1 IEFC006I POSITIONAL PARAMETERS MUST BE SPECIFIED BEFORE KEYWORD PARAMETERS"; +const EMPTY_ERROR = "Error invoking remote method 'get-env-vars': Error: Failed to submit jcl, job id not found"; test.describe('PlanningTab', () => { let connectionPage: ConnectionPage; @@ -40,18 +24,15 @@ test.describe('PlanningTab', () => { test.beforeEach(async () => { test.setTimeout(900000); electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) - page= await electronApp.firstWindow() + page = await electronApp.firstWindow() connectionPage = new ConnectionPage(page); titlePage = new TitlePage(page); planningPage = new PlanningPage(page); installationTypePage = new InstallationTypePage(page); titlePage.navigateToConnectionTab(); - connectionPage.fillConnectionDetails(SSH_HOST,SSH_PORT,SSH_USER,SSH_PASSWD) - connectionPage.SubmitValidateCredential(); - await page.waitForTimeout(5000); - connectionPage.clickContinueButton(); - await page.waitForTimeout(3000); - + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); }) test.afterEach(async () => { @@ -66,17 +47,14 @@ test.describe('PlanningTab', () => { }) test('Test Valid Job Statement and Save Validate', async () => { - planningPage.enterJobStatement(JOB_STATEMENT); - planningPage.clickSaveAndValidate(); - await page.waitForTimeout(20000); + await planningPage.clickSaveValidate(); const isGreen_check_visible = await planningPage.isSaveAndValidateGreenCheckVisible(); expect(isGreen_check_visible).toBe(true); }) test('Test Invalid Job Statement and Save Validate', async () => { - planningPage.enterJobStatement(INVALID_JOB_STATEMENT); - planningPage.clickSaveAndValidate(); - await page.waitForTimeout(20000); + await planningPage.enterJobStatement(INVALID_JOB_STATEMENT); + await planningPage.clickSaveAndValidate(); const error_Message = await planningPage.getErrorMessage() expect (error_Message).toBe(ERROR_MESSAGE); const isGreen_check_visible = await planningPage.isSaveAndValidateGreenCheckVisible(); @@ -84,19 +62,17 @@ test.describe('PlanningTab', () => { }) test('Test Empty Job Statement and Save Validate', async () => { - planningPage.enterJobStatement(''); - planningPage.clickSaveAndValidate(); + await planningPage.enterJobStatement(''); + await planningPage.clickSaveAndValidate(); await page.waitForTimeout(20000); const error_Message = await planningPage.getErrorMessage() - expect (error_Message).toBe(ERROR_MESSAGE); + expect (error_Message).toBe(EMPTY_ERROR); const isGreen_check_visible = await planningPage.isSaveAndValidateGreenCheckVisible(); expect(isGreen_check_visible).toBe(false); }) test('Test all required fields on Planning Tab After Job Validation', async () => { - planningPage.enterJobStatement(JOB_STATEMENT); - planningPage.clickSaveAndValidate(); - await page.waitForTimeout(20000); + await planningPage.clickSaveValidate(); expect(planningPage.runtimeDir).toBeTruthy(); expect(planningPage.workspaceDir).toBeTruthy(); expect(planningPage.logsDir).toBeTruthy(); @@ -120,84 +96,43 @@ test.describe('PlanningTab', () => { }) test('Test Validate Locations with Valid Data', async () => { - planningPage.enterJobStatement(JOB_STATEMENT); - planningPage.clickSaveAndValidate(); - await page.waitForTimeout(20000); - planningPage.enterRuntimeDir(RUNTIME_DIR); - await page.waitForTimeout(2000); - planningPage.enterWorkspaceDir(WORKSPACE_DIR); - await page.waitForTimeout(2000); - planningPage.enterLogsDir(LOG_DIR); - await page.waitForTimeout(2000); - planningPage.enterExtensionsDir(EXTENSIONS_DIR); - await page.waitForTimeout(2000); - planningPage.enterRbacProfileIdentifier(RBAC_IDENTIFIER); - await page.waitForTimeout(2000); - planningPage.enterJobName(JOB_NAME); - await page.waitForTimeout(2000); - planningPage.enterJobPrefix(JOB_PREFIX); - await page.waitForTimeout(2000); - planningPage.enterCookieIdentifier(COOKIE_IDENTIFIER); - await page.waitForTimeout(2000); - planningPage.enterJavaLocation(JAVA_LOCATION); - await page.waitForTimeout(2000); - planningPage.enterNodeJsLocation(NODEJS_LOCATION); - await page.waitForTimeout(2000); - planningPage.checkSetZosmfAttribute(); - await page.waitForTimeout(2000); - planningPage.enterZosmfHost(ZOSMF_HOST); - await page.waitForTimeout(2000); - planningPage.enterZosmfPort(ZOSMF_PORT); - await page.waitForTimeout(2000); - planningPage.enterZosmfApplicationId(ZOSMF_APPID); - await page.waitForTimeout(2000); - planningPage.clickValidateLocations(); - await page.waitForTimeout(20000); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() const is_GreenCheck_Visible = await planningPage.isValidateLocationsGreenCheckVisible(); expect(is_GreenCheck_Visible).toBe(true); const is_Continue_Button_enable = await planningPage.isContinueToInstallationEnabled(); expect(is_Continue_Button_enable).toBe(true); - planningPage.clickContinueToInstallation(); - await page.waitForTimeout(2000); + await planningPage.clickContinueToInstallation(); const installationType_title = await installationTypePage.getInstallationTypePageTitle() expect (installationType_title).toBe(INSTALLATION_TYPE_TITLE); }) test('Test Validate Locations with Invalid Data', async () => { - await page.waitForTimeout(2000); - planningPage.enterJobStatement(JOB_STATEMENT); - planningPage.clickSaveAndValidate(); - await page.waitForTimeout(20000); - planningPage.enterRuntimeDir('Test/DIR'); - await page.waitForTimeout(2000); - planningPage.enterWorkspaceDir('Workspace Dir'); - await page.waitForTimeout(2000); - planningPage.enterLogsDir(LOG_DIR); - await page.waitForTimeout(2000); - planningPage.enterExtensionsDir(EXTENSIONS_DIR); - await page.waitForTimeout(2000); - planningPage.enterRbacProfileIdentifier(22); - await page.waitForTimeout(2000); - planningPage.enterJobName(JOB_NAME); - await page.waitForTimeout(2000); - planningPage.enterJobPrefix(JOB_PREFIX); - await page.waitForTimeout(2000); - planningPage.enterCookieIdentifier(99999); - await page.waitForTimeout(2000); - planningPage.enterJavaLocation('/'); - await page.waitForTimeout(2000); - planningPage.enterNodeJsLocation(NODEJS_LOCATION); - await page.waitForTimeout(2000); - planningPage.checkSetZosmfAttribute(); - await page.waitForTimeout(2000); - planningPage.enterZosmfHost(ZOSMF_HOST); - await page.waitForTimeout(2000); - planningPage.enterZosmfPort(987776); - await page.waitForTimeout(2000); - planningPage.enterZosmfApplicationId('ABCDDDETT'); - await page.waitForTimeout(2000); - planningPage.clickValidateLocations(); - await page.waitForTimeout(20000); + await planningPage.clickSaveValidate(); + await planningPage.enterRuntimeDir('Test/DIR'); + await planningPage.enterWorkspaceDir('Workspace Dir'); + await planningPage.enterLogsDir(config.ZOWE_LOG_DIR); + await planningPage.enterExtensionsDir(config.ZOWE_EXTENSION_DIR); + await planningPage.enterRbacProfileIdentifier('TEST'); + await planningPage.enterJobName(config.JOB_NAME); + await planningPage.enterJobPrefix(config.JOB_PREFIX); + await planningPage.enterCookieIdentifier('9999'); + await planningPage.enterJavaLocation('/'); + await planningPage.enterNodeJsLocation(config.NODE_HOME); + await planningPage.enterZosmfApplicationId('ABCDDDETT'); + await planningPage.clickValidateLocations(); const is_GreenCheck_Visible = await planningPage.isValidateLocationsGreenCheckVisible(); expect(is_GreenCheck_Visible).toBe(false); const is_Continue_Button_enable = await planningPage.isContinueToInstallationEnabled(); @@ -205,42 +140,30 @@ test.describe('PlanningTab', () => { }) test('Test Previous step', async ({ page }) => { - planningPage.clickPreviousStep(); - await page.waitForTimeout(2000); + await planningPage.clickPreviousStep(); const title = await connectionPage.getConnectionPageTitle(); expect(title).toBe(CONNECTION_PAGE_TITLE); }) test('Test Save and Close and Resume Progress', async () => { - planningPage.enterJobStatement(JOB_STATEMENT); - planningPage.clickSaveAndValidate(); - await page.waitForTimeout(20000); - planningPage.enterRuntimeDir(RUNTIME_DIR); - await page.waitForTimeout(2000); - planningPage.enterWorkspaceDir(WORKSPACE_DIR); - await page.waitForTimeout(2000); - planningPage.enterLogsDir(LOG_DIR); - await page.waitForTimeout(2000); - planningPage.enterExtensionsDir(EXTENSIONS_DIR); - await page.waitForTimeout(2000); - planningPage.enterRbacProfileIdentifier(RBAC_IDENTIFIER); - await page.waitForTimeout(2000); - planningPage.enterJobName(JOB_NAME); - await page.waitForTimeout(2000); - planningPage.enterJobPrefix(JOB_PREFIX); - await page.waitForTimeout(2000); - planningPage.enterCookieIdentifier(COOKIE_IDENTIFIER); - await page.waitForTimeout(2000); - planningPage.enterJavaLocation(JAVA_LOCATION); - await page.waitForTimeout(2000); - planningPage.enterNodeJsLocation(NODEJS_LOCATION); - await page.waitForTimeout(2000); - planningPage.clickValidateLocations(); - await page.waitForTimeout(20000); - planningPage.clickSaveAndClose(); - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(5000); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickSaveAndClose(); + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); const title = await planningPage.getPlanningPageTitle(); expect(title).toBe(PLANNING_TITLE); const is_GreenCheck_Visible = await planningPage.isValidateLocationsGreenCheckVisible(); diff --git a/playwright_test/utils/config.ts b/playwright_test/utils/config.ts index eb879463..912bc58d 100644 --- a/playwright_test/utils/config.ts +++ b/playwright_test/utils/config.ts @@ -21,6 +21,8 @@ interface Config { PARM_LIB: string | undefined; JCL_LIB: string | undefined; LOAD_LIB: string | undefined; + DOMAIN_NAME: string | undefined; + EXTERNAL_PORT: number | undefined; } const config: Config = { @@ -45,7 +47,9 @@ const config: Config = { PROC_LIB: process.env.PROC_LIB, PARM_LIB: process.env.PARM_LIB, JCL_LIB: process.env.JCL_LIB, - LOAD_LIB: process.env.LOAD_LIB + LOAD_LIB: process.env.LOAD_LIB, + EXTERNAL_PORT: process.env.EXTERNAL_PORT, + DOMAIN_NAME: process.env.DOMAIN_NAME }; export default config; From 7112618fe141d43fd7260047487829d775fa3e31 Mon Sep 17 00:00:00 2001 From: James Struga Date: Thu, 8 Aug 2024 21:40:01 -0400 Subject: [PATCH 379/455] add last change Signed-off-by: James Struga --- playwright_test/Pages/networking.page.ts | 12 +- playwright_test/Pages/security.page.ts | 23 ++- playwright_test/Tests/ApfAuth.spec.ts | 11 +- playwright_test/Tests/Networking.spec.ts | 2 +- playwright_test/Tests/Security.spec.ts | 197 ++++++++++------------- playwright_test/utils/config.ts | 17 ++ 6 files changed, 132 insertions(+), 130 deletions(-) diff --git a/playwright_test/Pages/networking.page.ts b/playwright_test/Pages/networking.page.ts index 92c9fe67..c654df8a 100644 --- a/playwright_test/Pages/networking.page.ts +++ b/playwright_test/Pages/networking.page.ts @@ -95,7 +95,8 @@ class NetworkingPage{ this.view_job_output = page.locator('//button[contains(text(), "Submit Job")]'); this.save_and_close = page.locator('//button[contains(text(),"Save & close")]'); this.previous_step = page.locator('//button[contains(text(),"Previous step")]'); - this.skip_button = page.locator('//button[contains(text(),"Skip")]'); + this.skip_button = page.locator('//button[contains(text(),"Skip ")]'); + //*[@id="zen-root-container"]/div[2]/div/div[5]/button[2] this.close_button = page.locator("//button[text()='Close']"); this.APFAUTH_TITLE = page.locator('//div[text()="APF Authorize Load Libraries"]'); this.continue_ReviewSelector = page.locator('//button[contains(text(), "Continue to APF Auth Setup")]'); @@ -224,9 +225,12 @@ class NetworkingPage{ } async click_skipNetworking(){ - await this.skip_button.click({ timeout: 2000 }); - const apfAuth_title = await this.APFAUTH_TITLE.textContent(); - return apfAuth_title; + const isEnabled = await this.is_skipNetworkingButtonEnable(); + if (isEnabled) { + await this.skip_button.click({ timeout: 2000 }); + } else { + throw new Error('Skip button is not enabled and cannot be clicked.'); + } } async isPreviousButtonEnable(){ diff --git a/playwright_test/Pages/security.page.ts b/playwright_test/Pages/security.page.ts index 621fd5cb..89c4d20d 100644 --- a/playwright_test/Pages/security.page.ts +++ b/playwright_test/Pages/security.page.ts @@ -39,7 +39,6 @@ class SecurityPage{ this.uploadYaml_greenCheckXpath = page.locator('#card-download-progress-card svg.MuiSvgIcon-colorSuccess') this.init_security_greenCheckXpath = page.locator("#card-success-progress-card svg.MuiSvgIcon-colorSuccess") this.previous_step_button = page.locator('//button[contains(text(),"Previous step")]') - this.skip_button = page.locator('//button[contains(text(),"Skip")]') this.editor_title_element = page.locator('//h2[text()="Editor"]') this.APFAUTH_TITLE = page.locator('//div[text()="APF Authorize Load Libraries"]') this.licenseAgreement = page.locator('//button[contains(text(), "License Agreement")]') @@ -53,12 +52,13 @@ class SecurityPage{ this.view_job_output = page.locator('//button[contains(text(), "Submit Job")]') this.save_and_close = page.locator('//button[contains(text(),"Save & close")]') this.previous_step = page.locator('//button[contains(text(),"Previous step")]') - this.skip_button = page.locator('//button[contains(text(),"Skip")]') + this.skip_button = page.locator('//button[contains(text(),"Skip ")]') this.initSecurity = page.locator("//button[contains(text(), 'Initialize Security Config')]") this.close_button = page.locator('//button[contains(text(), "Close")]') this.certificateTab_title = page.locator('//div[text()="Certificates"]') + this.stc_title = page.locator('//div[text()="Stcs"]') this.securityTab_title = page.locator('//div[text()="Security"]') - this.continue_CertificateSelector = page.locator('//button[contains(text(), "Continue to Certificates Setup")]') + this.continue_CertificateSelector = page.locator('//button[contains(text(), "Continue to STC Setup")]') this.admin = page.getByLabel('Admin'); this.stc = page.getByLabel('Stc'); @@ -141,8 +141,6 @@ class SecurityPage{ async click_skipSecurity(){ await this.skip_button.click({ timeout: 2000 }); - const certificatePage_title = await this.certificateTab_title.textContent(); - return certificatePage_title; } async open_monacoEditor(){ @@ -190,10 +188,21 @@ class SecurityPage{ const sysProg_value = await this.sys_prog.textContent(); return sysProg_value; } - async returnTitleOfSecurityPage(){ + async returnTitleOfSecurityPage(){ const securityPage_title = await this.securityTab_title.textContent(); return securityPage_title; } + async returnTitleOfCertPage(){ + const certPage_title = await this.certificateTab_title.textContent(); + return certPage_title; + } + + async returnTitleOfstcPage(){ + const stcPage_title = await this.stc_title.textContent(); + return stcPage_title; + } + } - export default SecurityPage; \ No newline at end of file + +export default SecurityPage; \ No newline at end of file diff --git a/playwright_test/Tests/ApfAuth.spec.ts b/playwright_test/Tests/ApfAuth.spec.ts index 3ad50342..5d4b797d 100644 --- a/playwright_test/Tests/ApfAuth.spec.ts +++ b/playwright_test/Tests/ApfAuth.spec.ts @@ -69,10 +69,9 @@ test.describe('ApfAuthTab', () => { ); await planningPage.clickValidateLocations() await planningPage.clickContinueToInstallation() - await installationTypePage.selectSmpe() - await installationTypePage.continueToUnpax() - await installationTypePage.retrieveExampleYaml() - await installationTypePage.continueComponentInstallation() + await installationTypePage.downloadZowePaxAndNavigateToInstallationPage() + await installationTypePage.continueToUnpax() + await installationTypePage.skipUnpax() await installationPage.fillAllFields(config.DATASET_PREFIX, config.PARM_LIB, config.PROC_LIB, @@ -81,8 +80,8 @@ test.describe('ApfAuthTab', () => { config.AUTH_LOAD_LIB, config.AUTH_PLUGIN_LIB ) - await installationPage.clickInstallMvsDatasets() - await installationPage.clickContinueToNetworkSetup() + await installationPage.clickInstallMvsDatasets(); + await installationPage.clickContinueToNetworkSetup(); await networkingPage.click_skipNetworking() await page.waitForTimeout(1000); }) diff --git a/playwright_test/Tests/Networking.spec.ts b/playwright_test/Tests/Networking.spec.ts index 67921daf..55202448 100644 --- a/playwright_test/Tests/Networking.spec.ts +++ b/playwright_test/Tests/Networking.spec.ts @@ -21,7 +21,7 @@ const INSTALLATION_TITLE = 'Installation'; test.beforeAll(async () => { try { - await prepareEnvironment({ install: false, remove: false }); + await prepareEnvironment({ install: true, remove: false }); } catch (error) { console.error('Error during environment preparation:', error); process.exit(1); diff --git a/playwright_test/Tests/Security.spec.ts b/playwright_test/Tests/Security.spec.ts index 2f3af785..3a296d04 100644 --- a/playwright_test/Tests/Security.spec.ts +++ b/playwright_test/Tests/Security.spec.ts @@ -5,7 +5,11 @@ import ApfAuthPage from '../Pages/ApfAuth.page'; import TitlePage from '../Pages/title.page'; import ConnectionPage from '../Pages/connection.page'; import PlanningPage from '../Pages/planning.page'; +import NetworkingPage from '../Pages/networking.page'; +import InstallationPage from '../Pages/installation.page.ts'; +import InstallationTypePage from '../Pages/installationType.page.ts'; import path from 'path'; +import config from '../utils/config'; let page: Page; @@ -13,29 +17,8 @@ let electronApp: ElectronApplication const CERTIFICATE_TITLE = 'Certificates' const SECURITY_TITLE = 'Security' const APF_AUTH_TITLE ='APF Authorize Load Libraries' -const ZOWE_ROOT_DIR = process.env.ZOWE_ROOT_DIR; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR= process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR=process.env.ZOWE_LOG_DIR; -const ZOWE_WORKSPACE_DIR=process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME= process.env.JOB_NAME; -const JOB_PREFIX=process.env.JOB_PREFIX; -const JAVA_HOME=process.env.JAVA_HOME; -const NODE_HOME=process.env.NODE_HOME; -const ZOSMF_HOST=process.env.ZOSMF_HOST; -const ZOSMF_PORT=process.env.ZOSMF_PORT; -const ZOSMF_APP_ID=process.env.ZOSMF_APP_ID; -const SECURITY_ADMIN= process.env.SECURITY_ADMIN; -const SECURITY_STC = process.env.SECURITY_STC; -const SECURITY_SYSPROG = process.env.SECURITY_SYSPROG; -const SECURITY_USER_ZIS = process.env.SECURITY_USER_ZIS; -const SECURITY_USER_ZOWE = process.env.SECURITY_USER_ZOWE; -const SECURITY_AUX = process.env.SECURITY_AUX; -const SECURITY_STC_ZOWE = process.env.SECURITY_STC_ZOWE; -const SECURITY_STC_ZIS = process.env.SECURITY_STC_ZIS; +const STC_TITTLE = 'Stcs' + test.beforeAll(async () => { try { @@ -52,6 +35,9 @@ test.describe('securityTab', () => { let securityPage : SecurityPage; let planningPage : PlanningPage; let apfAuthPage : ApfAuthPage; + let networkingPage : NetworkingPage; + let installationTypePage : InstallationTypePage; + let installationPage : InstallationPage; test.beforeEach(async ({ page }) => { @@ -61,23 +47,45 @@ test.describe('securityTab', () => { connectionPage = new ConnectionPage(page); titlePage = new TitlePage(page); planningPage = new PlanningPage(page); + networkingPage = new NetworkingPage(page); apfAuthPage = new ApfAuthPage(page); securityPage = new SecurityPage(page); + installationPage = new InstallationPage(page); + installationTypePage = new InstallationTypePage(page); titlePage.navigateToConnectionTab() - connectionPage.fillConnectionDetails(SSH_HOST,SSH_PORT,SSH_USER,SSH_PASSWD) - connectionPage.SubmitValidateCredential() - await page.waitForTimeout(5000); - connectionPage.clickContinueButton() - planningPage.clickSaveValidate() - await page.waitForTimeout(20000); - planningPage.fillPlanningPageWithRequiredFields(ZOWE_ROOT_DIR, ZOWE_WORKSPACE_DIR,ZOWE_EXTENSION_DIR,ZOWE_LOG_DIR,'1',JOB_NAME,JOB_PREFIX,JAVA_HOME,NODE_HOME,ZOSMF_HOST,ZOSMF_PORT,ZOSMF_APP_ID) - await page.waitForTimeout(20000); - planningPage.clickValidateLocations() - await page.waitForTimeout(20000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); - securityPage.movetoSecurityPage() - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() + await installationTypePage.downloadZowePaxAndNavigateToInstallationPage() + await installationTypePage.continueToUnpax() + await installationTypePage.skipUnpax() + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickInstallMvsDatasets(); + await installationPage.clickContinueToNetworkSetup(); + await networkingPage.click_skipNetworking() + await apfAuthPage.click_skipApfAuth() }) test.afterEach(async () => { @@ -85,7 +93,6 @@ test.describe('securityTab', () => { }) test('Test all required fields on security page', async ({ page }) => { - await page.waitForTimeout(5000); await expect(securityPage.product).toBeTruthy() await expect(securityPage.admin).toBeTruthy() await expect(securityPage.stc).toBeTruthy() @@ -102,108 +109,74 @@ test.describe('securityTab', () => { await expect(securityPage.continue_CertificateSelector).toBeTruthy() }) - test('test security with empty data', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.fillSecurityDetails('','','','','','','','','') - await page.waitForTimeout(5000); - securityPage.initializeSecurity() - await page.waitForTimeout(15000); - const isWriteConfig_check_visible = await securityPage.isWriteConfigGreenCheckVisible(); - expect(isWriteConfig_check_visible).toBe(false); - const isUploadConfig_check_visible = await securityPage.isUploadConfigGreenCheckVisible(); - expect(isUploadConfig_check_visible).toBe(false); - const isInitSecurity_check_visible = await securityPage.isInitSecurityGreenCheckVisible(); - expect(isInitSecurity_check_visible).toBe(false); - await page.waitForTimeout(15000); - - }) + //needs to be done test('test security with valid data', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.fillSecurityDetails('RACF',SECURITY_ADMIN,SECURITY_STC,SECURITY_SYSPROG,SECURITY_USER_ZIS,SECURITY_USER_ZOWE,SECURITY_AUX,SECURITY_STC_ZOWE,SECURITY_STC_ZIS) - await page.waitForTimeout(5000); - securityPage.initializeSecurity() - await page.waitForTimeout(5000); - const isWriteConfig_check_visible = await securityPage.isWriteConfigGreenCheckVisible(); - expect(isWriteConfig_check_visible).toBe(true); - const isUploadConfig_check_visible = await securityPage.isUploadConfigGreenCheckVisible(); - expect(isUploadConfig_check_visible).toBe(true); - const isInitSecurity_check_visible = await securityPage.isInitSecurityGreenCheckVisible(); - expect(isInitSecurity_check_visible).toBe(true); - await page.waitForTimeout(5000); - + await securityPage.fillSecurityDetails('RACF', + config.SECURITY_ADMIN, + config.SECURITY_STC, + config.SECURITY_SYSPROG, + config.SECURITY_USER_ZIS, + config.SECURITY_USER_ZOWE, + config.SECURITY_AUX, + config.SECURITY_STC_ZOWE, + config.SECURITY_STC_ZIS + ) + await securityPage.initializeSecurity() + const is_ContinueButtonDisable = await securityPage.isContinueButtonDisable(); + expect(is_ContinueButtonDisable).toBe(false); }) test('click Previous step button', async ({ page }) => { - await page.waitForTimeout(5000); + const is_prevButtonEnable = await securityPage.isPreviousButtonEnable(); + expect(is_prevButtonEnable).toBe(true); const title = await securityPage.returnTitleOfPrevPage(); expect(title).toBe(APF_AUTH_TITLE); }) test('test click skip security button', async ({ page }) => { - await page.waitForTimeout(5000); - const certificate_title = await securityPage.click_skipSecurity(); - expect(certificate_title).toBe(CERTIFICATE_TITLE); + const isSkipSecurityEnable = await securityPage.is_skipSecurityButtonEnable(); + expect(isSkipSecurityEnable).toBe(true); + await securityPage.click_skipSecurity(); + const title = await securityPage.returnTitleOfstcPage() + expect(title).toBe(STC_TITTLE); }) - test('Test previous button is enabled', async ({ page }) => { - const is_prevButtonEnable = await securityPage.isPreviousButtonEnable(); - expect(is_prevButtonEnable).toBe(true); - await page.waitForTimeout(2000); - }) - test('Test continue to certificate button is disable', async ({ page }) => { - await page.waitForTimeout(2000); const is_ContinueButtonDisable = await securityPage.isContinueButtonDisable(); expect(is_ContinueButtonDisable).toBe(true); - await page.waitForTimeout(2000); - }) - - test('Test Skip security button is enable', async ({ page }) => { - await page.waitForTimeout(2000); - const isSkipSecurityEnable = await securityPage.is_skipSecurityButtonEnable(); - expect(isSkipSecurityEnable).toBe(true); - await page.waitForTimeout(2000); }) - test('Test view yaml button', async ({ page }) => { - await page.waitForTimeout(7000); - securityPage.viewYaml() - await page.waitForTimeout(5000); + await securityPage.viewYaml() await expect(securityPage.editor_title_element).toBeTruthy(); - securityPage.closeButton() - await page.waitForTimeout(2000); + await securityPage.closeButton() }) - test('Test view and submit button', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.click_viewAndSubmitJob() - await page.waitForTimeout(5000); - await expect(securityPage.editor_title_element).toBeTruthy() - securityPage.closeButton() - await page.waitForTimeout(2000); - }) - test('Test view job', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.click_previewJob() - await page.waitForTimeout(5000); + test('Test view job output', async ({ page }) => { + await securityPage.click_viewAndSubmitJob() await expect(securityPage.editor_title_element).toBeTruthy() - securityPage.closeButton() - await page.waitForTimeout(5000); + await securityPage.closeButton() }) test('Test save and close and Resume Progress', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.fillSecurityDetails('RACF',SECURITY_ADMIN,SECURITY_STC,SECURITY_SYSPROG,SECURITY_USER_ZIS,SECURITY_USER_ZOWE,SECURITY_AUX,SECURITY_STC_ZOWE,SECURITY_STC_ZIS) - await page.waitForTimeout(5000); - securityPage.click_saveAndClose() - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(15000); + await securityPage.fillSecurityDetails('RACF', + config.SECURITY_ADMIN, + config.SECURITY_STC, + config.SECURITY_SYSPROG, + config.SECURITY_USER_ZIS, + config.SECURITY_USER_ZOWE, + config.SECURITY_AUX, + config.SECURITY_STC_ZOWE, + config.SECURITY_STC_ZIS + ) + await securityPage.click_saveAndClose() + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); const title = await securityPage.returnTitleOfSecurityPage(); expect(title).toBe(SECURITY_TITLE); const sysProg_value = await securityPage.get_sysProg_value(); diff --git a/playwright_test/utils/config.ts b/playwright_test/utils/config.ts index 912bc58d..2acdca11 100644 --- a/playwright_test/utils/config.ts +++ b/playwright_test/utils/config.ts @@ -22,7 +22,16 @@ interface Config { JCL_LIB: string | undefined; LOAD_LIB: string | undefined; DOMAIN_NAME: string | undefined; + SECURITY_ADMIN: string | undefined; EXTERNAL_PORT: number | undefined; + SECURITY_STC: string | undefined; + SECURITY_SYSPROG: string | undefined; + SECURITY_USER_ZIS: string | undefined; + SECURITY_USER_ZOWE: string | undefined; + SECURITY_AUX: string | undefined; + SECURITY_STC_ZOWE: string | undefined; + SECURITY_STC_ZIS: string | undefined; + } const config: Config = { @@ -49,6 +58,14 @@ const config: Config = { JCL_LIB: process.env.JCL_LIB, LOAD_LIB: process.env.LOAD_LIB, EXTERNAL_PORT: process.env.EXTERNAL_PORT, + SECURITY_ADMIN: process.env.SECURITY_ADMIN, + SECURITY_STC: process.env.SECURITY_STC, + SECURITY_SYSPROG: process.env.SECURITY_SYSPROG, + SECURITY_USER_ZIS: process.env.SECURITY_USER_ZIS, + SECURITY_USER_ZOWE: process.env.SECURITY_USER_ZOWE, + SECURITY_AUX: process.env.SECURITY_AUX, + SECURITY_STC_ZOWE: process.env.SECURITY_STC_ZOWE, + SECURITY_STC_ZIS: process.env.SECURITY_STC_ZIS, DOMAIN_NAME: process.env.DOMAIN_NAME }; From c9f6d1bf24a4ac51f6088bbcc18904b3e6a0a625 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 9 Aug 2024 11:06:22 +0530 Subject: [PATCH 380/455] Removing launch config file --- .vscode/launch.json | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 1ae7ee52..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Electron: Renderer", - "type": "chrome", - "request": "launch", - "url": "http://localhost:3000/main_window", // Change this to the URL your Electron app serves on - "webRoot": "${workspaceFolder}/src/services/ResolveRef", - "timeout": 30000 - } - ], -} From 81a9bc14bd905e767db867ed0f887f2edcf30b38 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 9 Aug 2024 14:45:02 +0530 Subject: [PATCH 381/455] Adding the service --- src/services/ResolveRef.ts | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/services/ResolveRef.ts b/src/services/ResolveRef.ts index 114eaf40..604627d6 100644 --- a/src/services/ResolveRef.ts +++ b/src/services/ResolveRef.ts @@ -3,38 +3,27 @@ export const updateSchemaReferences = (schema: any, serverCommon: any): void => const traverseAndUpdate = (node: any) => { if (node !== null && typeof node === "object") { for (const key in node) { - console.log("-------------key: ", key); if (key === "$ref" && typeof node[key] === "string") { try { const refValue = resolveRef(node[key]); - console.log("---------refValue: ", refValue); Object.assign(node, refValue); delete node['$ref']; } catch(error){ console.error("Error resolving reference:", error.message); } } else { - traverseAndUpdate(node[key]); // Pass down the node[key] for recursive traversal + traverseAndUpdate(node[key]); } } } } - + const resolveRef = (ref: string) => { - const refPath = ref.replace('#/$defs/', '').split('/'); + const refPath = ref.split('#')[1]; let result = serverCommon.$defs; - for (const part of refPath) { - console.log('---------------resolve[part]: ', result[part]); - if (result[part] !== undefined) { - result = result[part]; - } else { - console.log('-------------error: not found: ', result[part]); - throw new Error(`Reference ${ref} not found in serverCommon`); - } - } - return result; + const refObject = Object.values(result).find((obj:any) => obj.$anchor === refPath); + return refObject; } - - traverseAndUpdate(schema); -} - \ No newline at end of file + + traverseAndUpdate(schema.properties.zowe.properties.setup.properties); +} \ No newline at end of file From 8e11bcf48118b2f4dadcf7dc3edc21dcc429f0ed Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 9 Aug 2024 14:50:34 +0530 Subject: [PATCH 382/455] Updating the installation Handler --- src/actions/InstallationHandler.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 4d57e3fd..77123b5c 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -158,14 +158,6 @@ class Installation { const serverCommon = JSON.parse(readPaxYamlAndSchema.details.serverCommon); if(yamlSchema && serverCommon){ updateSchemaReferences(yamlSchema, serverCommon); - yamlSchema.additionalProperties = true; - yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = zoweDatasetMemberRegexFixed; - yamlSchema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverCommon.$defs.path; - if(yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items){ - delete yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; - yamlSchema.$defs.networkSettings.properties.server.properties.listenAddresses.items = serverCommon.$defs.ipv4 - } - // console.log('Setting schema from runtime dir:', JSON.stringify(yamlSchema)); ConfigurationStore.setSchema(yamlSchema); parsedSchema = true; ProgressStore.set('downloadUnpax.getSchemas', true); From d4a6b1ea8a5c682744ba6bec32ca507cc662883f Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 9 Aug 2024 15:56:49 +0530 Subject: [PATCH 383/455] code-reorganizing --- src/renderer/components/common/JsonForms.tsx | 132 +++++++++---------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/renderer/components/common/JsonForms.tsx b/src/renderer/components/common/JsonForms.tsx index 18c38659..aa7286fd 100644 --- a/src/renderer/components/common/JsonForms.tsx +++ b/src/renderer/components/common/JsonForms.tsx @@ -14,38 +14,78 @@ import { materialRenderers, materialCells } from '@jsonforms/material-renderers' import { ThemeProvider } from '@mui/material/styles'; import jsonFormTheme from '../../jsonFormsTheme'; +// Creates a basic input element in the UI schema +const createControl = (scope: string) => ({ + type: 'Control', + scope, // Scope specifies the JSON path +}); + +// createGroup generates a group object, used to group together multiple form elements - can optionally include a rule (like visibility) +const createGroup = (label: string, elements: any[], rule?: any) => ({ + type: 'Group', + label: `\n${label}`, + elements: elements || [], + ...(rule && {rule}), +}); + +// createVerticalLayout generates a layout object that arranges its child elements vertically. +const createVerticalLayout = (elements: any[]) => ({ + type: 'VerticalLayout', + elements, +}); + +// Same as above, but arranges its child elements horizontally. +const createHorizontalLayout = (elements: any[]) => ({ + type: 'HorizontalLayout', + elements, +}); + +// To handle the "if", "else", and "then" in the schema +const conditionalSchema = (schema: any, formData: any, prop: any): boolean=> { + if(schema.if && schema.then && schema.else){ + const ifProp = Object.keys(schema.if.properties)[0]; + const ifPropValue = schema.if.properties[ifProp].const.toLowerCase(); + const thenProp = schema.then.required[0].toLowerCase(); + const elseProp = schema.else.required[0].toLowerCase(); + + if(formData && formData[ifProp]) { + const formDataPropValue = formData[ifProp].toLowerCase(); + if( (formDataPropValue == ifPropValue && prop == elseProp) || (formDataPropValue != ifPropValue && prop == thenProp) ) { + return true; + } + } + return false; + } + return false; +} + +const getDefaultFormData = (schema: any, formData: any) => { + if (schema && schema.properties) { + const defaultFormData = { ...formData }; + Object.keys(schema.properties).forEach((property) => { + if (schema.properties[property].type && schema.properties[property].default !== undefined || schema.properties[property].type === 'object') { + // If the property is an object, recursively set default values + if (schema.properties[property].type === 'object') { + defaultFormData[property] = getDefaultFormData( + schema.properties[property], + defaultFormData[property] || {} + ); + } else { + defaultFormData[property] = schema.properties[property].default; + } + } + }); + return defaultFormData; + } + return null; +}; + const makeUISchema = (schema: any, base: string, formData: any): any => { if (!schema || !formData) { return ""; } const properties = Object.keys(schema?.properties); - // Creates a basic input element in the UI schema - const createControl = (scope: string) => ({ - type: 'Control', - scope, // Scope specifies the JSON path - }); - - // createGroup generates a group object, used to group together multiple form elements - can optionally include a rule (like visibility) - const createGroup = (label: string, elements: any[], rule?: any) => ({ - type: 'Group', - label: `\n${label}`, - elements: elements || [], - ...(rule && {rule}), - }); - - // createVerticalLayout generates a layout object that arranges its child elements vertically. - const createVerticalLayout = (elements: any[]) => ({ - type: 'VerticalLayout', - elements, - }); - - // Same as above, but arranges its child elements horizontally. - const createHorizontalLayout = (elements: any[]) => ({ - type: 'HorizontalLayout', - elements, - }); - // Map each property in the JSON schema to an appropriate UI element based on its type and structure. const elements = properties.map((prop: any) => { if (schema.properties[prop].type === 'object') { @@ -86,46 +126,6 @@ const makeUISchema = (schema: any, base: string, formData: any): any => { return createVerticalLayout(elements); // Return whole structure } -// To handle the "if", "else", and "then" in the schema -const conditionalSchema = (schema: any, formData: any, prop: any): boolean=> { - if(schema.if && schema.then && schema.else){ - const ifProp = Object.keys(schema.if.properties)[0]; - const ifPropValue = schema.if.properties[ifProp].const.toLowerCase(); - const thenProp = schema.then.required[0].toLowerCase(); - const elseProp = schema.else.required[0].toLowerCase(); - - if(formData && formData[ifProp]) { - const formDataPropValue = formData[ifProp].toLowerCase(); - if( (formDataPropValue == ifPropValue && prop == elseProp) || (formDataPropValue != ifPropValue && prop == thenProp) ) { - return true; - } - } - return false; - } - return false; -} - -const getDefaultFormData = (schema: any, formData: any) => { - if (schema && schema.properties) { - const defaultFormData = { ...formData }; - Object.keys(schema.properties).forEach((property) => { - if (schema.properties[property].type && schema.properties[property].default !== undefined || schema.properties[property].type === 'object') { - // If the property is an object, recursively set default values - if (schema.properties[property].type === 'object') { - defaultFormData[property] = getDefaultFormData( - schema.properties[property], - defaultFormData[property] || {} - ); - } else { - defaultFormData[property] = schema.properties[property].default; - } - } - }); - return defaultFormData; - } - return null; -}; - export default function JsonForm(props: any) { const {schema, onChange, formData} = props; From c0f1ddfa832b7ee0d3e37240a8d3c48888cb28c8 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 9 Aug 2024 16:03:02 +0530 Subject: [PATCH 384/455] Updating the core logic --- src/services/ResolveRef.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/ResolveRef.ts b/src/services/ResolveRef.ts index 604627d6..f14613a1 100644 --- a/src/services/ResolveRef.ts +++ b/src/services/ResolveRef.ts @@ -25,5 +25,5 @@ export const updateSchemaReferences = (schema: any, serverCommon: any): void => return refObject; } - traverseAndUpdate(schema.properties.zowe.properties.setup.properties); + traverseAndUpdate(schema); } \ No newline at end of file From 3ba5acd25c1066cdabcb41db3c8d9df6e7519d46 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 9 Aug 2024 16:19:01 +0530 Subject: [PATCH 385/455] Handling oneOf schema --- src/renderer/components/common/JsonForms.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/renderer/components/common/JsonForms.tsx b/src/renderer/components/common/JsonForms.tsx index aa7286fd..766ead97 100644 --- a/src/renderer/components/common/JsonForms.tsx +++ b/src/renderer/components/common/JsonForms.tsx @@ -80,10 +80,19 @@ const getDefaultFormData = (schema: any, formData: any) => { return null; }; +const handleOneOfSchema = (schema: any, formData: any): any => { + +} + const makeUISchema = (schema: any, base: string, formData: any): any => { if (!schema || !formData) { return ""; } + + if(schema.oneOf) { + handleOneOfSchema(schema, formData); + } + const properties = Object.keys(schema?.properties); // Map each property in the JSON schema to an appropriate UI element based on its type and structure. From 3e2885475e8e9fc330017643aa5daa463a2c0f7d Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 9 Aug 2024 16:57:19 +0530 Subject: [PATCH 386/455] Updating the certificates --- src/renderer/components/stages/Certificates.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 1ea19536..cbf6955f 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -251,7 +251,7 @@ const Certificates = () => { }/> } dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
} - + {/* */}

Verify Certificates

From e1b30c800e7e28d7bd462964a6a34e0d1dcd5808 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Fri, 9 Aug 2024 16:57:43 +0530 Subject: [PATCH 387/455] Updating the json forms --- src/renderer/components/common/JsonForms.tsx | 31 ++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/common/JsonForms.tsx b/src/renderer/components/common/JsonForms.tsx index 766ead97..d2bee97b 100644 --- a/src/renderer/components/common/JsonForms.tsx +++ b/src/renderer/components/common/JsonForms.tsx @@ -80,8 +80,35 @@ const getDefaultFormData = (schema: any, formData: any) => { return null; }; +// Function to return form data based on the attributes present in the schema +const filterFormData = (data: { [key: string]: any }, schema: any) => { + const filteredData: { [key: string]: any } = {}; + const schemaProperties = schema.properties || {}; + + Object.keys(data).forEach(key => { + if (key in schemaProperties) { + filteredData[key] = data[key]; + } + }); + + return filteredData; +}; + +// Function to find the matching schema for the given form data +const findMatchingSchemaIndex = (formData: any, oneOfSchemas: any) => { + for (let i = 0; i < oneOfSchemas.length; i++) { + const subSchema = oneOfSchemas[i]; + const filteredData = filterFormData(formData, subSchema); + if (JSON.stringify(filteredData) === JSON.stringify(formData)) { + return i; + } + } + return 0; // Default to the first schema if no match is found +}; + const handleOneOfSchema = (schema: any, formData: any): any => { - + const requiredSchemaIndex = findMatchingSchemaIndex(formData, schema.oneOf); + return schema.oneOf[requiredSchemaIndex]; } const makeUISchema = (schema: any, base: string, formData: any): any => { @@ -90,7 +117,7 @@ const makeUISchema = (schema: any, base: string, formData: any): any => { } if(schema.oneOf) { - handleOneOfSchema(schema, formData); + schema = handleOneOfSchema(schema, formData); } const properties = Object.keys(schema?.properties); From ad2ca353ffc0c35b5528e09cd8356d632178629d Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Mon, 12 Aug 2024 19:05:33 +0530 Subject: [PATCH 388/455] More updates --- src/renderer/components/common/JsonForms.tsx | 61 ++++++++++++++++--- .../components/stages/Certificates.tsx | 24 +++++--- 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/src/renderer/components/common/JsonForms.tsx b/src/renderer/components/common/JsonForms.tsx index d2bee97b..5d305722 100644 --- a/src/renderer/components/common/JsonForms.tsx +++ b/src/renderer/components/common/JsonForms.tsx @@ -13,6 +13,11 @@ import { JsonForms } from '@jsonforms/react'; import { materialRenderers, materialCells } from '@jsonforms/material-renderers'; import { ThemeProvider } from '@mui/material/styles'; import jsonFormTheme from '../../jsonFormsTheme'; +import Radio from '@mui/material/Radio'; +import RadioGroup from '@mui/material/RadioGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormControl from '@mui/material/FormControl'; +import FormLabel from '@mui/material/FormLabel'; // Creates a basic input element in the UI schema const createControl = (scope: string) => ({ @@ -60,6 +65,9 @@ const conditionalSchema = (schema: any, formData: any, prop: any): boolean=> { } const getDefaultFormData = (schema: any, formData: any) => { + if (schema.oneOf) { + schema = schema.oneOf[0]; + } if (schema && schema.properties) { const defaultFormData = { ...formData }; Object.keys(schema.properties).forEach((property) => { @@ -83,7 +91,7 @@ const getDefaultFormData = (schema: any, formData: any) => { // Function to return form data based on the attributes present in the schema const filterFormData = (data: { [key: string]: any }, schema: any) => { const filteredData: { [key: string]: any } = {}; - const schemaProperties = schema.properties || {}; + const schemaProperties = schema?.properties || {}; Object.keys(data).forEach(key => { if (key in schemaProperties) { @@ -108,7 +116,7 @@ const findMatchingSchemaIndex = (formData: any, oneOfSchemas: any) => { const handleOneOfSchema = (schema: any, formData: any): any => { const requiredSchemaIndex = findMatchingSchemaIndex(formData, schema.oneOf); - return schema.oneOf[requiredSchemaIndex]; + return requiredSchemaIndex; } const makeUISchema = (schema: any, base: string, formData: any): any => { @@ -117,7 +125,8 @@ const makeUISchema = (schema: any, base: string, formData: any): any => { } if(schema.oneOf) { - schema = handleOneOfSchema(schema, formData); + const schemaIndex = handleOneOfSchema(schema, formData); + schema = schema.oneOf[schemaIndex]; } const properties = Object.keys(schema?.properties); @@ -163,18 +172,52 @@ const makeUISchema = (schema: any, base: string, formData: any): any => { } export default function JsonForm(props: any) { - const {schema, onChange, formData} = props; - + let {schema, onChange, formData} = props; const isFormDataEmpty = formData === null || formData === undefined || Object.keys(formData).length < 1; - const formDataToUse = isFormDataEmpty ? getDefaultFormData(schema, {}) : formData; + const [reqSchema, setReqSchema] = useState(schema); + const [reqFormData, setReqFormData] = useState(isFormDataEmpty ? getDefaultFormData(schema, {}) : formData); + const [selectedSchemaIndex, setSelectedSchemaIndex] = useState(0); + + useEffect(() => { + if (schema?.oneOf) { + const initialSchemaIndex = handleOneOfSchema(schema, formData); + setSelectedSchemaIndex(initialSchemaIndex); + setReqSchema(schema.oneOf[initialSchemaIndex]); + setReqFormData(filterFormData(formData, schema.oneOf[initialSchemaIndex])); + } + }, []); + + const handleSchemaChange = (event: any) => { + const schemaIndex = parseInt(event.target.value); + setSelectedSchemaIndex(schemaIndex); + setReqSchema(schema.oneOf[schemaIndex]); + setReqFormData(filterFormData(formData, schema.oneOf[schemaIndex])); + } return ( + { schema.oneOf && +
+ + + { schema.oneOf.map((_: any, index: number) => ( + } label={`Certificate ${index}`} /> + ))} + + +
+ + } { const [theme] = useState(createTheme()); + const updtYaml = useAppSelector(selectYaml); const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); @@ -38,11 +39,13 @@ const Certificates = () => { const dispatch = useAppDispatch(); const [schema, setLocalSchema] = useState(useAppSelector(selectSchema)); - const [yaml, setLocalYaml] = useState(useAppSelector(selectYaml)); + // const [yaml, setLocalYaml] = useState(updtYaml); + const yaml = useAppSelector(selectYaml); const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); const [installationArgs] = useState(getInstallationArguments()); const [setupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.certificate); - const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.certificate); + // const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.certificate); + const setupYaml = yaml?.zowe?.setup?.certificate; const [verifyCerts, setVerifyCerts] = useState(yaml?.zowe?.verifyCertificates ?? "STRICT"); const [isFormInit, setIsFormInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); @@ -171,7 +174,7 @@ const Certificates = () => { if(res.details.updatedYaml != undefined){ const updatedCerts = res.details.updatedYaml.zowe?.certificate; const updatedYaml = {...yaml, zowe: {...yaml.zowe, certificate: updatedCerts}}; - setSetupYaml(res.details.updatedYaml.zowe?.setup.certificate); + // setSetupYaml(res.details.updatedYaml.zowe?.setup.certificate); window.electron.ipcRenderer.setConfig(updatedYaml); dispatch(setYaml(updatedYaml)); } @@ -218,19 +221,20 @@ const Certificates = () => { const errMsg = validate.errors[0].message; setStageConfig(false, errPath+' '+errMsg, newData); } else { - window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, certificate: newData}}}); - setLocalYaml({...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, certificate: newData}}}); setStageConfig(true, '', newData); } + const updatedYaml = {...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, certificate: newData}}}; + window.electron.ipcRenderer.setConfig(updatedYaml); + // setLocalYaml(updatedYaml); + dispatch(setYaml(updatedYaml)); } } }; - const setStageConfig = (isValid: boolean, errorMsg: string, data: any) => { setIsFormValid(isValid); setFormError(errorMsg); - setSetupYaml(data); + // setSetupYaml(data); } return ( @@ -249,10 +253,9 @@ const Certificates = () => { setStageConfig(true, '', newData); } }/> } - dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> + {!isFormValid &&
{formError}
} - {/* */}

Verify Certificates

+ {storageModeOptions.map((option, index) => ( + + {option} + + ))} + + + handleFormChange(data)} formData={setupYaml}/> { showVsameDatsetName && From 3beb0a856d9b2245bf619bb6e28f7e3bf0e923d3 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 3 Oct 2024 16:03:35 +0530 Subject: [PATCH 438/455] Condition while using drop down --- src/renderer/components/stages/Vsam.tsx | 100 +++++++++++++++--------- 1 file changed, 61 insertions(+), 39 deletions(-) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index d3320301..cc2d1afe 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -61,7 +61,7 @@ const Vsam = () => { const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); const stageStatusRef = useRef(stageStatus); const [showVsameDatsetName, setShowVsamDatasetName] = useState(false); - const [storageMode, setStorageMode] = useState(''); + const [storageMode, setStorageMode] = useState(yaml?.components[`caching-service`]?.storage?.mode); const storageModeOptions = ['VSAM', 'INFINISPAN']; let timer: any; @@ -81,8 +81,6 @@ const Vsam = () => { dispatch(setInitializationStatus(isInitializationStageComplete())); setShowProgress(initClicked || stepProgress); - setStorageMode(yaml?.components[`caching-service`]?.storage?.mode); - const nameExists = setupSchema?.properties?.name; if(!nameExists) { setShowVsamDatasetName(true); @@ -305,6 +303,20 @@ const Vsam = () => { const updateStorageMode = (event: any) => { setStorageMode(event.target.value); + const updatedYaml = { + ...yaml, + components: { + ...yaml.components, + 'caching-service': { + ...yaml.components['caching-service'], + storage: { + ...yaml.components['caching-service']?.storage, + mode: event.target.value + } + } + } + }; + setYamlConfig(updatedYaml); } return ( @@ -344,43 +356,53 @@ const Vsam = () => {
- handleFormChange(data)} formData={setupYaml}/> - - { showVsameDatsetName && - -
- { - cachingServiceChangeHandler(e.target.value); - }} - /> - {allowInitialization &&

Zowe Caching Service VSAM data set.

} - {!allowInitialization &&

Invalid input. Please enter a valid VSAM dataset name.

} -
-
- } - - {!showProgress ? - - : null} + { storageMode.toUpperCase() !== 'VSAM' ? + <> : ( + <> + handleFormChange(data)} formData={setupYaml}/> + + { showVsameDatsetName && + +
+ { + cachingServiceChangeHandler(e.target.value); + }} + /> + {allowInitialization &&

Zowe Caching Service VSAM data set.

} + {!allowInitialization &&

Invalid input. Please enter a valid VSAM dataset name.

} +
+
+ } + + { !showProgress ? + + + : + null + } + + + {!showProgress ? null : + + + + + + + } + + + )} - - - {!showProgress ? null : - - - - - - - } -
From 53fadfe37efcf348230030248caed7067dc8609b Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 3 Oct 2024 16:37:00 +0530 Subject: [PATCH 439/455] Final changes --- src/renderer/components/stages/Vsam.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index cc2d1afe..90bf7222 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -317,6 +317,18 @@ const Vsam = () => { } }; setYamlConfig(updatedYaml); + if(event.target.value.toUpperCase() !== 'VSAM') { + setVsamStageStatus(true); + } else { + setVsamStageStatus(false); + setShowProgress(false); + } + } + + const setVsamStageStatus = (status: boolean) => { + dispatch(setVsamStatus(status)); + dispatch(setNextStepEnabled(status)); + setStageSkipStatus(!status); } return ( From a077b62c1104c31a59d122ed493179dd108d9c5a Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 3 Oct 2024 18:41:14 +0530 Subject: [PATCH 440/455] Skipping the stage for mode other than vsam --- src/renderer/components/stages/Vsam.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 90bf7222..58f5d83a 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -106,6 +106,10 @@ const Vsam = () => { alertEmitter.emit('hideAlert'); updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); + + if(storageMode.toUpperCase() != 'VSAM') { + dispatch(setVsamStatus(false)); + } } }, []); @@ -317,15 +321,11 @@ const Vsam = () => { } }; setYamlConfig(updatedYaml); - if(event.target.value.toUpperCase() !== 'VSAM') { - setVsamStageStatus(true); - } else { - setVsamStageStatus(false); - setShowProgress(false); - } + setStageOnStorageModeChange(false); } - const setVsamStageStatus = (status: boolean) => { + const setStageOnStorageModeChange = (status: boolean) => { + setShowProgress(status); dispatch(setVsamStatus(status)); dispatch(setNextStepEnabled(status)); setStageSkipStatus(!status); From 5a1c8d47b9b4234ddc02a382531bc6b750aa33df Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Mon, 7 Oct 2024 15:33:50 +0530 Subject: [PATCH 441/455] State change updates --- src/renderer/components/stages/Vsam.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 58f5d83a..a47b6039 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -321,6 +321,12 @@ const Vsam = () => { } }; setYamlConfig(updatedYaml); + if(event.target.value.toUpperCase() !== 'VSAM') { + Object.keys(vsamInitProgress).forEach(key => { + vsamInitProgress[key as keyof InitSubStepsState] = false; + }); + setVsamInitializationProgress(vsamInitProgress); + } setStageOnStorageModeChange(false); } From 8a7e5d87ddeefea0e0bc2159b1bc706da1216140 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Mon, 7 Oct 2024 15:41:56 +0530 Subject: [PATCH 442/455] Removing the additional function --- src/renderer/components/stages/Vsam.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index a47b6039..7029bcaa 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -327,14 +327,8 @@ const Vsam = () => { }); setVsamInitializationProgress(vsamInitProgress); } - setStageOnStorageModeChange(false); - } - - const setStageOnStorageModeChange = (status: boolean) => { - setShowProgress(status); - dispatch(setVsamStatus(status)); - dispatch(setNextStepEnabled(status)); - setStageSkipStatus(!status); + setShowProgress(false); + dispatchActions(false); } return ( From 349961b0a2ea6c1f613774a9d8a38fafe1bf286f Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 8 Oct 2024 19:56:00 +0530 Subject: [PATCH 443/455] Updating the installation handler to fetch the version --- src/actions/InstallationHandler.ts | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 67c8f710..abc9359e 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -119,6 +119,15 @@ class Installation { const zoweRuntimePath = installationArgs.installationDir; let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); let parsedSchema = false, parsedYaml = false; + let manifestFile; + if(readPaxYamlAndSchema.details.schemas.manifestFile) { + const manifestFileFromPax = readPaxYamlAndSchema.details.schemas.manifestFile; + if(manifestFileFromPax) { + let manifestFileObj = JSON.parse(manifestFileFromPax); + console.log(manifestFileObj); + manifestFile = manifestFileObj; + } + } if(readPaxYamlAndSchema.details.yaml){ const yamlFromPax = readPaxYamlAndSchema.details.yaml; if(yamlFromPax){ @@ -164,7 +173,7 @@ class Installation { ConfigurationStore.setSchema(FALLBACK_SCHEMA); return {status: false, details: {message: 'no schemas found from pax'}} } - return {status: parsedSchema && parsedYaml, details: {message: "Successfully retrieved example-zowe.yaml and schemas", mergedYaml: yamlObj}} + return {status: parsedSchema && parsedYaml, details: {message: "Successfully retrieved example-zowe.yaml and schemas", mergedYaml: yamlObj, manifestFile}} } } catch (e) { ConfigurationStore.setSchema(FALLBACK_SCHEMA); @@ -246,14 +255,16 @@ class Installation { } } let yamlObj = {}; + let manifestFile = {}; await this.getExampleYamlAndSchemas(connectionArgs, installationArgs).then((res: IResponse) => { if(res.status){ + manifestFile = res.details.manifestFile; if(res.details.mergedYaml != undefined){ yamlObj = res.details.mergedYaml; } } }) - return {status: download.status && uploadYaml.status && upload.status && unpax.status, details: {message: 'Zowe unpax successful.', mergedYaml: yamlObj}}; + return {status: download.status && uploadYaml.status && upload.status && unpax.status, details: {message: 'Zowe unpax successful.', mergedYaml: yamlObj, manifestFile}}; } catch (error) { return {status: false, details: error.message}; } @@ -612,10 +623,12 @@ export class FTPInstallation extends Installation { const yamlSchema = await new FileTransfer().download(connectionArgs, yamlSchemaPath, DataType.ASCII); const serverCommonPath = `${installDir}/schemas/server-common.json`; const serverCommon = await new FileTransfer().download(connectionArgs, serverCommonPath, DataType.ASCII); - return {status: true, details: {yaml, schemas: {yamlSchema, serverCommon}}}; + const manifestFilePath = `${installDir}/manifest.json`; + const manifestFile = await new FileTransfer().download(connectionArgs, manifestFilePath, DataType.ASCII); + return {status: true, details: {yaml, schemas: {yamlSchema, serverCommon, manifestFile}}}; } catch (e) { console.log("Error downloading example-zowe.yaml and schemas:", e.message); - return {status: false, details: {yaml: '', schemas: {yamlSchema: '', serverCommon: ''}}}; + return {status: false, details: {yaml: '', schemas: {yamlSchema: '', serverCommon: '', manifestFile: ''}}}; } } From 389229a2dfc3ac09c3cd8d33600c95698476038e Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 8 Oct 2024 19:56:37 +0530 Subject: [PATCH 444/455] Storing the version --- src/renderer/components/stages/Unpax.tsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 5be12b3f..318d8741 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -18,7 +18,7 @@ import { selectConnectionArgs } from './connection/connectionSlice'; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails } from "../../../services/StageDetails"; import { setDownloadUnpaxStatus } from './progress/progressSlice'; -import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationArguments, getInstallationTypeStatus, getProgress, setDownloadUnpaxState, updateStepSkipStatus } from "./progress/StageProgressStatus"; +import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationArguments, getInstallationTypeStatus, getProgress, setDownloadUnpaxState, setZoweVersion, updateStepSkipStatus } from "./progress/StageProgressStatus"; import React from "react"; import ProgressCard from "../common/ProgressCard"; import { alertEmitter } from "../Header"; @@ -171,6 +171,11 @@ const Unpax = () => { alertEmitter.emit('showAlert', res.details, 'error'); updateProgress(false); } + + if(res.details?.manifestFile?.version) { + setZowePaxVersion(res.details?.manifestFile?.version); + } + if(res.details?.mergedYaml != undefined){ dispatch(setYaml(res.details.mergedYaml)); window.electron.ipcRenderer.setConfig(res.details.mergedYaml); @@ -194,6 +199,12 @@ const Unpax = () => { } } + const setZowePaxVersion = (version: string): void => { + const versionString = version; + const majorVersion = parseInt(versionString.split('.')[0], 10); + setZoweVersion(majorVersion); + } + const fetchExampleYaml = (event: any) => { setIsYamlFetched(true); event.preventDefault(); @@ -211,6 +222,9 @@ const Unpax = () => { alertEmitter.emit('showAlert', res.details.message ? res.details.message : res.details, 'error'); updateProgress(false); } + if(res.details?.manifestFile?.version) { + setZowePaxVersion(res.details?.manifestFile?.version); + } if(res.details?.mergedYaml != undefined){ dispatch(setYaml(res.details.mergedYaml)); window.electron.ipcRenderer.setConfig(res.details.mergedYaml); From 67701b7d8fa607073267fe61a3bbb9ae4d34cd89 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 8 Oct 2024 19:57:21 +0530 Subject: [PATCH 445/455] Updatig the local storage --- .../components/stages/progress/StageProgressStatus.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 8f6fe326..4eaa0558 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -155,6 +155,7 @@ let prevInstallationKey = `prev_installation`; let skipSubStateKey = `skip_sub_state`; let skipStateKey = `skip_state`; let installationArgsKey = `intallation_args`; +let paxVersionKey = `pax_version`; let subStepSkipKeysArray: (keyof subStepState)[] = Object.keys(subStepSkipStatus) as (keyof subStepState)[]; let stepSkipKeysArray: (keyof stepSkipState)[] = Object.keys(stepSkipStatus) as (keyof stepSkipState)[]; @@ -175,6 +176,7 @@ const setKeys = (id: string) => { skipSubStateKey = `${skipSubStateKey}_${id}`; skipStateKey = `${skipStateKey}_${id}`; installationArgsKey = `${installationArgsKey}_${id}`; + paxVersionKey = `${paxVersionKey}_${id}`; } export const initializeProgress = (host: string, user: string, isResume: boolean) => { @@ -589,4 +591,13 @@ export const getPreviousInstallation = () : ActiveState => { } } +export const setZoweVersion = (version: number): void => { + localStorage.setItem(paxVersionKey, version.toString()); +} + +export const getZoweVersion = () : number => { + const version = localStorage.getItem(paxVersionKey); + return version ? Number(version) : NaN; +} + From 60b5ac26ac7ce7721c6a869f91c1f6cf6247f094 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 8 Oct 2024 19:59:13 +0530 Subject: [PATCH 446/455] Updating the vsam ui --- src/renderer/components/stages/Vsam.tsx | 41 +++++++++++++++---------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 7029bcaa..409a2286 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -24,7 +24,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { getProgress, setVsamInitState, updateSubStepSkipStatus, getInstallationArguments, getVsamInitState, isInitializationStageComplete } from "./progress/StageProgressStatus"; +import { getProgress, setVsamInitState, updateSubStepSkipStatus, getInstallationArguments, getVsamInitState, isInitializationStageComplete, getZoweVersion } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; import { INIT_STAGE_LABEL, ajv } from "../common/Utils"; @@ -63,6 +63,8 @@ const Vsam = () => { const [showVsameDatsetName, setShowVsamDatasetName] = useState(false); const [storageMode, setStorageMode] = useState(yaml?.components[`caching-service`]?.storage?.mode); const storageModeOptions = ['VSAM', 'INFINISPAN']; + const zowePaxVersion: number = getZoweVersion(); + const [showStorageModeOptions, setShowStorageModeOptions] = useState(false); let timer: any; @@ -75,6 +77,9 @@ const Vsam = () => { }, [stageStatus]); useEffect(() => { + + (zowePaxVersion < 3) ? setStorageMode('VSAM') : setShowStorageModeOptions(true); + let nextPosition; const stepProgress = getProgress('vsamStatus'); @@ -351,22 +356,24 @@ const Vsam = () => { {!isFormValid &&
{formError}
} - - Storage Mode - - + { showStorageModeOptions && + + Storage Mode + + + } { storageMode.toUpperCase() !== 'VSAM' ? <> : ( From 287395a2a794817c87fb798e2fddaf736600476b Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 8 Oct 2024 20:14:13 +0530 Subject: [PATCH 447/455] Reformations --- src/actions/InstallationHandler.ts | 9 ++++----- src/renderer/components/stages/Unpax.tsx | 3 +++ test-results/.last-run.json | 6 ++++++ 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 test-results/.last-run.json diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index abc9359e..3a49408c 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -120,11 +120,10 @@ class Installation { let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); let parsedSchema = false, parsedYaml = false; let manifestFile; - if(readPaxYamlAndSchema.details.schemas.manifestFile) { + if(readPaxYamlAndSchema?.details?.schemas?.manifestFile) { const manifestFileFromPax = readPaxYamlAndSchema.details.schemas.manifestFile; if(manifestFileFromPax) { let manifestFileObj = JSON.parse(manifestFileFromPax); - console.log(manifestFileObj); manifestFile = manifestFileObj; } } @@ -257,9 +256,9 @@ class Installation { let yamlObj = {}; let manifestFile = {}; await this.getExampleYamlAndSchemas(connectionArgs, installationArgs).then((res: IResponse) => { - if(res.status){ - manifestFile = res.details.manifestFile; - if(res.details.mergedYaml != undefined){ + if(res?.status){ + manifestFile = res.details?.manifestFile; + if(res.details?.mergedYaml != undefined){ yamlObj = res.details.mergedYaml; } } diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index 318d8741..d0e8c295 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -200,6 +200,9 @@ const Unpax = () => { } const setZowePaxVersion = (version: string): void => { + if(!version) { + return; + } const versionString = version; const majorVersion = parseInt(versionString.split('.')[0], 10); setZoweVersion(majorVersion); diff --git a/test-results/.last-run.json b/test-results/.last-run.json new file mode 100644 index 00000000..357fc334 --- /dev/null +++ b/test-results/.last-run.json @@ -0,0 +1,6 @@ +{ + "status": "failed", + "failedTests": [ + "2b962727bf865e9a02a6-d7c6ff0b30e719507283" + ] +} \ No newline at end of file From bece60f8eb53577bbdb0c4fd5f6b27572c689412 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Tue, 8 Oct 2024 21:14:35 +0530 Subject: [PATCH 448/455] Updating the review stage --- src/renderer/components/stages/ReviewInstallation.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index d351c43e..c54297be 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -25,7 +25,7 @@ import { setActiveStep } from './progress/activeStepSlice'; import { setNextStepEnabled } from '../configuration-wizard/wizardSlice'; import { getStageDetails } from "../../../services/StageDetails"; import { TYPE_YAML, TYPE_OUTPUT } from '../common/Utils'; -import { getCompleteProgress, updateStepSkipStatus } from "./progress/StageProgressStatus"; +import { getCompleteProgress, getZoweVersion, updateStepSkipStatus } from "./progress/StageProgressStatus"; import '../../styles/ReviewInstallation.css'; @@ -43,6 +43,8 @@ const ReviewInstallation = () => { const connectionArgs = useAppSelector(selectConnectionArgs); + const zowePaxVersion: number = getZoweVersion(); + const theme = createTheme(); const completeProgress = getCompleteProgress(); @@ -70,8 +72,13 @@ const ReviewInstallation = () => { const stageProgress = stageProgressStatus.every(status => status === true); const subStageProgress = subStageProgressStatus.every(status => status === true); + const vsamIndex = subStageProgressStatus.findIndex(status => status === completeProgress.vsamStatus); + const allExceptVsamTrue = subStageProgressStatus.filter((_, index) => index !== vsamIndex).every(status => status === true); - if(stageProgress && subStageProgress) { + // For Zowe versions 3 and above, initializing VSAM is optional + if (zowePaxVersion < 3 && stageProgress && subStageProgress) { + updateProgress(true); + } else if(zowePaxVersion >= 3 && allExceptVsamTrue) { updateProgress(true); } else { updateProgress(false); From f7176b3b67ec4b5c9284748e3ac37d03f63728ff Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Wed, 9 Oct 2024 20:58:50 +0530 Subject: [PATCH 449/455] Restoring the review stage --- src/renderer/components/stages/ReviewInstallation.tsx | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index c54297be..47eb6aab 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -25,7 +25,7 @@ import { setActiveStep } from './progress/activeStepSlice'; import { setNextStepEnabled } from '../configuration-wizard/wizardSlice'; import { getStageDetails } from "../../../services/StageDetails"; import { TYPE_YAML, TYPE_OUTPUT } from '../common/Utils'; -import { getCompleteProgress, getZoweVersion, updateStepSkipStatus } from "./progress/StageProgressStatus"; +import { getCompleteProgress, updateStepSkipStatus } from "./progress/StageProgressStatus"; import '../../styles/ReviewInstallation.css'; @@ -43,8 +43,6 @@ const ReviewInstallation = () => { const connectionArgs = useAppSelector(selectConnectionArgs); - const zowePaxVersion: number = getZoweVersion(); - const theme = createTheme(); const completeProgress = getCompleteProgress(); @@ -72,13 +70,8 @@ const ReviewInstallation = () => { const stageProgress = stageProgressStatus.every(status => status === true); const subStageProgress = subStageProgressStatus.every(status => status === true); - const vsamIndex = subStageProgressStatus.findIndex(status => status === completeProgress.vsamStatus); - const allExceptVsamTrue = subStageProgressStatus.filter((_, index) => index !== vsamIndex).every(status => status === true); - // For Zowe versions 3 and above, initializing VSAM is optional - if (zowePaxVersion < 3 && stageProgress && subStageProgress) { - updateProgress(true); - } else if(zowePaxVersion >= 3 && allExceptVsamTrue) { + if (stageProgress && subStageProgress) { updateProgress(true); } else { updateProgress(false); From a22af3fd550c8c94988dfb403c581193bc4b5367 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 10 Oct 2024 12:18:39 +0530 Subject: [PATCH 450/455] Updating the completion status for the inifinispan --- .../components/stages/ReviewInstallation.tsx | 2 +- src/renderer/components/stages/Vsam.tsx | 40 ++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index 47eb6aab..d351c43e 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -71,7 +71,7 @@ const ReviewInstallation = () => { const stageProgress = stageProgressStatus.every(status => status === true); const subStageProgress = subStageProgressStatus.every(status => status === true); - if (stageProgress && subStageProgress) { + if(stageProgress && subStageProgress) { updateProgress(true); } else { updateProgress(false); diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index 409a2286..bd18cc88 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -80,6 +80,12 @@ const Vsam = () => { (zowePaxVersion < 3) ? setStorageMode('VSAM') : setShowStorageModeOptions(true); + if(storageMode.toUpperCase() !== 'VSAM' && zowePaxVersion >= 3) { + dispatchActions(true); + setShowProgress(false); + return; + } + let nextPosition; const stepProgress = getProgress('vsamStatus'); @@ -98,7 +104,7 @@ const Vsam = () => { if(stepProgress) { nextPosition = document.getElementById('vsam-progress'); - nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'end' }); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'center' }); } else { nextPosition = document.getElementById('container-box-id'); nextPosition?.scrollIntoView({behavior: 'smooth'}); @@ -111,10 +117,6 @@ const Vsam = () => { alertEmitter.emit('hideAlert'); updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); - - if(storageMode.toUpperCase() != 'VSAM') { - dispatch(setVsamStatus(false)); - } } }, []); @@ -151,19 +153,23 @@ const Vsam = () => { }, [showProgress, stateUpdated]); useEffect(() => { - const allAttributesTrue = Object.values(vsamInitProgress).every(value => value === true); - if(allAttributesTrue) { - dispatchActions(true); - setShowProgress(initClicked || getProgress('vsamStatus')); - } + verifyAndSetVsamInitCompletion(vsamInitProgress); }, [vsamInitProgress]); const setVsamInitializationProgress = (vsamInitState: InitSubStepsState) => { setVsamInitProgress(vsamInitState); setVsamInitState(vsamInitState); + verifyAndSetVsamInitCompletion(vsamInitState); + } + + const verifyAndSetVsamInitCompletion = (vsamInitState: InitSubStepsState, selectedStorageMode?: string) => { const allAttributesTrue = Object.values(vsamInitState).every(value => value === true); if(allAttributesTrue) { dispatchActions(true); + setShowProgress(initClicked || getProgress('vsamStatus')); + } else if (selectedStorageMode && selectedStorageMode.toUpperCase() == 'VSAM') { + dispatchActions(false); + setShowProgress(false); } } @@ -302,7 +308,6 @@ const Vsam = () => { setAllowInitialization(regEx.test(dsName)); } - const cachingServiceChangeHandler = (newValue: string) => { alertEmitter.emit('hideAlert'); datasetValidation(newValue); @@ -326,14 +331,13 @@ const Vsam = () => { } }; setYamlConfig(updatedYaml); + if(event.target.value.toUpperCase() !== 'VSAM') { - Object.keys(vsamInitProgress).forEach(key => { - vsamInitProgress[key as keyof InitSubStepsState] = false; - }); - setVsamInitializationProgress(vsamInitProgress); + dispatchActions(true); + setShowProgress(false); + } else { + verifyAndSetVsamInitCompletion(vsamInitProgress, event.target.value); } - setShowProgress(false); - dispatchActions(false); } return ( @@ -409,7 +413,7 @@ const Vsam = () => { null } - + {!showProgress ? null : From 0f531bc534e2f18899565eab95f6b10b6916676f Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 10 Oct 2024 12:40:04 +0530 Subject: [PATCH 451/455] Code cleanup - installation handler --- src/actions/InstallationHandler.ts | 31 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 3a49408c..048672aa 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -114,17 +114,21 @@ class Installation { try{ ProgressStore.set('downloadUnpax.getSchemas', false); ProgressStore.set('downloadUnpax.getExampleYaml', false); + const currentConfig: any = ConfigurationStore.getConfig(); let yamlObj const zoweRuntimePath = installationArgs.installationDir; let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); let parsedSchema = false, parsedYaml = false; + + const manifestFileFromPax = readPaxYamlAndSchema?.details?.schemas?.manifestFile; let manifestFile; - if(readPaxYamlAndSchema?.details?.schemas?.manifestFile) { - const manifestFileFromPax = readPaxYamlAndSchema.details.schemas.manifestFile; - if(manifestFileFromPax) { - let manifestFileObj = JSON.parse(manifestFileFromPax); - manifestFile = manifestFileObj; + + if(manifestFileFromPax) { + try { + manifestFile = JSON.parse(manifestFileFromPax); + } catch (error) { + console.error('Error parsing manifest file:', error); } } if(readPaxYamlAndSchema.details.yaml){ @@ -253,15 +257,22 @@ class Installation { return {status: false, details: `Error unpaxing Zowe archive: ${unpax.details}`}; } } + let yamlObj = {}; let manifestFile = {}; + await this.getExampleYamlAndSchemas(connectionArgs, installationArgs).then((res: IResponse) => { - if(res?.status){ - manifestFile = res.details?.manifestFile; - if(res.details?.mergedYaml != undefined){ - yamlObj = res.details.mergedYaml; - } + + if(!res?.status) { + return { status: false, details: { message: 'Failed to get YAML and schemas.' } }; } + + manifestFile = res.details?.manifestFile; + + if(res.details?.mergedYaml != undefined){ + yamlObj = res.details.mergedYaml; + } + }) return {status: download.status && uploadYaml.status && upload.status && unpax.status, details: {message: 'Zowe unpax successful.', mergedYaml: yamlObj, manifestFile}}; } catch (error) { From 7c513cbf16c3efae47cebfdcd8dbe52068b5108b Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Thu, 10 Oct 2024 12:42:18 +0530 Subject: [PATCH 452/455] Removing trash files --- test-results/.last-run.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 test-results/.last-run.json diff --git a/test-results/.last-run.json b/test-results/.last-run.json deleted file mode 100644 index 357fc334..00000000 --- a/test-results/.last-run.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "status": "failed", - "failedTests": [ - "2b962727bf865e9a02a6-d7c6ff0b30e719507283" - ] -} \ No newline at end of file From 753e2180f83270dedc86123a96338e8558dcdbac Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Mon, 14 Oct 2024 13:51:11 +0530 Subject: [PATCH 453/455] remaning vars related to zowe version --- src/renderer/components/stages/Unpax.tsx | 10 +++++----- src/renderer/components/stages/Vsam.tsx | 8 ++++---- .../components/stages/progress/StageProgressStatus.ts | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx index d0e8c295..f091d420 100644 --- a/src/renderer/components/stages/Unpax.tsx +++ b/src/renderer/components/stages/Unpax.tsx @@ -18,7 +18,7 @@ import { selectConnectionArgs } from './connection/connectionSlice'; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails } from "../../../services/StageDetails"; import { setDownloadUnpaxStatus } from './progress/progressSlice'; -import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationArguments, getInstallationTypeStatus, getProgress, setDownloadUnpaxState, setZoweVersion, updateStepSkipStatus } from "./progress/StageProgressStatus"; +import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationArguments, getInstallationTypeStatus, getProgress, setDownloadUnpaxState, setAndStoreZoweVersion, updateStepSkipStatus } from "./progress/StageProgressStatus"; import React from "react"; import ProgressCard from "../common/ProgressCard"; import { alertEmitter } from "../Header"; @@ -173,7 +173,7 @@ const Unpax = () => { } if(res.details?.manifestFile?.version) { - setZowePaxVersion(res.details?.manifestFile?.version); + setZoweVersion(res.details?.manifestFile?.version); } if(res.details?.mergedYaml != undefined){ @@ -199,13 +199,13 @@ const Unpax = () => { } } - const setZowePaxVersion = (version: string): void => { + const setZoweVersion = (version: string): void => { if(!version) { return; } const versionString = version; const majorVersion = parseInt(versionString.split('.')[0], 10); - setZoweVersion(majorVersion); + setAndStoreZoweVersion(majorVersion); } const fetchExampleYaml = (event: any) => { @@ -226,7 +226,7 @@ const Unpax = () => { updateProgress(false); } if(res.details?.manifestFile?.version) { - setZowePaxVersion(res.details?.manifestFile?.version); + setZoweVersion(res.details?.manifestFile?.version); } if(res.details?.mergedYaml != undefined){ dispatch(setYaml(res.details.mergedYaml)); diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx index bd18cc88..55cf47b1 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/Vsam.tsx @@ -24,7 +24,7 @@ import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; -import { getProgress, setVsamInitState, updateSubStepSkipStatus, getInstallationArguments, getVsamInitState, isInitializationStageComplete, getZoweVersion } from "./progress/StageProgressStatus"; +import { getProgress, setVsamInitState, updateSubStepSkipStatus, getInstallationArguments, getVsamInitState, isInitializationStageComplete, getCachedZoweVersion } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; import { INIT_STAGE_LABEL, ajv } from "../common/Utils"; @@ -63,7 +63,7 @@ const Vsam = () => { const [showVsameDatsetName, setShowVsamDatasetName] = useState(false); const [storageMode, setStorageMode] = useState(yaml?.components[`caching-service`]?.storage?.mode); const storageModeOptions = ['VSAM', 'INFINISPAN']; - const zowePaxVersion: number = getZoweVersion(); + const zoweVersion: number = getCachedZoweVersion(); const [showStorageModeOptions, setShowStorageModeOptions] = useState(false); let timer: any; @@ -78,9 +78,9 @@ const Vsam = () => { useEffect(() => { - (zowePaxVersion < 3) ? setStorageMode('VSAM') : setShowStorageModeOptions(true); + (zoweVersion < 3) ? setStorageMode('VSAM') : setShowStorageModeOptions(true); - if(storageMode.toUpperCase() !== 'VSAM' && zowePaxVersion >= 3) { + if(storageMode.toUpperCase() !== 'VSAM' && zoweVersion >= 3) { dispatchActions(true); setShowProgress(false); return; diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 4eaa0558..ed4b8499 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -591,11 +591,11 @@ export const getPreviousInstallation = () : ActiveState => { } } -export const setZoweVersion = (version: number): void => { +export const setAndStoreZoweVersion = (version: number): void => { localStorage.setItem(paxVersionKey, version.toString()); } -export const getZoweVersion = () : number => { +export const getCachedZoweVersion = () : number => { const version = localStorage.getItem(paxVersionKey); return version ? Number(version) : NaN; } From f1897288354825fdd138a827d75a2bd3f1591d8a Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Mon, 14 Oct 2024 14:31:10 +0530 Subject: [PATCH 454/455] Renaming vsamstage to caching service --- src/renderer/components/common/Utils.tsx | 2 +- .../configuration-wizard/Wizard.tsx | 8 +++---- .../stages/{Vsam.tsx => CachingService.tsx} | 22 +++++++++---------- .../components/stages/ReviewInstallation.tsx | 2 +- .../stages/progress/StageProgressStatus.ts | 4 ++-- .../stages/progress/progressSlice.ts | 12 +++++----- src/services/StageDetails.ts | 2 +- src/types/stateInterfaces.ts | 4 ++-- 8 files changed, 28 insertions(+), 28 deletions(-) rename src/renderer/components/stages/{Vsam.tsx => CachingService.tsx} (96%) diff --git a/src/renderer/components/common/Utils.tsx b/src/renderer/components/common/Utils.tsx index ed65f8b3..7ee9edc9 100644 --- a/src/renderer/components/common/Utils.tsx +++ b/src/renderer/components/common/Utils.tsx @@ -29,7 +29,7 @@ export const NETWORKING_STAGE_LABEL = "Networking"; export const APF_AUTH_STAGE_LABEL = "APF Auth"; export const SECURITY_STAGE_LABEL = "Security"; export const CERTIFICATES_STAGE_LABEL = "Certificates"; -export const VSAM_STAGE_LABEL = "Vsam"; +export const CACHING_SERVICE_LABEL = "Caching Service"; export const STC_STAGE_LABEL = "Stcs"; export const LAUNCH_CONFIG_STAGE_LABEL = "Launch Config"; export const REVIEW_INSTALL_STAGE_LABEL = "Review Installation"; diff --git a/src/renderer/components/configuration-wizard/Wizard.tsx b/src/renderer/components/configuration-wizard/Wizard.tsx index 02b600ab..8db4c86a 100644 --- a/src/renderer/components/configuration-wizard/Wizard.tsx +++ b/src/renderer/components/configuration-wizard/Wizard.tsx @@ -23,11 +23,11 @@ import { selectLoading } from './wizardSlice'; import { useAppSelector } from '../../hooks'; import InitApfAuth from '../stages/InitApfAuth'; import Networking from '../stages/Networking'; -import Vsam from '../stages/Vsam'; +import CachingService from '../stages/CachingService'; import LaunchConfig from '../stages/LaunchConfig'; import { getProgress } from '../stages/progress/StageProgressStatus'; import Unpax from '../stages/Unpax'; -import { APF_AUTH_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, CONNECTION_STAGE_LABEL, FINISH_INSTALL_STAGE_LABEL, INIT_STAGE_LABEL, INSTALLATION_TYPE_STAGE_LABEL, INSTALL_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL, NETWORKING_STAGE_LABEL, PLANNING_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, SECURITY_STAGE_LABEL, UNPAX_STAGE_LABEL, VSAM_STAGE_LABEL } from '../common/Utils'; +import { APF_AUTH_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, CONNECTION_STAGE_LABEL, FINISH_INSTALL_STAGE_LABEL, INIT_STAGE_LABEL, INSTALLATION_TYPE_STAGE_LABEL, INSTALL_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL, NETWORKING_STAGE_LABEL, PLANNING_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, SECURITY_STAGE_LABEL, UNPAX_STAGE_LABEL, CACHING_SERVICE_LABEL } from '../common/Utils'; const mvsDatasetInitProgress = getProgress('datasetInstallationStatus'); @@ -42,8 +42,8 @@ export const stages = [ {id: 2, label: APF_AUTH_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Security Setup', statusKey: 'apfAuthStatus'}, {id: 3, label: SECURITY_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to STC Setup', statusKey: 'securityStatus'}, {id: 4, label: 'Stcs', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Certificates Setup', statusKey: 'stcsStatus'}, - {id: 5, label: CERTIFICATES_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Vsam Setup', statusKey: 'certificateStatus'}, - {id: 6, label: VSAM_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Launch Setup', statusKey: 'vsamStatus'}, + {id: 5, label: CERTIFICATES_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Caching Service Setup', statusKey: 'certificateStatus'}, + {id: 6, label: CACHING_SERVICE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Launch Setup', statusKey: 'cachingServiceStatus'}, {id: 7, label: LAUNCH_CONFIG_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Instance Setup', statusKey: 'launchConfigStatus'}, ], nextButton: 'Review', statusKey: 'initializationStatus'}, {id: 5, label: REVIEW_INSTALL_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, hasOutput: false, steps: 1, nextButton: 'Finish Installation', statusKey: 'reviewStatus'}, diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/CachingService.tsx similarity index 96% rename from src/renderer/components/stages/Vsam.tsx rename to src/renderer/components/stages/CachingService.tsx index 55cf47b1..b822cc49 100644 --- a/src/renderer/components/stages/Vsam.tsx +++ b/src/renderer/components/stages/CachingService.tsx @@ -12,7 +12,7 @@ import { useState, useEffect, useRef } from "react"; import { Box, Button, FormControl, InputLabel, Select, TextField, MenuItem } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; -import { setInitializationStatus, setVsamStatus } from './progress/progressSlice'; +import { setInitializationStatus, setCachingServiceStatus } from './progress/progressSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; @@ -29,11 +29,11 @@ import { InitSubStepsState } from "../../../types/stateInterfaces"; import { alertEmitter } from "../Header"; import { INIT_STAGE_LABEL, ajv } from "../common/Utils"; -const Vsam = () => { +const CachingService = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - const subStageLabel = 'Vsam'; + const subStageLabel = 'Caching Service'; const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); @@ -46,7 +46,7 @@ const Vsam = () => { const yaml = useAppSelector(selectYaml); const [setupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.vsam); const setupYaml = yaml?.zowe?.setup?.vsam; - const [showProgress, setShowProgress] = useState(getProgress('vsamStatus')); + const [showProgress, setShowProgress] = useState(getProgress('cachingServiceStatus')); const [init, setInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); const [isFormValid, setIsFormValid] = useState(false); @@ -87,7 +87,7 @@ const Vsam = () => { } let nextPosition; - const stepProgress = getProgress('vsamStatus'); + const stepProgress = getProgress('cachingServiceStatus'); dispatch(setInitializationStatus(isInitializationStageComplete())); setShowProgress(initClicked || stepProgress); @@ -121,7 +121,7 @@ const Vsam = () => { }, []); useEffect(() => { - setShowProgress(initClicked || getProgress('vsamStatus')); + setShowProgress(initClicked || getProgress('cachingServiceStatus')); if(initClicked) { let nextPosition = document.getElementById('start-vsam-progress'); @@ -132,7 +132,7 @@ const Vsam = () => { }, [initClicked]); useEffect(() => { - if(!getProgress('vsamStatus') && initClicked) { + if(!getProgress('cachingServiceStatus') && initClicked) { timer = setInterval(() => { window.electron.ipcRenderer.getInitVsamProgress().then((res: any) => { setVsamInitializationProgress(res); @@ -166,7 +166,7 @@ const Vsam = () => { const allAttributesTrue = Object.values(vsamInitState).every(value => value === true); if(allAttributesTrue) { dispatchActions(true); - setShowProgress(initClicked || getProgress('vsamStatus')); + setShowProgress(initClicked || getProgress('cachingServiceStatus')); } else if (selectedStorageMode && selectedStorageMode.toUpperCase() == 'VSAM') { dispatchActions(false); setShowProgress(false); @@ -194,7 +194,7 @@ const Vsam = () => { } const dispatchActions = (status: boolean) => { - dispatch(setVsamStatus(status)); + dispatch(setCachingServiceStatus(status)); dispatch(setInitializationStatus(isInitializationStageComplete())); dispatch(setNextStepEnabled(status)); setStageSkipStatus(!status); @@ -347,7 +347,7 @@ const Vsam = () => { - + { editorVisible && { ); }; -export default Vsam; \ No newline at end of file +export default CachingService; \ No newline at end of file diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index d351c43e..823166e4 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -62,7 +62,7 @@ const ReviewInstallation = () => { completeProgress.securityStatus, completeProgress.stcsStatus, completeProgress.certificateStatus, - completeProgress.vsamStatus, + completeProgress.cachingServiceStatus, completeProgress.launchConfigStatus ]; diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index ed4b8499..371a53b5 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -39,7 +39,7 @@ const progressStatus: ProgressState = { securityStatus: false, stcsStatus: false, certificateStatus: false, - vsamStatus: false, + cachingServiceStatus: false, launchConfigStatus: false, reviewStatus: false, } @@ -549,7 +549,7 @@ export const isInitializationStageComplete = (): boolean => { const progress = localStorage.getItem(progressStateKey); if(progress) { const data:any = unflatten(JSON.parse(progress)); - return data.datasetInstallationStatus && data.networkingStatus && data.apfAuthStatus && data.securityStatus && data.stcsStatus && data.certificateStatus && data.vsamStatus && data.launchConfigStatus; + return data.datasetInstallationStatus && data.networkingStatus && data.apfAuthStatus && data.securityStatus && data.stcsStatus && data.certificateStatus && data.cachingServiceStatus && data.launchConfigStatus; } else { return false; } diff --git a/src/renderer/components/stages/progress/progressSlice.ts b/src/renderer/components/stages/progress/progressSlice.ts index f2faf24e..155c6876 100644 --- a/src/renderer/components/stages/progress/progressSlice.ts +++ b/src/renderer/components/stages/progress/progressSlice.ts @@ -26,7 +26,7 @@ const initialState: ProgressState = { securityStatus: getProgress('securityStatus') || false, stcsStatus: getProgress('stcsStatus') || false, certificateStatus: getProgress('certificateStatus') || false, - vsamStatus: getProgress('vsamStatus') || false, + cachingServiceStatus: getProgress('cachingServiceStatus') || false, launchConfigStatus: getProgress('launchConfigStatus') || false, reviewStatus: getProgress('reviewStatus') || false } @@ -78,9 +78,9 @@ export const progressSlice = createSlice({ state.certificateStatus = action.payload; setProgress('certificateStatus', action.payload); }, - setVsamStatus: (state, action: PayloadAction) => { - state.vsamStatus = action.payload; - setProgress('vsamStatus', action.payload); + setCachingServiceStatus: (state, action: PayloadAction) => { + state.cachingServiceStatus = action.payload; + setProgress('cachingServiceStatus', action.payload); }, setLaunchConfigStatus: (state, action: PayloadAction) => { state.launchConfigStatus = action.payload; @@ -93,7 +93,7 @@ export const progressSlice = createSlice({ } }); -export const { setConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setInitializationStatus, setDatasetInstallationStatus, setDownloadUnpaxStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setStcsStatus, setCertificateStatus, setVsamStatus, setLaunchConfigStatus, setReviewStatus } = progressSlice.actions; +export const { setConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setInitializationStatus, setDatasetInstallationStatus, setDownloadUnpaxStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setStcsStatus, setCertificateStatus, setCachingServiceStatus, setLaunchConfigStatus, setReviewStatus } = progressSlice.actions; export const selectConnectionStatus = (state: RootState) => state.progress.connectionStatus; export const selectPlanningStatus = (state: RootState) => state.progress.planningStatus; @@ -106,7 +106,7 @@ export const selectApfAuthStatus = (state: RootState) => state.progress.apfAuthS export const selectSecurityStatus = (state: RootState) => state.progress.securityStatus; export const selectStcsStatus = (state: RootState) => state.progress.stcsStatus; export const selectCertificateStatus = (state: RootState) => state.progress.certificateStatus; -export const selectVsamStatus = (state: RootState) => state.progress.vsamStatus; +export const selectCachingServiceStatus = (state: RootState) => state.progress.cachingServiceStatus; export const selectLaunchConfigStatus = (state: RootState) => state.progress.launchConfigStatus; export const selectReviewStatus = (state: RootState) => state.progress.reviewStatus; diff --git a/src/services/StageDetails.ts b/src/services/StageDetails.ts index 80bde377..620bea19 100644 --- a/src/services/StageDetails.ts +++ b/src/services/StageDetails.ts @@ -54,7 +54,7 @@ export const initSubStageSkipStatus = (): void => { skipStatus.security, skipStatus.stcs, skipStatus.certificate, - skipStatus.vsam, + skipStatus.cachingService, skipStatus.launchConfig ]; diff --git a/src/types/stateInterfaces.ts b/src/types/stateInterfaces.ts index 92b60976..50307213 100644 --- a/src/types/stateInterfaces.ts +++ b/src/types/stateInterfaces.ts @@ -20,7 +20,7 @@ export interface ProgressState { securityStatus: boolean; stcsStatus: boolean; certificateStatus: boolean; - vsamStatus: boolean; + cachingServiceStatus: boolean; launchConfigStatus: boolean; reviewStatus: boolean; } @@ -95,7 +95,7 @@ export interface subStepState { security: boolean, stcs: boolean, certificate: boolean, - vsam: boolean, + cachingService: boolean, launchConfig: boolean } From fa92f5eac51a7662dcd1c4ab90bd64c68b7952d4 Mon Sep 17 00:00:00 2001 From: Sakshi Bobade Date: Mon, 14 Oct 2024 17:27:08 +0530 Subject: [PATCH 455/455] forgotter obj --- src/renderer/components/stages/progress/StageProgressStatus.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 371a53b5..53b300b5 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -106,7 +106,7 @@ const subStepSkipStatus: subStepState = { security: false, stcs: false, certificate: false, - vsam: false, + cachingService: false, launchConfig: false }