From 9d5c6dee3585fe4871098c9417aba21a1c2ded1b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 19 Mar 2024 19:34:05 -0400 Subject: [PATCH 001/521] Wip logic to get example yaml and schemas from pax Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 3245eedd..e031e244 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -82,6 +82,18 @@ class Installation { download = upload = unpax = {status: true, details : ''} } + let readPaxYamlAndSchema = await this.readExYamlAndSchema(connectionArgs, installationArgs.installationType === "smpe" ? installationArgs.smpeDir : installationArgs.installationDir + "/runtime"); + // console.log('\n\n*** readPaxYamlAndSchema result:', JSON.stringify(readPaxYamlAndSchema.details)); + if(readPaxYamlAndSchema.details.yaml){ + // console.log("\n\nSCHEMA: "); + // console.log(JSON.stringify(readPaxYamlAndSchema.details.yaml)); + const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat /u/ts6330/zen-install2/runtime/example-zowe.yaml\\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(`\\"`, `"`)); + } + } + let installation; if(installationArgs.installationType !== "smpe"){ console.log("installing..."); @@ -227,6 +239,10 @@ class Installation { async initMVS(connectionArgs: IIpcConnectionArgs, installDir: string): Promise { return {status: false, details: 'Method not implemented.'} } + + async readExYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string): Promise{ + return {status: false, details: 'Method not implemented.'} + } } @@ -284,6 +300,16 @@ export class FTPInstallation extends Installation { return {status: result.rc === 0, details: result.jobOutput} } + async readExYamlAndSchema(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}} + } + async checkInstallData() { // FIXME: Refine installation data validation } From 45e70217b6015ebb666f45d62838e3c682c00f5e Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 19 Mar 2024 19:37:28 -0400 Subject: [PATCH 002/521] Use var and not my home dir 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 e031e244..a0fb3eb3 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -87,7 +87,7 @@ class Installation { if(readPaxYamlAndSchema.details.yaml){ // console.log("\n\nSCHEMA: "); // console.log(JSON.stringify(readPaxYamlAndSchema.details.yaml)); - const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat /u/ts6330/zen-install2/runtime/example-zowe.yaml\\r\\n`) + const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat ${installationArgs.installationDir}/runtime/example-zowe.yaml\\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(`\\"`, `"`)); From 6d2183b896c5735dc83b8ac7f2d8763e5af0a5f8 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 19 Mar 2024 21:57:59 -0400 Subject: [PATCH 003/521] Read example-zowe.yaml, zowe-yaml-schema.json and server-common.json from pax, then set to Zen storage Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 61 +++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index a0fb3eb3..4f796458 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -12,10 +12,11 @@ import { app } from 'electron'; import { DataType, FileTransfer } from "../services/FileTransfer"; import path from "path/posix"; import { Script } from "../services/RunScript"; -import { stringify } from 'yaml'; +import { parse, stringify } from 'yaml'; import { IIpcConnectionArgs, IResponse } from '../types/interfaces'; import { ProgressStore } from "../storage/ProgressStore"; import * as fs from 'fs'; +import { ConfigurationStore } from '../storage/ConfigurationStore'; class Installation { @@ -82,16 +83,64 @@ class Installation { download = upload = unpax = {status: true, details : ''} } - let readPaxYamlAndSchema = await this.readExYamlAndSchema(connectionArgs, installationArgs.installationType === "smpe" ? installationArgs.smpeDir : installationArgs.installationDir + "/runtime"); + let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; + let readPaxYamlAndSchema = await this.readExYamlAndSchema(connectionArgs, zoweRuntimePath); // console.log('\n\n*** readPaxYamlAndSchema result:', JSON.stringify(readPaxYamlAndSchema.details)); if(readPaxYamlAndSchema.details.yaml){ // console.log("\n\nSCHEMA: "); // console.log(JSON.stringify(readPaxYamlAndSchema.details.yaml)); - const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat ${installationArgs.installationDir}/runtime/example-zowe.yaml\\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(`\\"`, `"`)); + const parseCatCommandFromJobOutput = 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 = parseCatCommandFromJobOutput(`${zoweRuntimePath}/example-zowe.yaml`); + const currentConfig = ConfigurationStore.getConfig(); + if(yamlFromPax && (currentConfig == undefined || typeof currentConfig !== "object" || (typeof currentConfig !== "object" && Object.keys(currentConfig).length == 0))){ + try { + ConfigurationStore.setConfig(parse(yamlFromPax)); + } catch(e) { + console.log('error setting example-zowe.yaml:', e); + } + } + + if(readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ + const parseSchemas = function(inputString: string, catPath: string){ + const jobOutputSplit = inputString.split(`cat ${catPath}\\r\\n`) + if(jobOutputSplit[1]){ + const trimmedYamlSchema = jobOutputSplit[1].split(`Script finished.`); + // console.log('trimmedYamlSchema[0]:', trimmedYamlSchema[0]); + // console.log("\n\n *** trimmedYamlSchema[0]: ", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`)); + return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`); + } + return ""; + } + try { + // console.log('yaml Schema:', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); + let yamlSchema = JSON.parse(parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); + const serverCommon = JSON.parse(parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); + const currentSchema = ConfigurationStore.getSchema(); + if(yamlSchema && serverCommon && currentSchema === undefined){ + // FIXME: Link schema by $ref properly - https://jsonforms.io/docs/ref-resolving + 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 + } + console.log('Setting schema from runtime dir:', JSON.stringify(yamlSchema)); + ConfigurationStore.setSchema(yamlSchema); + } + } catch (e) { + console.log('error setting schema from pax:', e); + } + } + } let installation; From 572d9cdb13362e50cc64e19feb7492c537f97849 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 19 Mar 2024 22:01:17 -0400 Subject: [PATCH 004/521] Remove comments Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 4f796458..9de819e1 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -85,10 +85,7 @@ class Installation { let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; let readPaxYamlAndSchema = await this.readExYamlAndSchema(connectionArgs, zoweRuntimePath); - // console.log('\n\n*** readPaxYamlAndSchema result:', JSON.stringify(readPaxYamlAndSchema.details)); if(readPaxYamlAndSchema.details.yaml){ - // console.log("\n\nSCHEMA: "); - // console.log(JSON.stringify(readPaxYamlAndSchema.details.yaml)); const parseCatCommandFromJobOutput = function(catPath: string){ const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat ${catPath}\\r\\n`) if(jobOutputSplit[1]){ @@ -113,14 +110,11 @@ class Installation { const jobOutputSplit = inputString.split(`cat ${catPath}\\r\\n`) if(jobOutputSplit[1]){ const trimmedYamlSchema = jobOutputSplit[1].split(`Script finished.`); - // console.log('trimmedYamlSchema[0]:', trimmedYamlSchema[0]); - // console.log("\n\n *** trimmedYamlSchema[0]: ", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`)); return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`); } return ""; } try { - // console.log('yaml Schema:', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); let yamlSchema = JSON.parse(parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); const serverCommon = JSON.parse(parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); const currentSchema = ConfigurationStore.getSchema(); From c1be335ebc6fa5b27abf091ced6795254c76c659 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 19 Mar 2024 22:19:40 -0400 Subject: [PATCH 005/521] More efficient conditionals 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 9de819e1..bc3e9a0d 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -105,7 +105,8 @@ class Installation { } } - if(readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ + const currentSchema = ConfigurationStore.getSchema(); + if(currentSchema === undefined && readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ const parseSchemas = function(inputString: string, catPath: string){ const jobOutputSplit = inputString.split(`cat ${catPath}\\r\\n`) if(jobOutputSplit[1]){ @@ -117,8 +118,7 @@ class Installation { try { let yamlSchema = JSON.parse(parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); const serverCommon = JSON.parse(parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); - const currentSchema = ConfigurationStore.getSchema(); - if(yamlSchema && serverCommon && currentSchema === undefined){ + if(yamlSchema && serverCommon){ // FIXME: Link schema by $ref properly - https://jsonforms.io/docs/ref-resolving 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; From 8d9b305ed273731262b9dba1a960b7509b39042e Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Fri, 22 Mar 2024 01:41:09 -0400 Subject: [PATCH 006/521] Remove hard coded yaml and schema, only set config if one already exists. Values will be read from installationArgs after example-zowe.yaml is retrieved from pax if config does not exist Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 1317 ++----------------- 1 file changed, 74 insertions(+), 1243 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index f9fff767..6374c231 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -35,1201 +35,6 @@ import { getStageDetails } from "../stages/progress/progressStore"; // This is all I want to manually test for now. Future work can min/max this harder const JCL_UNIX_SCRIPT_CHARS = 55; -const EXAMPLE_YAML = { - "node": { - "home": "" - }, - "java": { - "home": "" - }, - "zOSMF": { - "host": "dvipa.my-company.com", - "port": 443, - "applId": "IZUDFLT" - }, - "zowe": { - "rbacProfileIdentifier": "1", - "logDirectory": "/global/zowe/logs", - "job": { - "prefix": "ZWE1", - "name": "ZWE1SV" - }, - "sysMessages": [ - "ZWEL0021I", - "ZWEL0018I", - "ZWEL0006I", - "ZWES1601I", - "ZWEL0008I", - "ZWEL0022I", - "ZWEL0001I", - "ZWEL0002I", - "ZWEAM000I", - "ZWED0031I", - "ZWES1013I" - ], - "launchScript": { - "logLevel": "info", - "onComponentConfigureFail": "warn" - }, - "extensionDirectory": "/global/zowe/extensions", - "certificate": { - "keystore": { - "alias": "localhost", - "password": "password", - "type": "PKCS12", - "file": "/global/zowe/keystore/localhost/localhost.keystore.p12" - }, - "pem": { - "key": "/global/zowe/keystore/localhost/localhost.key", - "certificate": "/global/zowe/keystore/localhost/localhost.cer", - "certificateAuthorities": "/global/zowe/keystore/local_ca/local_ca.cer" - }, - "truststore": { - "password": "password", - "type": "PKCS12", - "file": "/global/zowe/keystore/localhost/localhost.truststore.p12" - } - }, - "cookieIdentifier": "1", - "verifyCertificates": "STRICT", - "setup": { - "dataset": { - "authLoadlib": "IBMUSER.ZWEV2.SZWEAUTH", - "proclib": "USER.PROCLIB", - "authPluginLib": "IBMUSER.ZWEV2.CUST.ZWESAPL", - "prefix": "IBMUSER.ZWEV2", - "parmlib": "IBMUSER.ZWEV2.CUST.PARMLIB", - "loadlib": "IBMUSER.ZWEV2.SZWELOAD", - "parmlibMembers": { - "zis": "ZWESIP00" - }, - "jcllib": "IBMUSER.ZWEV2.CUST.JCLLIB" - }, - "certificate": { - "type": "PKCS12", - "pkcs12": { - "directory": "/var/zowe/keystore" - } - }, - "vsam": { - "volume": "", - "mode": "NONRLS", - "storageClass": "" - } - }, - "externalDomains": [ - "sample-domain.com" - ], - "externalPort": 7554, - "configmgr": { - "validation": "COMPONENT-COMPAT" - }, - "workspaceDirectory": "/global/zowe/workspace", - "runtimeDirectory": "", - "useConfigmgr": true - }, - "components": { - "metrics-service": { - "debug": false, - "enabled": false, - "port": 7551 - }, - "zss": { - "tls": true, - "enabled": true, - "crossMemoryServerName": "ZWESIS_STD", - "port": 7557, - "agent": { - "jwt": { - "fallback": true - } - } - }, - "explorer-uss": { - "enabled": true - }, - "jobs-api": { - "debug": false, - "enabled": false, - "port": 7558 - }, - "files-api": { - "debug": false, - "enabled": false, - "port": 7559 - }, - "explorer-mvs": { - "enabled": true - }, - "cloud-gateway": { - "debug": false, - "enabled": false, - "port": 7563 - }, - "explorer-jes": { - "enabled": true - }, - "api-catalog": { - "debug": false, - "enabled": true, - "port": 7552 - }, - "gateway": { - "debug": false, - "enabled": true, - "port": 7554, - "apiml": { - "security": { - "x509": { - "enabled": false - }, - "auth": { - "zosmf": { - "jwtAutoconfiguration": "auto", - "serviceId": "zosmf" - }, - "provider": "zosmf" - }, - "authorization": { - "endpoint": { - "enabled": false - }, - "provider": "" - } - } - }, - "server": { - "internal": { - "ssl": { - "enabled": false - }, - "enabled": false, - "port": 7550 - } - } - }, - "app-server": { - "debug": false, - "enabled": true, - "port": 7556 - }, - "caching-service": { - "debug": false, - "enabled": true, - "storage": { - "evictionStrategy": "reject", - "size": 10000, - "infinispan": { - "jgroups": { - "port": 7600 - } - }, - "mode": "VSAM", - "vsam": { - "name": "" - } - }, - "port": 7555 - }, - "discovery": { - "debug": false, - "enabled": true, - "port": 7553 - } - } -} - -var YAML_SCHEMA: any = { - "$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": false, - "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 - }, - } -} - - const Planning = () => { @@ -1320,15 +125,15 @@ const Planning = () => { } dispatch(setInstallationArgs({...installationArgs, installationDir: res.details.config?.zowe?.runtimeDirectory ?? ''})); } else { - dispatch(setYaml(EXAMPLE_YAML)); - setLocalYaml((EXAMPLE_YAML)); - dispatch(setSchema(YAML_SCHEMA)); - window.electron.ipcRenderer.setConfig(EXAMPLE_YAML).then((res: IResponse) => { - // yaml response - }); - window.electron.ipcRenderer.setSchema(YAML_SCHEMA).then((res: IResponse) => { - // schema response - }); + // dispatch(setYaml(EXAMPLE_YAML)); + // setLocalYaml((EXAMPLE_YAML)); + // dispatch(setSchema(YAML_SCHEMA)); + // window.electron.ipcRenderer.setConfig(EXAMPLE_YAML).then((res: IResponse) => { + // // yaml response + // }); + // window.electron.ipcRenderer.setSchema(YAML_SCHEMA).then((res: IResponse) => { + // // schema response + // }); } }) @@ -1622,9 +427,11 @@ 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) => { - // console.log('updated zowe.runtimeDirectory') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zowe.runtimeDirectory', e.target.value).then((res: any) => { + // console.log('updated zowe.runtimeDirectory') + }) + } }} />

Readable z/OS Unix location for Zowe source files. Approximate space: {`${requiredSpace}MB`}

@@ -1642,9 +449,11 @@ 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) => { - // console.log('updated zowe.workspaceDirectory') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zowe.workspaceDirectory', e.target.value).then((res: any) => { + // console.log('updated zowe.workspaceDirectory') + }) + } }} />

Read and writeable z/OS Unix location for the Zowe workspace.

@@ -1662,9 +471,11 @@ 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) => { - // console.log('updated zowe.logDirectory') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zowe.logDirectory', e.target.value).then((res: any) => { + // console.log('updated zowe.logDirectory') + }) + } }} />

Read and writeable z/OS Unix location for Zowe's logs.

@@ -1682,9 +493,11 @@ 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) => { - // console.log('updated zowe.extensionDirectory') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zowe.extensionDirectory', e.target.value).then((res: any) => { + // console.log('updated zowe.extensionDirectory') + }) + } }} />

Read and writeable z/OS Unix location to contain Zowe's extensions.

@@ -1701,9 +514,11 @@ 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) => { - // console.log('updated zowe.rbacProfileIdentifier') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zowe.rbacProfileIdentifier', e.target.value).then((res: any) => { + // console.log('updated zowe.rbacProfileIdentifier') + }) + } }} />

ID used for determining resource names as used in RBAC authorization checks.

@@ -1722,9 +537,11 @@ 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) => { - // console.log('updated zowe.job.name') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zowe.job.name', e.target.value).then((res: any) => { + // console.log('updated zowe.job.name') + }) + } }} />

Job name of the Zowe primary ZWESLSTC started task.

@@ -1741,9 +558,11 @@ 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) => { - // console.log('updated zowe.job.prefi') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zowe.job.prefix', e.target.value).then((res: any) => { + // console.log('updated zowe.job.prefi') + }) + } }} />

Short prefix to identify/customize address spaces created by the Zowe job.

@@ -1760,9 +579,11 @@ 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) => { - // console.log('updated zowe.cookieIdentifier') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zowe.cookieIdentifier', e.target.value).then((res: any) => { + // console.log('updated zowe.cookieIdentifier') + }) + } }} />

ID that can be used by the servers to distinguish their cookies from unrelated Zowe installs.

@@ -1779,9 +600,11 @@ Please customize the job statement below to match your system requirements. 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) => { - // console.log('updated zowe.java.home') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('java.home', e.target.value).then((res: any) => { + // console.log('updated zowe.java.home') + }) + } }} />

z/OS Unix location of Java.

@@ -1798,9 +621,11 @@ Please customize the job statement below to match your system requirements. 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) => { - // console.log('updated zowe.node.home') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('node.home', e.target.value).then((res: any) => { + // console.log('updated zowe.node.home') + }) + } }} />

z/OS Unix location of Node.js.

@@ -1835,9 +660,11 @@ 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) => { - // console.log('updated zowe.zOSMF.host') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zOSMF.host', e.target.value).then((res: any) => { + // console.log('updated zowe.zOSMF.host') + }) + } }} />

Host (or domain name) of your z/OSMF instance.

@@ -1855,9 +682,11 @@ 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) => { - // console.log('updated zowe.zOSMF.port') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zOSMF.port', Number(e.target.value)).then((res: any) => { + // console.log('updated zowe.zOSMF.port') + }) + } }} />

Port number of your z/OSMF instance.

@@ -1876,9 +705,11 @@ 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) => { - // console.log('updated zowe.zOSMF.applId') - }) + if(localYaml){ + window.electron.ipcRenderer.setConfigByKey('zOSMF.applId', e.target.value).then((res: any) => { + // console.log('updated zowe.zOSMF.applId') + }) + } }} />

Application ID of your z/OSMF instance.

From 75a2e5c753cdedf2fe3db85f84f58c81c38a556c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 24 Mar 2024 20:42:05 -0400 Subject: [PATCH 007/521] Add interface for installation args Signed-off-by: Timothy Gerstel --- .../stages/installation/installationSlice.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/renderer/components/stages/installation/installationSlice.ts b/src/renderer/components/stages/installation/installationSlice.ts index 91c3b6a9..0d403723 100644 --- a/src/renderer/components/stages/installation/installationSlice.ts +++ b/src/renderer/components/stages/installation/installationSlice.ts @@ -11,6 +11,27 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '../../../store'; +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: { installationDir: string; From ba7037aa26b6d4a2361bfe22c9c156e258e713dc Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 24 Mar 2024 20:42:52 -0400 Subject: [PATCH 008/521] If yaml does not exist, previously entered values from the planning stage are now set in the yaml Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 45 ++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index bc3e9a0d..f8a142fc 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -17,12 +17,13 @@ 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'; class Installation { public async runInstallation ( connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string, userUploadedPaxPath: string, smpeDir: string}, + installationArgs: InstallationArgs, version: string, zoweConfig: any, skipDownload: boolean @@ -99,7 +100,47 @@ class Installation { const currentConfig = ConfigurationStore.getConfig(); if(yamlFromPax && (currentConfig == undefined || typeof currentConfig !== "object" || (typeof currentConfig !== "object" && Object.keys(currentConfig).length == 0))){ try { - ConfigurationStore.setConfig(parse(yamlFromPax)); + let yamlObj = parse(yamlFromPax); + if (installationArgs.installationDir) { + yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; + } + if (installationArgs.workspaceDir) { + yamlObj.zowe.workspaceDir = 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; + } + ConfigurationStore.setConfig(yamlObj); } catch(e) { console.log('error setting example-zowe.yaml:', e); } From 0290b6afb3a291003ce9eb9a636537370da51cf5 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 1 Apr 2024 12:15:13 -0400 Subject: [PATCH 009/521] Fix logic 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 f8a142fc..89a18826 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -98,7 +98,7 @@ class Installation { } const yamlFromPax = parseCatCommandFromJobOutput(`${zoweRuntimePath}/example-zowe.yaml`); const currentConfig = ConfigurationStore.getConfig(); - if(yamlFromPax && (currentConfig == undefined || typeof currentConfig !== "object" || (typeof currentConfig !== "object" && Object.keys(currentConfig).length == 0))){ + if(yamlFromPax && (currentConfig == undefined || typeof currentConfig !== "object" || (typeof currentConfig === "object" && Object.keys(currentConfig).length == 0))){ try { let yamlObj = parse(yamlFromPax); if (installationArgs.installationDir) { From 00e2b7d3998a4a2861a3663487753970b5fd9a0a Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 1 Apr 2024 12:17:16 -0400 Subject: [PATCH 010/521] workspaceDir -> workspaceDirectory 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 89a18826..b7afda5a 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -105,7 +105,7 @@ class Installation { yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; } if (installationArgs.workspaceDir) { - yamlObj.zowe.workspaceDir = installationArgs.workspaceDir; + yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; } if (installationArgs.logDir) { yamlObj.zowe.logDirectory = installationArgs.logDir; From 70392341c7ba8165629261e347f9f38cf1234638 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 1 Apr 2024 21:50:03 -0400 Subject: [PATCH 011/521] Add comment about ajv issue 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 b7afda5a..b47cf8e0 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -161,6 +161,7 @@ class Installation { const serverCommon = JSON.parse(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.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; From e1d9d9aae955094899d04d13cc907ac278e69c17 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 9 Apr 2024 19:02:30 -0400 Subject: [PATCH 012/521] Use installation args interface Signed-off-by: Timothy Gerstel --- src/actions/InstallActions.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index 734b40fb..88d009f5 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -8,6 +8,7 @@ * Copyright Contributors to the Zowe Project. */ +import { InstallationArgs } from '../renderer/components/stages/installation/installationSlice'; import { IIpcConnectionArgs, IResponse } from '../types/interfaces'; import { FTPInstallation, CLIInstallation } from './InstallationHandler'; @@ -42,7 +43,7 @@ export class InstallActions { runInstallation ( connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string, userUploadedPaxPath: string, smpeDir: string}, + installationArgs: InstallationArgs, version: string, zoweConfig: any, skipDownload: boolean): Promise { return this.strategy.runInstallation(connectionArgs, installationArgs, version, zoweConfig, skipDownload); } From 3404b16f0db9729ae94649092c36ba30740b0095 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 9 Apr 2024 19:40:52 -0400 Subject: [PATCH 013/521] Get instlalation args in case that user quit app before downloading a version of zowe (when the schema/example yaml would be retrieved), make validate use correct values Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 39 ++++++++++++--------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 6374c231..e47975ef 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -101,6 +101,12 @@ const Planning = () => { 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) { dispatch(setYaml(res.details.config)); @@ -234,23 +240,23 @@ const Planning = () => { e.preventDefault(); setValidationDetails({...validationDetails, error: ''}); - if (!localYaml?.java?.home || !localYaml?.node?.home || !localYaml?.zowe?.runtimeDirectory) { - console.warn('Please fill in all values'); - alertEmitter.emit('showAlert', 'Please fill in all values', 'error'); - //showAlert('Please fill in all values', 'success', 5000); - return; - } + // if (!localYaml?.java?.home || !localYaml?.node?.home || !localYaml?.zowe?.runtimeDirectory) { + // console.warn('Please fill in all values'); + // alertEmitter.emit('showAlert', 'Please fill in all values', 'error'); + // //showAlert('Please fill in all values', 'success', 5000); + // return; + // } dispatch(setLoading(true)); // 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), - window.electron.ipcRenderer.checkNode(connectionArgs, localYaml?.node?.home), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.runtimeDirectory), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.workspaceDirectory), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.extensionDirectory), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.logDirectory), + 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')); @@ -337,6 +343,7 @@ const Planning = () => { const newInstallationArgs = { ...installationArgs, [installationArg]: value }; dispatch(setInstallationArgs(newInstallationArgs)); setInstArgs(newInstallationArgs); + window.electron.ipcRenderer.setConfigByKey("installationArgs", newInstallationArgs); } const updatedYaml: any = updateAndReturnYaml(key, value) @@ -445,7 +452,7 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="Workspace Directory" variant="standard" - value={localYaml?.zowe?.workspaceDirectory || installationArgs.workspaceDir} + value={localYaml?.zowe?.workspaceDirectory || installationArgs.workspaceDir || "/global/zowe/workspace"} inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.workspaceDirectory", e.target.value, "workspaceDir"); @@ -467,7 +474,7 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="Log Directory" variant="standard" - value={localYaml?.zowe?.logDirectory || installationArgs.logDir} + value={localYaml?.zowe?.logDirectory || installationArgs.logDir || "/global/zowe/logs"} inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.logDirectory", e.target.value, "logDir"); @@ -489,7 +496,7 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="Extensions Directory" variant="standard" - value={localYaml?.zowe?.extensionDirectory || installationArgs.extensionDir} + value={localYaml?.zowe?.extensionDirectory || installationArgs.extensionDir || "/global/zowe/extensions"} inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.extensionDirectory", e.target.value, "extensionDir"); @@ -657,7 +664,7 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="z/OSMF Host" variant="standard" - value={localYaml?.zOSMF?.host || installationArgs.zosmfHost} + value={localYaml?.zOSMF?.host || installationArgs.zosmfHost || "dvipa.my-company.com"} onChange={(e) => { formChangeHandler("zOSMF.host", e.target.value, "zosmfHost"); if(localYaml){ From 998a03cb09fdbf476dbbd9b0d23c9b2efb7b83a9 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 9 Apr 2024 19:50:37 -0400 Subject: [PATCH 014/521] Hard code some installation values for the 'first run' scenario of Zen where the pax has not been downloaded yet and the schema/yaml have not been copied Signed-off-by: Timothy Gerstel --- .../stages/installation/Installation.tsx | 67 ++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index cd59f375..3ddaac39 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -44,10 +44,71 @@ const Installation = () => { const subStageId = 0; const dispatch = useAppDispatch(); const schema = useAppSelector(selectSchema); + const [DEFAULT_DATASET_SCHEMA] = useState( { + "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": { + "type": "string", + "description": "A 1-8-char all caps dataset member name", + "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" + } + } + }); const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); const connectionArgs = useAppSelector(selectConnectionArgs); - const setupSchema = schema?.properties?.zowe?.properties?.setup?.properties?.dataset; - const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset); + const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset ?? DEFAULT_DATASET_SCHEMA); + const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset || { + prefix: "IBMUSER.ZWEV2", + proclib: "USER.PROCLIB", + parmlib: "IBMUSER.ZWEV2.CUST.PARMLIB", + parmlibMembers: { + zis: "ZWESIP00" + }, + jcllib: "IBMUSER.ZWEV2.CUST.JCLLIB", + loadlib: "IBMUSER.ZWEV2.SZWELOAD", + authLoadlib: "IBMUSER.ZWEV2.SZWEAUTH", + authPluginLib: "IBMUSER.ZWEV2.CUST.ZWESAPL" + }); const [showProgress, toggleProgress] = useState(false); const [isFormInit, setIsFormInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); @@ -80,6 +141,8 @@ const Installation = () => { let validate: any; if(schema) { datasetSchema = schema?.properties?.zowe?.properties?.setup?.properties?.dataset; + } else { + datasetSchema = DEFAULT_DATASET_SCHEMA; } if(datasetSchema) { From 53ac5a3bf7f504f3edb4be0762b39a64ad4cfdc7 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 11 Apr 2024 23:31:33 -0400 Subject: [PATCH 015/521] Update schema when user runs zwe install 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 b47cf8e0..119ddb59 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -146,8 +146,8 @@ class Installation { } } - const currentSchema = ConfigurationStore.getSchema(); - if(currentSchema === undefined && readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ + //No reason not to always set schema to latest if user is re-running installation + if(readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ const parseSchemas = function(inputString: string, catPath: string){ const jobOutputSplit = inputString.split(`cat ${catPath}\\r\\n`) if(jobOutputSplit[1]){ From d09afb58bfac9f7cbcb3e931fcd1dd909f0ff67b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 11 Apr 2024 23:32:25 -0400 Subject: [PATCH 016/521] Add fallback schema and yaml for scenario where user does NOT run zwe install or zwe init, and therefore would not have a pax file to copy a yaml from Signed-off-by: Timothy Gerstel --- .../stages/installation/Installation.tsx | 1254 ++++++++++++++++- 1 file changed, 1203 insertions(+), 51 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 3ddaac39..3f908c7c 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -11,7 +11,7 @@ import React, {useCallback, useEffect, useRef, useState} from "react"; import { Box, Button, FormControl, Typography, debounce } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../../hooks'; -import { selectYaml, setYaml, selectSchema, setNextStepEnabled, setLoading } from '../../configuration-wizard/wizardSlice'; +import { selectYaml, setYaml, selectSchema, setNextStepEnabled, setLoading, setSchema } from '../../configuration-wizard/wizardSlice'; import { selectInstallationArgs, selectZoweVersion } from './installationSlice'; import { selectConnectionArgs } from '../connection/connectionSlice'; import { setDatasetInstallationStatus, setInitializationStatus ,selectDatasetInstallationStatus, selectInitializationStatus } from "../progress/progressSlice"; @@ -43,60 +43,1205 @@ const Installation = () => { const stageId = 3; const subStageId = 0; const dispatch = useAppDispatch(); - const schema = useAppSelector(selectSchema); - const [DEFAULT_DATASET_SCHEMA] = useState( { - "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": { - "type": "string", - "description": "A 1-8-char all caps dataset member name", - "minLength": 1, - "maxLength": 8, + // 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?? + const [FALLBACK_SCHEMA] = useState({ + "$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": false, + "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" + } + } + ] + } } } - }, - "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" } + }, + "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 + }, } - }); + }) + const [FALLBACK_YAML] = useState({ + "node": { + "home": "" + }, + "java": { + "home": "" + }, + "zOSMF": { + "host": "dvipa.my-company.com", + "port": 443, + "applId": "IZUDFLT" + }, + "zowe": { + "rbacProfileIdentifier": "1", + "logDirectory": "/global/zowe/logs", + "job": { + "prefix": "ZWE1", + "name": "ZWE1SV" + }, + "sysMessages": [ + "ZWEL0021I", + "ZWEL0018I", + "ZWEL0006I", + "ZWES1601I", + "ZWEL0008I", + "ZWEL0022I", + "ZWEL0001I", + "ZWEL0002I", + "ZWEAM000I", + "ZWED0031I", + "ZWES1013I" + ], + "launchScript": { + "logLevel": "info", + "onComponentConfigureFail": "warn" + }, + "extensionDirectory": "/global/zowe/extensions", + "certificate": { + "keystore": { + "alias": "localhost", + "password": "password", + "type": "PKCS12", + "file": "/global/zowe/keystore/localhost/localhost.keystore.p12" + }, + "pem": { + "key": "/global/zowe/keystore/localhost/localhost.key", + "certificate": "/global/zowe/keystore/localhost/localhost.cer", + "certificateAuthorities": "/global/zowe/keystore/local_ca/local_ca.cer" + }, + "truststore": { + "password": "password", + "type": "PKCS12", + "file": "/global/zowe/keystore/localhost/localhost.truststore.p12" + } + }, + "cookieIdentifier": "1", + "verifyCertificates": "STRICT", + "setup": { + "dataset": { + "authLoadlib": "IBMUSER.ZWEV2.SZWEAUTH", + "proclib": "USER.PROCLIB", + "authPluginLib": "IBMUSER.ZWEV2.CUST.ZWESAPL", + "prefix": "IBMUSER.ZWEV2", + "parmlib": "IBMUSER.ZWEV2.CUST.PARMLIB", + "loadlib": "IBMUSER.ZWEV2.SZWELOAD", + "parmlibMembers": { + "zis": "ZWESIP00" + }, + "jcllib": "IBMUSER.ZWEV2.CUST.JCLLIB" + }, + "certificate": { + "type": "PKCS12", + "pkcs12": { + "directory": "/var/zowe/keystore" + } + }, + "vsam": { + "volume": "", + "mode": "NONRLS", + "storageClass": "" + } + }, + "externalDomains": [ + "sample-domain.com" + ], + "externalPort": 7554, + "configmgr": { + "validation": "COMPONENT-COMPAT" + }, + "workspaceDirectory": "/global/zowe/workspace", + "runtimeDirectory": "", + "useConfigmgr": true + }, + "components": { + "metrics-service": { + "debug": false, + "enabled": false, + "port": 7551 + }, + "zss": { + "tls": true, + "enabled": true, + "crossMemoryServerName": "ZWESIS_STD", + "port": 7557, + "agent": { + "jwt": { + "fallback": true + } + } + }, + "explorer-uss": { + "enabled": true + }, + "jobs-api": { + "debug": false, + "enabled": false, + "port": 7558 + }, + "files-api": { + "debug": false, + "enabled": false, + "port": 7559 + }, + "explorer-mvs": { + "enabled": true + }, + "cloud-gateway": { + "debug": false, + "enabled": false, + "port": 7563 + }, + "explorer-jes": { + "enabled": true + }, + "api-catalog": { + "debug": false, + "enabled": true, + "port": 7552 + }, + "gateway": { + "debug": false, + "enabled": true, + "port": 7554, + "apiml": { + "security": { + "x509": { + "enabled": false + }, + "auth": { + "zosmf": { + "jwtAutoconfiguration": "auto", + "serviceId": "zosmf" + }, + "provider": "zosmf" + }, + "authorization": { + "endpoint": { + "enabled": false + }, + "provider": "" + } + } + }, + "server": { + "internal": { + "ssl": { + "enabled": false + }, + "enabled": false, + "port": 7550 + } + } + }, + "app-server": { + "debug": false, + "enabled": true, + "port": 7556 + }, + "caching-service": { + "debug": false, + "enabled": true, + "storage": { + "evictionStrategy": "reject", + "size": 10000, + "infinispan": { + "jgroups": { + "port": 7600 + } + }, + "mode": "VSAM", + "vsam": { + "name": "" + } + }, + "port": 7555 + }, + "discovery": { + "debug": false, + "enabled": true, + "port": 7553 + } + } + }) + const reduxSchema = useAppSelector(selectSchema); + const [schema] = useState(typeof reduxSchema === "object" && Object.keys(reduxSchema).length > 0 ? reduxSchema : FALLBACK_SCHEMA); const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); const connectionArgs = useAppSelector(selectConnectionArgs); - const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset ?? DEFAULT_DATASET_SCHEMA); + const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset); const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset || { prefix: "IBMUSER.ZWEV2", proclib: "USER.PROCLIB", @@ -141,8 +1286,6 @@ const Installation = () => { let validate: any; if(schema) { datasetSchema = schema?.properties?.zowe?.properties?.setup?.properties?.dataset; - } else { - datasetSchema = DEFAULT_DATASET_SCHEMA; } if(datasetSchema) { @@ -158,6 +1301,15 @@ const Installation = () => { stages[stageId].isSkipped = isInitializationSkipped; setIsFormInit(true); + window.electron.ipcRenderer.getConfig().then((res: IResponse) => { + if(!res.status){ + //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 + dispatch(setYaml(FALLBACK_YAML)) + dispatch(setSchema(FALLBACK_SCHEMA)); + } + }) + + return () => { dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); } From 0f4fff6d4583bfdc17f3af4ad4ed6f6ab9de5644 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 16 Apr 2024 00:59:40 -0400 Subject: [PATCH 017/521] Make get-config only return config, add handler to get schema Signed-off-by: Timothy Gerstel --- src/main/index.ts | 10 ++++++++-- src/renderer/preload.ts | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 9e76bfee..33885819 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -92,8 +92,8 @@ const createWindow = (): void => { }); ipcMain.handle('get-config', async (event) => { - const res: any = await PlanningActions.getConfig(); - return res; + const res: any = await ConfigurationStore.getConfig(); + return {status: true, details: res}; }); ipcMain.handle('set-schema', async (event, schema: any) => { @@ -102,6 +102,12 @@ const createWindow = (): void => { }); + ipcMain.handle('get-schema', async (event, schema: any) => { + const res: any = await ConfigurationStore.getSchema(); + return {status: true, details: res}; + }); + + ipcMain.handle('get-config-by-key', async (_event, key: string) => { const res = await ConfigurationStore.getConfigByKey(key); return res; diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 2983446a..c2dc5a1b 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -40,6 +40,9 @@ contextBridge.exposeInMainWorld('electron', { setSchema(schema: any) { return ipcRenderer.invoke("set-schema", schema); }, + getSchema() { + return ipcRenderer.invoke("get-schema"); + }, checkZoweCLI() { return ipcRenderer.invoke("check-zowe-cli"); }, From d8195231414649f2267ce10d847aecb54d3b7a9c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 16 Apr 2024 01:00:50 -0400 Subject: [PATCH 018/521] Make condition for using example-zowe.yaml from pax less strict, merge values with existing instead. Todo: fix schema parsing functions which i believe are currently broken Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 119ddb59..2c7312f3 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -97,8 +97,8 @@ class Installation { return ""; } const yamlFromPax = parseCatCommandFromJobOutput(`${zoweRuntimePath}/example-zowe.yaml`); - const currentConfig = ConfigurationStore.getConfig(); - if(yamlFromPax && (currentConfig == undefined || typeof currentConfig !== "object" || (typeof currentConfig === "object" && Object.keys(currentConfig).length == 0))){ + const currentConfig: any = ConfigurationStore.getConfig(); + if(yamlFromPax){ try { let yamlObj = parse(yamlFromPax); if (installationArgs.installationDir) { @@ -140,10 +140,16 @@ class Installation { if (installationArgs.zosmfApplId) { yamlObj.zOSMF.applId = installationArgs.zosmfApplId; } + if (currentConfig) { + yamlObj = {...currentConfig, ...yamlObj} + } + console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); } catch(e) { - console.log('error setting example-zowe.yaml:', e); + console.log('error parsing example-zowe.yaml:', e); } + } else { + console.log("no yaml found from pax"); } //No reason not to always set schema to latest if user is re-running installation @@ -159,6 +165,8 @@ class Installation { try { let yamlSchema = JSON.parse(parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); const serverCommon = JSON.parse(parseSchemas(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){ // 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 From 66991b363fef4c8f4ac4b8c87f2bdac0bf767fa9 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 16 Apr 2024 01:03:01 -0400 Subject: [PATCH 019/521] This setConfigByKey was a redundant call Signed-off-by: Timothy Gerstel --- .../stages/installation/Installation.tsx | 58 +++++++++---------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 3f908c7c..1df2bc2f 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -1336,39 +1336,35 @@ const Installation = () => { const {javaHome, nodeHome, installationDir, installationType, smpeDir} = installationArgs; // 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), - ]).then(async () => { - if(installationType === 'smpe'){ - dispatch(setNextStepEnabled(true)); + if(installationType === 'smpe'){ + dispatch(setNextStepEnabled(true)); + dispatch(setDatasetInstallationStatus(true)); + dispatch(setInitializationStatus(true)); + dispatch(setLoading(false)); + } 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, setupYaml, skipDownload ?? false).then((res: IResponse) => { + if(!res.status){ //errors during runInstallation() + alertEmitter.emit('showAlert', res.details, 'error'); + } + dispatch(setNextStepEnabled(res.status)); + dispatch(setDatasetInstallationStatus(res.status)); dispatch(setDatasetInstallationStatus(true)); dispatch(setInitializationStatus(true)); - dispatch(setLoading(false)); - } 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'); - } - dispatch(setNextStepEnabled(res.status)); - dispatch(setDatasetInstallationStatus(res.status)); - dispatch(setDatasetInstallationStatus(true)); - dispatch(setInitializationStatus(true)); - clearInterval(timer); - }).catch(() => { - clearInterval(timer); - dispatch(setNextStepEnabled(false)); - dispatch(setInitializationStatus(false)); - dispatch(setDatasetInstallationStatus(false)); - stages[stageId].subStages[subStageId].isSkipped = true; - stages[stageId].isSkipped = true; - console.warn('Installation failed'); - }); - } - }) + clearInterval(timer); + }).catch(() => { + clearInterval(timer); + dispatch(setNextStepEnabled(false)); + dispatch(setInitializationStatus(false)); + dispatch(setDatasetInstallationStatus(false)); + stages[stageId].subStages[subStageId].isSkipped = true; + stages[stageId].isSkipped = true; + console.warn('Installation failed'); + }); + } } const debouncedChange = useCallback( From 92bee962e3b55185c2561f25d93d9aab254e3a9b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 16 Apr 2024 01:03:22 -0400 Subject: [PATCH 020/521] Separate getConfig and getSchema Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 24 +++++++++------------ 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index e47975ef..a5befde4 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -109,9 +109,9 @@ const Planning = () => { window.electron.ipcRenderer.getConfig().then((res: IResponse) => { if (res.status) { - dispatch(setYaml(res.details.config)); - setLocalYaml(res.details.config); - const schema = res.details.schema; + dispatch(setYaml(res.details)); + setLocalYaml(res.details); + // const schema = res.details.schema; // Leaving this as a comment because the note about setting $ref properly is still valid i think // FIXME: Link schema by $ref properly - https://jsonforms.io/docs/ref-resolving // schema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = serverSchema.$defs.datasetMember; @@ -121,7 +121,7 @@ const Planning = () => { // delete schema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; // schema.$defs.networkSettings.properties.server.properties.listenAddresses.items = serverSchema.$defs.ipv4 // } - dispatch(setSchema(schema)); + // dispatch(setSchema(schema)); let installationDir = ''; if (res.details.config?.zowe?.runtimeDirectory && res.details.config?.zowe?.workspaceDirectory) { const getParentDir = (path: string): string => path.split('/').filter((i: string, ind: number) => i || !ind).slice(0, -1).join('/'); @@ -130,16 +130,12 @@ const Planning = () => { if (runtimeParent === workspaceParent) installationDir = runtimeParent; } dispatch(setInstallationArgs({...installationArgs, installationDir: res.details.config?.zowe?.runtimeDirectory ?? ''})); - } else { - // dispatch(setYaml(EXAMPLE_YAML)); - // setLocalYaml((EXAMPLE_YAML)); - // dispatch(setSchema(YAML_SCHEMA)); - // window.electron.ipcRenderer.setConfig(EXAMPLE_YAML).then((res: IResponse) => { - // // yaml response - // }); - // window.electron.ipcRenderer.setSchema(YAML_SCHEMA).then((res: IResponse) => { - // // schema response - // }); + } + }) + + window.electron.ipcRenderer.getSchema().then((res: IResponse) => { + if (res.status) { + dispatch(setSchema(res.details)); } }) From fdd97b773b71e1c902aebabb0522fd367b7c2eb5 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Fri, 19 Apr 2024 14:58:43 -0400 Subject: [PATCH 021/521] 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 022/521] 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 c32ccb5ee3991aa0d62c22d3b54e6ba354b662e9 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 7 May 2024 18:52:38 -0400 Subject: [PATCH 023/521] Remove unsed var Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index ed4055ac..8539654d 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -1421,7 +1421,6 @@ const Installation = () => { setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(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'); From 57cf3ce4609a1a5b09943477665e52840d81385d Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 7 May 2024 19:43:40 -0400 Subject: [PATCH 024/521] Rmove code duplication Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 1cd3c44b..13ea1eef 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -31,6 +31,7 @@ class Installation { const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; const savingResult = await this.generateYamlFile(zoweConfig); if (!savingResult.status) { + console.log("failed to save yaml"); return savingResult; } @@ -337,13 +338,8 @@ class Installation { return {status: true, details: ''}; } - async uploadYaml(connectionArgs: IIpcConnectionArgs, installDir: string) { - 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) - 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} + async uploadYaml(connectionArgs: IIpcConnectionArgs, installDir: string): Promise { + return {status: false, details: 'Method not implemented.'} } async downloadPax(version: string): Promise { @@ -377,6 +373,7 @@ export class FTPInstallation extends Installation { async uploadYaml(connectionArgs: IIpcConnectionArgs, installDir: string) { const tempPath = path.join(app.getPath("temp"), "zowe.yaml"); const filePath = path.join(installDir, "zowe.yaml"); + console.log(`Uploading ${tempPath} to ${filePath}`) await new FileTransfer().upload(connectionArgs, tempPath, filePath, DataType.BINARY) const script = `chtag -t -c ISO8859-1 ${installDir}/zowe.yaml`; const result = await new Script().run(connectionArgs, script); From d6b4bb420d80d091b5dae2f466d7079c0e0392fb Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 7 May 2024 19:44:28 -0400 Subject: [PATCH 025/521] Fix log to set runtime dir and workspace dir Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index ff4219ea..7f5d2608 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -132,13 +132,13 @@ const Planning = () => { // } // dispatch(setSchema(schema)); let installationDir = ''; - if (res.details.config?.zowe?.runtimeDirectory && res.details.config?.zowe?.workspaceDirectory) { + if (res.details?.zowe?.runtimeDirectory && res.details?.zowe?.workspaceDirectory) { const getParentDir = (path: string): string => path.split('/').filter((i: string, ind: number) => i || !ind).slice(0, -1).join('/'); - const runtimeParent = getParentDir(res.details.config?.zowe?.runtimeDirectory); - const workspaceParent = getParentDir(res.details.config?.zowe?.workspaceDirectory); + const runtimeParent = getParentDir(res.details?.zowe?.runtimeDirectory); + const workspaceParent = getParentDir(res.details?.zowe?.workspaceDirectory); if (runtimeParent === workspaceParent) installationDir = runtimeParent; } - dispatch(setInstallationArgs({...installationArgs, installationDir: res.details.config?.zowe?.runtimeDirectory ?? ''})); + dispatch(setInstallationArgs({...installationArgs, installationDir: res.details?.zowe?.runtimeDirectory ?? ''})); } }) From 755321683e5cb6f6b88046cc2d3d124b079c83a1 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 7 May 2024 19:47:01 -0400 Subject: [PATCH 026/521] Rename functions for clarity Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 13ea1eef..d773eedc 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -121,7 +121,7 @@ class Installation { let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; let readPaxYamlAndSchema = await this.readExYamlAndSchema(connectionArgs, zoweRuntimePath); if(readPaxYamlAndSchema.details.yaml){ - const parseCatCommandFromJobOutput = function(catPath: string){ + 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.`); @@ -130,7 +130,7 @@ class Installation { } return ""; } - const yamlFromPax = parseCatCommandFromJobOutput(`${zoweRuntimePath}/example-zowe.yaml`); + const yamlFromPax = parseExampleYamlFromPax(`${zoweRuntimePath}/example-zowe.yaml`); const currentConfig: any = ConfigurationStore.getConfig(); if(yamlFromPax){ try { @@ -188,7 +188,7 @@ 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 parseSchemas = function(inputString: string, catPath: string){ + 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.`); @@ -197,8 +197,8 @@ class Installation { return ""; } try { - let yamlSchema = JSON.parse(parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); - const serverCommon = JSON.parse(parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); + 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`)); // 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){ From 93d76651ef61c6f88d7e30e1a7208e155e7461ff Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 12 May 2024 17:47:11 -0400 Subject: [PATCH 027/521] Set schema in redux if it does not exist Signed-off-by: Timothy Gerstel --- .../components/stages/installation/Installation.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 8539654d..1cc59ef5 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -1314,6 +1314,13 @@ const Installation = () => { dispatch(setSchema(FALLBACK_SCHEMA)); } }) + + 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)); + } + }) if(installationType === 'smpe') { const status = getProgress('datasetInstallationStatus'); From f1ab3d953a4cec75c3307f92d7d92f57941dd2b4 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 12 May 2024 18:12:23 -0400 Subject: [PATCH 028/521] Port must be number Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 7f5d2608..0d3ba378 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -344,7 +344,7 @@ const Planning = () => { setStep(0); } - const formChangeHandler = (key?: string, value?: string, installationArg?: string) => { + const formChangeHandler = (key?: string, value?: (string | number), installationArg?: string) => { setIsLocationsUpdated(true); setPlanningStatus(false); setLocationsValidated(false); @@ -369,7 +369,7 @@ const Planning = () => { setLocalYaml(updatedYaml); } - const updateAndReturnYaml = (key: string, value: string) => { + const updateAndReturnYaml = (key: string, value: string | number) => { const keys = key.split('.'); const updatedYaml: any = { ...localYaml }; @@ -706,7 +706,7 @@ Please customize the job statement below to match your system requirements. type="number" value={localYaml?.zOSMF?.port || installationArgs.zosmfPort} onChange={(e) => { - formChangeHandler("zOSMF.port", e.target.value, "zosmfPort"); + formChangeHandler("zOSMF.port", Number(e.target.value), "zosmfPort"); if(localYaml){ window.electron.ipcRenderer.setConfigByKey('zOSMF.port', Number(e.target.value)).then((res: any) => { // console.log('updated zowe.zOSMF.port') From 961f14492bb3383f3576b460017e92cb042e778c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 12 May 2024 18:13:05 -0400 Subject: [PATCH 029/521] Fallback schema needs additional properties for refs (to be fixed via ajv implementation) Signed-off-by: Timothy Gerstel --- .../components/stages/installation/Installation.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 1cc59ef5..508bdb2b 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -53,7 +53,7 @@ const Installation = () => { "title": "Zowe configuration file", "description": "Configuration file for Zowe (zowe.org) version 2.", "type": "object", - "additionalProperties": false, + "additionalProperties": true, "properties": { "zowe": { "type": "object", @@ -1243,7 +1243,7 @@ const Installation = () => { const [schema] = useState(typeof reduxSchema === "object" && Object.keys(reduxSchema).length > 0 ? reduxSchema : FALLBACK_SCHEMA); const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); const connectionArgs = useAppSelector(selectConnectionArgs); - const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset); + const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset || FALLBACK_SCHEMA.properties?.zowe?.properties?.setup?.properties?.dataset); const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset || { prefix: "IBMUSER.ZWEV2", proclib: "USER.PROCLIB", @@ -1308,10 +1308,9 @@ const Installation = () => { setIsFormInit(true); window.electron.ipcRenderer.getConfig().then((res: IResponse) => { - if(!res.status){ + 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 but not on disk dispatch(setYaml(FALLBACK_YAML)) - dispatch(setSchema(FALLBACK_SCHEMA)); } }) From 97099ccb096c14b8b5f5826175f7af654f98838c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 12 May 2024 18:50:01 -0400 Subject: [PATCH 030/521] Remove duplicate logic for upload when not skipping pax download 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 508bdb2b..4fe6e60f 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -1427,7 +1427,7 @@ 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'); } From 179225132a9b891206b65974fd6bed7ece206b42 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 12 May 2024 20:39:51 -0400 Subject: [PATCH 031/521] Remove duplciate upload code when skipping pax download Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index d773eedc..667de595 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -84,7 +84,7 @@ class Installation { } } 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: ''} + upload = download = {status: true, details: ''} ProgressStore.set('installation.download', true); } @@ -92,21 +92,6 @@ class Installation { 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); - - if(!upload.status){ - return {status: false, details: `Error uploading pax: ${upload.details}`}; - } - unpax = {status: false, details: ""}; if (!SMPE_INSTALL) { console.log("unpaxing..."); @@ -177,6 +162,9 @@ class Installation { if (currentConfig) { yamlObj = {...currentConfig, ...yamlObj} } + if (zoweConfig) { + yamlObj = {...zoweConfig, ...currentConfig} + } console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); } catch(e) { From 04812f5c33f478920219a4117bbb111ab9449655 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 12 May 2024 20:41:07 -0400 Subject: [PATCH 032/521] Set yaml if it does not exist on the first run of Zen Signed-off-by: Timothy Gerstel --- .../stages/installation/Installation.tsx | 78 +++++++++++++++---- 1 file changed, 62 insertions(+), 16 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 4fe6e60f..e15604ef 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -1244,18 +1244,7 @@ const Installation = () => { const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); const connectionArgs = useAppSelector(selectConnectionArgs); const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset || FALLBACK_SCHEMA.properties?.zowe?.properties?.setup?.properties?.dataset); - const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset || { - prefix: "IBMUSER.ZWEV2", - proclib: "USER.PROCLIB", - parmlib: "IBMUSER.ZWEV2.CUST.PARMLIB", - parmlibMembers: { - zis: "ZWESIP00" - }, - jcllib: "IBMUSER.ZWEV2.CUST.JCLLIB", - loadlib: "IBMUSER.ZWEV2.SZWELOAD", - authLoadlib: "IBMUSER.ZWEV2.SZWEAUTH", - authPluginLib: "IBMUSER.ZWEV2.CUST.ZWESAPL" - }); + 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); @@ -1266,7 +1255,7 @@ const Installation = () => { const [stateUpdated, setStateUpdated] = useState(false); const [initClicked, setInitClicked] = useState(false); - const installationArgs = useAppSelector(selectInstallationArgs); + const [installationArgs, setInstArgs] = useState(useAppSelector(selectInstallationArgs)); const version = useAppSelector(selectZoweVersion); let timer: any; const installationType = getInstallationTypeStatus().installationType; @@ -1308,9 +1297,66 @@ const Installation = () => { setIsFormInit(true); window.electron.ipcRenderer.getConfig().then((res: IResponse) => { - if(res.details === undefined){ + function mergeInstallationArgsAndYaml(yaml: any){ + let yamlObj = JSON.parse(JSON.stringify(yaml)); + console.log('merging yaml obj:', JSON.stringify(yamlObj)); + delete yamlObj.installationArgs; + 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 = Number(installationArgs.zosmfPort); + } + if (installationArgs.zosmfApplId) { + yamlObj.zOSMF.applId = installationArgs.zosmfApplId; + } + 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 - dispatch(setYaml(FALLBACK_YAML)) + let yamlObj = mergeInstallationArgsAndYaml(FALLBACK_YAML); + console.log('setting yaml:', yamlObj); + 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){ + console.log('setting yaml:',{...yamlObj, zowe: {...yamlObj.zowe, setup: {dataset: FALLBACK_YAML.zowe.setup.dataset}} }); + dispatch(setYaml({...yamlObj, zowe: {...yamlObj.zowe, setup: {dataset: FALLBACK_YAML.zowe.setup.dataset}} })); + } else { + dispatch(setYaml(yamlObj)); + } } }) @@ -1427,7 +1473,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, skipDownload ?? false).then((res: IResponse) => { if(!res.status){ //errors during runInstallation() alertEmitter.emit('showAlert', res.details, 'error'); } From 428836086378a70857c97d0faa898b9f9fe47869 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 12 May 2024 21:58:42 -0400 Subject: [PATCH 033/521] Parsing for job output may not be consistent?? had to change string manipulation for schemas. Fix init mvs runtime dir. return mergedYaml in runInstallation Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 667de595..7efdc2e6 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -102,7 +102,7 @@ class Installation { return {status: false, details: `Error unpaxing Zowe archive: ${unpax.details}`}; } } - + let yamlObj let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; let readPaxYamlAndSchema = await this.readExYamlAndSchema(connectionArgs, zoweRuntimePath); if(readPaxYamlAndSchema.details.yaml){ @@ -119,7 +119,7 @@ class Installation { const currentConfig: any = ConfigurationStore.getConfig(); if(yamlFromPax){ try { - let yamlObj = parse(yamlFromPax); + yamlObj = parse(yamlFromPax); if (installationArgs.installationDir) { yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; } @@ -160,10 +160,14 @@ class Installation { yamlObj.zOSMF.applId = installationArgs.zosmfApplId; } if (currentConfig) { + // console.log("current config:", JSON.stringify(currentConfig)); + // console.log("yamlObj: ", JSON.stringify(yamlObj)); yamlObj = {...currentConfig, ...yamlObj} + console.log("merged yamlObj: ", JSON.stringify(yamlObj)); } if (zoweConfig) { - yamlObj = {...zoweConfig, ...currentConfig} + console.log("zoweConfig:", JSON.stringify(zoweConfig)); + yamlObj = {...zoweConfig, ...yamlObj} } console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); @@ -179,7 +183,7 @@ class Installation { 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.`); + const trimmedYamlSchema = jobOutputSplit[1].split(`Script finished.`)[0].split(`Script finished.`); return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`); } return ""; @@ -227,7 +231,7 @@ class Installation { let initMvs; if(installation.status){ console.log("running zwe init mvs..."); - initMvs = await this.initMVS(connectionArgs, SMPE_INSTALL ? installationArgs.installationDir : installationArgs.installationDir + '/runtime'); + initMvs = await this.initMVS(connectionArgs, installationArgs.installationDir); ProgressStore.set('installation.initMVS', initMvs.status); } else { initMvs = {status: false, details: `zwe install step failed, unable to run zwe init mvs.`} @@ -238,7 +242,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: 'Zowe install successful.'}; + return {status: download.status && uploadYaml.status && upload.status && unpax.status && installation.status && initMvs.status, details: {message: 'Zowe install successful.', mergedYaml: yamlObj}}; } catch (error) { return {status: false, details: error.message}; } From 1afc3d5ef6b49e29e8dd91ea5301a32be52000a0 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Sun, 12 May 2024 21:59:12 -0400 Subject: [PATCH 034/521] Set merged yaml from pax file Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index e15604ef..cd46933b 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -1473,10 +1473,13 @@ 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, setupYaml, skipDownload ?? false).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)); + } updateProgress(true); clearInterval(timer); }).catch(() => { From 63dda96ce1b9236f326fbf5d0e3e21adc8d561e1 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 13 May 2024 22:09:17 -0400 Subject: [PATCH 035/521] Only use installaton args if they do not exist in the current yaml config Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 40 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 7efdc2e6..77129256 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -28,6 +28,7 @@ class Installation { 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) { @@ -116,55 +117,54 @@ class Installation { return ""; } const yamlFromPax = parseExampleYamlFromPax(`${zoweRuntimePath}/example-zowe.yaml`); - const currentConfig: any = ConfigurationStore.getConfig(); if(yamlFromPax){ try { yamlObj = parse(yamlFromPax); - if (installationArgs.installationDir) { + if (currentConfig) { + console.log("current config:", JSON.stringify(currentConfig)); + // console.log("yamlObj: ", JSON.stringify(yamlObj)); + yamlObj = {...currentConfig, ...yamlObj} + console.log("merged yamlObj: ", JSON.stringify(yamlObj)); + } + if (yamlObj.zowe.runtimeDirectory === undefined && installationArgs.installationDir) { yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; } - if (installationArgs.workspaceDir) { + if (yamlObj.zowe.workspaceDirectory === undefined && installationArgs.workspaceDir) { yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; } - if (installationArgs.logDir) { + if (yamlObj.zowe.logDirectory === undefined && installationArgs.logDir) { yamlObj.zowe.logDirectory = installationArgs.logDir; } - if (installationArgs.extensionDir) { + if (yamlObj.zowe.extensionDirectory === undefined && installationArgs.extensionDir) { yamlObj.zowe.extensionDirectory = installationArgs.extensionDir; } - if (installationArgs.rbacProfile) { + if (yamlObj.zowe.rbacProfileIdentifier === undefined && installationArgs.rbacProfile) { yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; } - if (installationArgs.jobName) { + if (yamlObj.zowe.job.name === undefined && installationArgs.jobName) { yamlObj.zowe.job.name = installationArgs.jobName; } - if (installationArgs.jobPrefix) { + if (yamlObj.zowe.job.prefix === undefined && installationArgs.jobPrefix) { yamlObj.zowe.job.prefix = installationArgs.jobPrefix; } - if (installationArgs.cookieId) { + if (yamlObj.zowe.cookieIdentifier === undefined && installationArgs.cookieId) { yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; } - if (installationArgs.javaHome) { + if (yamlObj.java.home === undefined && installationArgs.javaHome) { yamlObj.java.home = installationArgs.javaHome; } - if (installationArgs.nodeHome) { + if (yamlObj.node.home === undefined && installationArgs.nodeHome) { yamlObj.node.home = installationArgs.nodeHome; } - if (installationArgs.zosmfHost) { + if (yamlObj.zOSMF.host === undefined && installationArgs.zosmfHost) { yamlObj.zOSMF.host = installationArgs.zosmfHost; } - if (installationArgs.zosmfPort) { + if (yamlObj.zOSMF.port === undefined && installationArgs.zosmfPort) { yamlObj.zOSMF.port = installationArgs.zosmfPort; } - if (installationArgs.zosmfApplId) { + if (yamlObj.zOSMF.applId === undefined && installationArgs.zosmfApplId) { yamlObj.zOSMF.applId = installationArgs.zosmfApplId; } - if (currentConfig) { - // console.log("current config:", JSON.stringify(currentConfig)); - // console.log("yamlObj: ", JSON.stringify(yamlObj)); - yamlObj = {...currentConfig, ...yamlObj} - console.log("merged yamlObj: ", JSON.stringify(yamlObj)); - } if (zoweConfig) { console.log("zoweConfig:", JSON.stringify(zoweConfig)); yamlObj = {...zoweConfig, ...yamlObj} From 061a7d07e98a1c474d128ddccdf94cfa7c007814 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 13 May 2024 22:11:08 -0400 Subject: [PATCH 036/521] get installation args if they exist, set zowe.setup section correctly Signed-off-by: Timothy Gerstel --- .../stages/installation/Installation.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index cd46933b..625a1df8 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -1294,6 +1294,13 @@ const Installation = () => { nextPosition.scrollIntoView({behavior: 'smooth'}); } + window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { + if(res != undefined){ + // console.log("got installation args:", JSON.stringify(res)); + setInstArgs((res as any)); + } + }) + setIsFormInit(true); window.electron.ipcRenderer.getConfig().then((res: IResponse) => { @@ -1345,15 +1352,15 @@ const Installation = () => { 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 let yamlObj = mergeInstallationArgsAndYaml(FALLBACK_YAML); - console.log('setting yaml:', yamlObj); + // console.log('setting yaml:', yamlObj); setLYaml(yamlObj) dispatch(setYaml(yamlObj)) } else { - console.log('got config:', JSON.stringify(res.details)); + // 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: {dataset: FALLBACK_YAML.zowe.setup.dataset}} }); - dispatch(setYaml({...yamlObj, zowe: {...yamlObj.zowe, setup: {dataset: FALLBACK_YAML.zowe.setup.dataset}} })); + // 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)); } From 2ee21d4f72859f39f37d6c07bc04d7d1f4cbeecc Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 13 May 2024 22:34:34 -0400 Subject: [PATCH 037/521] zoweConfig is only zowe.setup.dataset from Installation Stage 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 77129256..54ff6f2e 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -25,7 +25,7 @@ class Installation { connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, version: string, - zoweConfig: any, + zoweConfig: any, //this is likely only zowe.setup.dataset from Installation.tsx installButtonOnClick call skipDownload: boolean ): Promise { const currentConfig: any = ConfigurationStore.getConfig(); @@ -167,7 +167,7 @@ class Installation { } if (zoweConfig) { console.log("zoweConfig:", JSON.stringify(zoweConfig)); - yamlObj = {...zoweConfig, ...yamlObj} + yamlObj.zowe.setup.dataset = zoweConfig; } console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); From 0e0e27272ca62091e997f106a864e2f5ba6b7513 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 13 May 2024 22:34:55 -0400 Subject: [PATCH 038/521] Remove console.log 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 54ff6f2e..3d9fb8a8 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -166,7 +166,6 @@ class Installation { yamlObj.zOSMF.applId = installationArgs.zosmfApplId; } if (zoweConfig) { - console.log("zoweConfig:", JSON.stringify(zoweConfig)); yamlObj.zowe.setup.dataset = zoweConfig; } console.log('Setting merged yaml:', JSON.stringify(yamlObj)); From de886388b5dd0d1abdaf142dc2d5bbd78f9e9ea5 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 13 May 2024 22:35:22 -0400 Subject: [PATCH 039/521] Merge objects 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 3d9fb8a8..788aba17 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -166,7 +166,7 @@ class Installation { yamlObj.zOSMF.applId = installationArgs.zosmfApplId; } if (zoweConfig) { - yamlObj.zowe.setup.dataset = zoweConfig; + yamlObj.zowe.setup.dataset = {... yamlObj.zowe.setup.dataset, ...zoweConfig}; } console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); From d0d5e9b4ce070607f64820ab5e10779dddcf538e Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 13 May 2024 22:43:19 -0400 Subject: [PATCH 040/521] This should actually be the whole zowe object Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 4 ++-- src/renderer/components/stages/installation/Installation.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 788aba17..515fd9e4 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -25,7 +25,7 @@ class Installation { connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, version: string, - zoweConfig: any, //this is likely only zowe.setup.dataset from Installation.tsx installButtonOnClick call + zoweConfig: any, skipDownload: boolean ): Promise { const currentConfig: any = ConfigurationStore.getConfig(); @@ -166,7 +166,7 @@ class Installation { yamlObj.zOSMF.applId = installationArgs.zosmfApplId; } if (zoweConfig) { - yamlObj.zowe.setup.dataset = {... yamlObj.zowe.setup.dataset, ...zoweConfig}; + yamlObj = {...yamlObj, ...zoweConfig}; } console.log('Setting merged yaml:', JSON.stringify(yamlObj)); ConfigurationStore.setConfig(yamlObj); diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 625a1df8..2c6117bb 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -1296,7 +1296,7 @@ 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)); setInstArgs((res as any)); } }) @@ -1480,7 +1480,7 @@ const Installation = () => { setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(true); dispatch(setLoading(false)); - window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, setupYaml, skipDownload ?? false).then((res: IResponse) => { + 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'); } From 1696af37aac1c7ac568698a55a23cf39d1b3b76c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 13 May 2024 23:04:23 -0400 Subject: [PATCH 041/521] set installationArgs.installationDir if it does not exist, but does exist in yaml as it is required in many functions of InstallationHandler.tsx Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/installation/Installation.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 2c6117bb..3bf390cb 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -12,7 +12,7 @@ import React, {useCallback, useEffect, useRef, 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 } from './installationSlice'; +import { selectInstallationArgs, selectZoweVersion, selectInstallationType, setInstallationArgs } from './installationSlice'; import { selectConnectionArgs } from '../connection/connectionSlice'; import { setDatasetInstallationStatus, setInitializationStatus } from "../progress/progressSlice"; import { IResponse } from '../../../../types/interfaces'; @@ -1310,6 +1310,9 @@ const Installation = () => { delete yamlObj.installationArgs; if (installationArgs.installationDir) { yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; + } else if(!installationArgs.installationDir && yamlObj.zowe.runtimeDirectory){ + //setting this because it is needed many places in InstallationHandler.tsx. This whole architecture has become an absolute mess. + dispatch(setInstallationArgs({...installationArgs, installationDir: yamlObj.zowe.runtimeDirectory})); } if (installationArgs.workspaceDir) { yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; From 4b05d6ba568106371d8f9ef7a1cc7a0f7804aa3b Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 13 May 2024 23:15:34 -0400 Subject: [PATCH 042/521] Set config on disk after getting example yaml from pax' 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 3bf390cb..9605e0e7 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -1489,6 +1489,7 @@ const Installation = () => { } if(res.details?.mergedYaml != undefined){ dispatch(setYaml(res.details.mergedYaml)); + window.electron.ipcRenderer.setConfig(res.details.mergedYaml); } updateProgress(true); clearInterval(timer); From 11ed3a58886be39856cfb09b3574a1b086a34e58 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 14 May 2024 08:43:04 -0400 Subject: [PATCH 043/521] 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 044/521] 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 3c925fda80ec25d99af1bbb22f8c85cb682c46c0 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 15 May 2024 17:02:03 -0400 Subject: [PATCH 045/521] example-zowe.yaml values should always be replaced with installationArgs if they exist Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 515fd9e4..1b6cde8a 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -126,43 +126,43 @@ class Installation { yamlObj = {...currentConfig, ...yamlObj} console.log("merged yamlObj: ", JSON.stringify(yamlObj)); } - 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; } if (zoweConfig) { From 2cfa7ccde3bd0b2e391fb20cbd38141c8720a3eb Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 15 May 2024 17:02:47 -0400 Subject: [PATCH 046/521] readEx -> readExample... 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 1b6cde8a..8dc88bb1 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -105,7 +105,7 @@ class Installation { } let yamlObj let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; - let readPaxYamlAndSchema = await this.readExYamlAndSchema(connectionArgs, zoweRuntimePath); + let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); if(readPaxYamlAndSchema.details.yaml){ const parseExampleYamlFromPax = function(catPath: string){ const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat ${catPath}\\r\\n`) @@ -353,7 +353,7 @@ class Installation { return {status: false, details: 'Method not implemented.'} } - async readExYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string): Promise{ + async readExampleYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string): Promise{ return {status: false, details: 'Method not implemented.'} } @@ -414,7 +414,7 @@ export class FTPInstallation extends Installation { return {status: result.rc === 0, details: result.jobOutput} } - async readExYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string){ + 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`; From 4020826dfa0dc821da553f49e3deade13d75969f Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 15 May 2024 17:04:56 -0400 Subject: [PATCH 047/521] Uncomment java/node/runtimeDir check Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 0d3ba378..234cbba4 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -255,12 +255,12 @@ const Planning = () => { e.preventDefault(); setValidationDetails({...validationDetails, error: ''}); - // if (!localYaml?.java?.home || !localYaml?.node?.home || !localYaml?.zowe?.runtimeDirectory) { - // console.warn('Please fill in all values'); - // alertEmitter.emit('showAlert', 'Please fill in all values', 'error'); - // //showAlert('Please fill in all values', 'success', 5000); - // return; - // } + if (!localYaml?.java?.home || !localYaml?.node?.home || !localYaml?.zowe?.runtimeDirectory) { + console.warn('Please fill in all values'); + alertEmitter.emit('showAlert', 'Please fill in all values', 'error'); + //showAlert('Please fill in all values', 'success', 5000); + return; + } dispatch(setLoading(true)); // TODO: Possible feature for future: add to checkDir to see if existing Zowe install exists. From 5e63e6ef3fc4546839adcd9a9898575c6a5e92d0 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 15 May 2024 17:12:25 -0400 Subject: [PATCH 048/521] Move fallback yaml and schema to own file. Use fallback in installation and planning stages Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 9 +- .../stages/installation/Installation.tsx | 1194 +---------------- src/utils/yamlSchemaDefaults.ts | 1193 ++++++++++++++++ 3 files changed, 1200 insertions(+), 1196 deletions(-) create mode 100644 src/utils/yamlSchemaDefaults.ts diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 234cbba4..b1e2b12e 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -30,6 +30,7 @@ import { setActiveStep } from './progress/activeStepSlice'; import EditorDialog from "../common/EditorDialog"; import { getStageDetails } from "../../../utils/StageDetails"; import { getProgress, getPlanningStageStatus, setPlanningValidationDetailsState, getPlanningValidationDetailsState } from "./progress/StageProgressStatus"; +import { FALLBACK_YAML } from "../../../utils/yamlSchemaDefaults"; // 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 @@ -470,7 +471,7 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="Workspace Directory" variant="standard" - value={localYaml?.zowe?.workspaceDirectory || installationArgs.workspaceDir || "/global/zowe/workspace"} + value={localYaml?.zowe?.workspaceDirectory || installationArgs.workspaceDir || FALLBACK_YAML.zowe.workspaceDirectory} inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.workspaceDirectory", e.target.value, "workspaceDir"); @@ -492,7 +493,7 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="Log Directory" variant="standard" - value={localYaml?.zowe?.logDirectory || installationArgs.logDir || "/global/zowe/logs"} + value={localYaml?.zowe?.logDirectory || installationArgs.logDir || FALLBACK_YAML.zowe.logDirectory} inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.logDirectory", e.target.value, "logDir"); @@ -514,7 +515,7 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="Extensions Directory" variant="standard" - value={localYaml?.zowe?.extensionDirectory || installationArgs.extensionDir || "/global/zowe/extensions"} + value={localYaml?.zowe?.extensionDirectory || installationArgs.extensionDir || FALLBACK_YAML.zowe.extensionDirectory} inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { formChangeHandler("zowe.extensionDirectory", e.target.value, "extensionDir"); @@ -682,7 +683,7 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="z/OSMF Host" variant="standard" - value={localYaml?.zOSMF?.host || installationArgs.zosmfHost || "dvipa.my-company.com"} + value={localYaml?.zOSMF?.host || installationArgs.zosmfHost || FALLBACK_YAML.zOSMF.host} onChange={(e) => { formChangeHandler("zOSMF.host", e.target.value, "zosmfHost"); if(localYaml){ diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index 9605e0e7..ebb460e1 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -28,6 +28,7 @@ import { setActiveStep } from "../progress/activeStepSlice"; import { getStageDetails, getSubStageDetails } from "../../../../utils/StageDetails"; import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; +import { FALLBACK_SCHEMA, FALLBACK_YAML } from "../../../../utils/yamlSchemaDefaults"; const Installation = () => { @@ -47,1198 +48,7 @@ const Installation = () => { 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?? - const [FALLBACK_SCHEMA] = useState({ - "$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 - }, - } - }) - const [FALLBACK_YAML] = useState({ - "node": { - "home": "" - }, - "java": { - "home": "" - }, - "zOSMF": { - "host": "dvipa.my-company.com", - "port": 443, - "applId": "IZUDFLT" - }, - "zowe": { - "rbacProfileIdentifier": "1", - "logDirectory": "/global/zowe/logs", - "job": { - "prefix": "ZWE1", - "name": "ZWE1SV" - }, - "sysMessages": [ - "ZWEL0021I", - "ZWEL0018I", - "ZWEL0006I", - "ZWES1601I", - "ZWEL0008I", - "ZWEL0022I", - "ZWEL0001I", - "ZWEL0002I", - "ZWEAM000I", - "ZWED0031I", - "ZWES1013I" - ], - "launchScript": { - "logLevel": "info", - "onComponentConfigureFail": "warn" - }, - "extensionDirectory": "/global/zowe/extensions", - "certificate": { - "keystore": { - "alias": "localhost", - "password": "password", - "type": "PKCS12", - "file": "/global/zowe/keystore/localhost/localhost.keystore.p12" - }, - "pem": { - "key": "/global/zowe/keystore/localhost/localhost.key", - "certificate": "/global/zowe/keystore/localhost/localhost.cer", - "certificateAuthorities": "/global/zowe/keystore/local_ca/local_ca.cer" - }, - "truststore": { - "password": "password", - "type": "PKCS12", - "file": "/global/zowe/keystore/localhost/localhost.truststore.p12" - } - }, - "cookieIdentifier": "1", - "verifyCertificates": "STRICT", - "setup": { - "dataset": { - "authLoadlib": "IBMUSER.ZWEV2.SZWEAUTH", - "proclib": "USER.PROCLIB", - "authPluginLib": "IBMUSER.ZWEV2.CUST.ZWESAPL", - "prefix": "IBMUSER.ZWEV2", - "parmlib": "IBMUSER.ZWEV2.CUST.PARMLIB", - "loadlib": "IBMUSER.ZWEV2.SZWELOAD", - "parmlibMembers": { - "zis": "ZWESIP00" - }, - "jcllib": "IBMUSER.ZWEV2.CUST.JCLLIB" - }, - "certificate": { - "type": "PKCS12", - "pkcs12": { - "directory": "/var/zowe/keystore" - } - }, - "vsam": { - "volume": "", - "mode": "NONRLS", - "storageClass": "" - } - }, - "externalDomains": [ - "sample-domain.com" - ], - "externalPort": 7554, - "configmgr": { - "validation": "COMPONENT-COMPAT" - }, - "workspaceDirectory": "/global/zowe/workspace", - "runtimeDirectory": "", - "useConfigmgr": true - }, - "components": { - "metrics-service": { - "debug": false, - "enabled": false, - "port": 7551 - }, - "zss": { - "tls": true, - "enabled": true, - "crossMemoryServerName": "ZWESIS_STD", - "port": 7557, - "agent": { - "jwt": { - "fallback": true - } - } - }, - "explorer-uss": { - "enabled": true - }, - "jobs-api": { - "debug": false, - "enabled": false, - "port": 7558 - }, - "files-api": { - "debug": false, - "enabled": false, - "port": 7559 - }, - "explorer-mvs": { - "enabled": true - }, - "cloud-gateway": { - "debug": false, - "enabled": false, - "port": 7563 - }, - "explorer-jes": { - "enabled": true - }, - "api-catalog": { - "debug": false, - "enabled": true, - "port": 7552 - }, - "gateway": { - "debug": false, - "enabled": true, - "port": 7554, - "apiml": { - "security": { - "x509": { - "enabled": false - }, - "auth": { - "zosmf": { - "jwtAutoconfiguration": "auto", - "serviceId": "zosmf" - }, - "provider": "zosmf" - }, - "authorization": { - "endpoint": { - "enabled": false - }, - "provider": "" - } - } - }, - "server": { - "internal": { - "ssl": { - "enabled": false - }, - "enabled": false, - "port": 7550 - } - } - }, - "app-server": { - "debug": false, - "enabled": true, - "port": 7556 - }, - "caching-service": { - "debug": false, - "enabled": true, - "storage": { - "evictionStrategy": "reject", - "size": 10000, - "infinispan": { - "jgroups": { - "port": 7600 - } - }, - "mode": "VSAM", - "vsam": { - "name": "" - } - }, - "port": 7555 - }, - "discovery": { - "debug": false, - "enabled": true, - "port": 7553 - } - } - }) + const reduxSchema = useAppSelector(selectSchema); const [schema] = useState(typeof reduxSchema === "object" && Object.keys(reduxSchema).length > 0 ? reduxSchema : FALLBACK_SCHEMA); const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); diff --git a/src/utils/yamlSchemaDefaults.ts b/src/utils/yamlSchemaDefaults.ts new file mode 100644 index 00000000..64e2e523 --- /dev/null +++ b/src/utils/yamlSchemaDefaults.ts @@ -0,0 +1,1193 @@ +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 + }, + } +} + +export const FALLBACK_YAML = { + "node": { + "home": "" + }, + "java": { + "home": "" + }, + "zOSMF": { + "host": "dvipa.my-company.com", + "port": 443, + "applId": "IZUDFLT" + }, + "zowe": { + "rbacProfileIdentifier": "1", + "logDirectory": "/global/zowe/logs", + "job": { + "prefix": "ZWE1", + "name": "ZWE1SV" + }, + "sysMessages": [ + "ZWEL0021I", + "ZWEL0018I", + "ZWEL0006I", + "ZWES1601I", + "ZWEL0008I", + "ZWEL0022I", + "ZWEL0001I", + "ZWEL0002I", + "ZWEAM000I", + "ZWED0031I", + "ZWES1013I" + ], + "launchScript": { + "logLevel": "info", + "onComponentConfigureFail": "warn" + }, + "extensionDirectory": "/global/zowe/extensions", + "certificate": { + "keystore": { + "alias": "localhost", + "password": "password", + "type": "PKCS12", + "file": "/global/zowe/keystore/localhost/localhost.keystore.p12" + }, + "pem": { + "key": "/global/zowe/keystore/localhost/localhost.key", + "certificate": "/global/zowe/keystore/localhost/localhost.cer", + "certificateAuthorities": "/global/zowe/keystore/local_ca/local_ca.cer" + }, + "truststore": { + "password": "password", + "type": "PKCS12", + "file": "/global/zowe/keystore/localhost/localhost.truststore.p12" + } + }, + "cookieIdentifier": "1", + "verifyCertificates": "STRICT", + "setup": { + "dataset": { + "authLoadlib": "IBMUSER.ZWEV2.SZWEAUTH", + "proclib": "USER.PROCLIB", + "authPluginLib": "IBMUSER.ZWEV2.CUST.ZWESAPL", + "prefix": "IBMUSER.ZWEV2", + "parmlib": "IBMUSER.ZWEV2.CUST.PARMLIB", + "loadlib": "IBMUSER.ZWEV2.SZWELOAD", + "parmlibMembers": { + "zis": "ZWESIP00" + }, + "jcllib": "IBMUSER.ZWEV2.CUST.JCLLIB" + }, + "certificate": { + "type": "PKCS12", + "pkcs12": { + "directory": "/var/zowe/keystore" + } + }, + "vsam": { + "volume": "", + "mode": "NONRLS", + "storageClass": "" + } + }, + "externalDomains": [ + "sample-domain.com" + ], + "externalPort": 7554, + "configmgr": { + "validation": "COMPONENT-COMPAT" + }, + "workspaceDirectory": "/global/zowe/workspace", + "runtimeDirectory": "", + "useConfigmgr": true + }, + "components": { + "metrics-service": { + "debug": false, + "enabled": false, + "port": 7551 + }, + "zss": { + "tls": true, + "enabled": true, + "crossMemoryServerName": "ZWESIS_STD", + "port": 7557, + "agent": { + "jwt": { + "fallback": true + } + } + }, + "explorer-uss": { + "enabled": true + }, + "jobs-api": { + "debug": false, + "enabled": false, + "port": 7558 + }, + "files-api": { + "debug": false, + "enabled": false, + "port": 7559 + }, + "explorer-mvs": { + "enabled": true + }, + "cloud-gateway": { + "debug": false, + "enabled": false, + "port": 7563 + }, + "explorer-jes": { + "enabled": true + }, + "api-catalog": { + "debug": false, + "enabled": true, + "port": 7552 + }, + "gateway": { + "debug": false, + "enabled": true, + "port": 7554, + "apiml": { + "security": { + "x509": { + "enabled": false + }, + "auth": { + "zosmf": { + "jwtAutoconfiguration": "auto", + "serviceId": "zosmf" + }, + "provider": "zosmf" + }, + "authorization": { + "endpoint": { + "enabled": false + }, + "provider": "" + } + } + }, + "server": { + "internal": { + "ssl": { + "enabled": false + }, + "enabled": false, + "port": 7550 + } + } + }, + "app-server": { + "debug": false, + "enabled": true, + "port": 7556 + }, + "caching-service": { + "debug": false, + "enabled": true, + "storage": { + "evictionStrategy": "reject", + "size": 10000, + "infinispan": { + "jgroups": { + "port": 7600 + } + }, + "mode": "VSAM", + "vsam": { + "name": "" + } + }, + "port": 7555 + }, + "discovery": { + "debug": false, + "enabled": true, + "port": 7553 + } + } +} \ No newline at end of file From 6d96cf489bde32736e85704c0a0df95ecd6ffbe6 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Thu, 16 May 2024 01:54:53 -0400 Subject: [PATCH 049/521] Re add checks for undefined because current config is already merged at this point Signed-off-by: Timothy Gerstel --- src/actions/InstallationHandler.ts | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 8dc88bb1..515fd9e4 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -105,7 +105,7 @@ class Installation { } let yamlObj let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; - let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); + let readPaxYamlAndSchema = await this.readExYamlAndSchema(connectionArgs, zoweRuntimePath); if(readPaxYamlAndSchema.details.yaml){ const parseExampleYamlFromPax = function(catPath: string){ const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat ${catPath}\\r\\n`) @@ -126,43 +126,43 @@ class Installation { yamlObj = {...currentConfig, ...yamlObj} console.log("merged yamlObj: ", JSON.stringify(yamlObj)); } - if (installationArgs.installationDir) { + if (yamlObj.zowe.runtimeDirectory === undefined && installationArgs.installationDir) { yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; } - if (installationArgs.workspaceDir) { + if (yamlObj.zowe.workspaceDirectory === undefined && installationArgs.workspaceDir) { yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; } - if (installationArgs.logDir) { + if (yamlObj.zowe.logDirectory === undefined && installationArgs.logDir) { yamlObj.zowe.logDirectory = installationArgs.logDir; } - if (installationArgs.extensionDir) { + if (yamlObj.zowe.extensionDirectory === undefined && installationArgs.extensionDir) { yamlObj.zowe.extensionDirectory = installationArgs.extensionDir; } - if (installationArgs.rbacProfile) { + if (yamlObj.zowe.rbacProfileIdentifier === undefined && installationArgs.rbacProfile) { yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; } - if (installationArgs.jobName) { + if (yamlObj.zowe.job.name === undefined && installationArgs.jobName) { yamlObj.zowe.job.name = installationArgs.jobName; } - if (installationArgs.jobPrefix) { + if (yamlObj.zowe.job.prefix === undefined && installationArgs.jobPrefix) { yamlObj.zowe.job.prefix = installationArgs.jobPrefix; } - if (installationArgs.cookieId) { + if (yamlObj.zowe.cookieIdentifier === undefined && installationArgs.cookieId) { yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; } - if (installationArgs.javaHome) { + if (yamlObj.java.home === undefined && installationArgs.javaHome) { yamlObj.java.home = installationArgs.javaHome; } - if (installationArgs.nodeHome) { + if (yamlObj.node.home === undefined && installationArgs.nodeHome) { yamlObj.node.home = installationArgs.nodeHome; } - if (installationArgs.zosmfHost) { + if (yamlObj.zOSMF.host === undefined && installationArgs.zosmfHost) { yamlObj.zOSMF.host = installationArgs.zosmfHost; } - if (installationArgs.zosmfPort) { + if (yamlObj.zOSMF.port === undefined && installationArgs.zosmfPort) { yamlObj.zOSMF.port = installationArgs.zosmfPort; } - if (installationArgs.zosmfApplId) { + if (yamlObj.zOSMF.applId === undefined && installationArgs.zosmfApplId) { yamlObj.zOSMF.applId = installationArgs.zosmfApplId; } if (zoweConfig) { @@ -353,7 +353,7 @@ class Installation { return {status: false, details: 'Method not implemented.'} } - async readExampleYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string): Promise{ + async readExYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string): Promise{ return {status: false, details: 'Method not implemented.'} } @@ -414,7 +414,7 @@ export class FTPInstallation extends Installation { return {status: result.rc === 0, details: result.jobOutput} } - async readExampleYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string){ + async readExYamlAndSchema(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`; From 139190dd15bfb638e9e060c95d61d2d8e9831d2e Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 20 May 2024 09:08:07 -0400 Subject: [PATCH 050/521] readEx -> readExample 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 515fd9e4..085f1dcc 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -105,7 +105,7 @@ class Installation { } let yamlObj let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; - let readPaxYamlAndSchema = await this.readExYamlAndSchema(connectionArgs, zoweRuntimePath); + let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); if(readPaxYamlAndSchema.details.yaml){ const parseExampleYamlFromPax = function(catPath: string){ const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat ${catPath}\\r\\n`) @@ -353,7 +353,7 @@ class Installation { return {status: false, details: 'Method not implemented.'} } - async readExYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string): Promise{ + async readExampleYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string): Promise{ return {status: false, details: 'Method not implemented.'} } @@ -414,7 +414,7 @@ export class FTPInstallation extends Installation { return {status: result.rc === 0, details: result.jobOutput} } - async readExYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string){ + 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`; From 03281b758c2bd439e8c5359c391aee156960d1dd Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 20 May 2024 09:29:46 -0400 Subject: [PATCH 051/521] Update unpax status when skipping download 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 085f1dcc..ead33b90 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -85,7 +85,7 @@ class Installation { } } 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 - upload = download = {status: true, details: ''} + unpax = upload = download = {status: true, details: ''} ProgressStore.set('installation.download', true); } From c5fda261289d14e7631367d956cb80079f658a61 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Mon, 20 May 2024 19:18:45 -0400 Subject: [PATCH 052/521] Fix bug where prefix is setting wrong installation arg Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Planning.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index a66eb016..285751f5 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -582,7 +582,7 @@ Please customize the job statement below to match your system requirements. variant="standard" value={localYaml?.zowe?.job?.prefix || installationArgs.jobPrefix} onChange={(e) => { - formChangeHandler("zowe.job.prefix", e.target.value, "jobName"); + formChangeHandler("zowe.job.prefix", e.target.value, "jobPrefix"); if(localYaml){ window.electron.ipcRenderer.setConfigByKey('zowe.job.prefix', e.target.value).then((res: any) => { // console.log('updated zowe.job.prefi') From 41b2a8a846793c9b4fd8d90663def13d74c19f05 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 21 May 2024 22:30:26 -0400 Subject: [PATCH 053/521] Only allow substages to be navigated to if init mvs is complete Signed-off-by: Timothy Gerstel --- src/renderer/components/common/Stepper.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index bbfb681e..b421ef0a 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -169,7 +169,9 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages setActiveStep(newActiveStep); const newSubStep = isSubStep ? subStepIndex : 0; - setActiveSubStep(newSubStep); + if(subStepIndex > 0 && subStageProgressStatus[0] === true){ //only allow substages after installation to be navigated to if init mvs has been completed + setActiveSubStep(newSubStep); + } } const getStepIcon = (error: any, stageId: number, isSubStep?: boolean, subStepId?: number) => { From 16e9b4f1b7bb5e0f19ecbfaebf87e62d03dabca2 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 21 May 2024 22:35:56 -0400 Subject: [PATCH 054/521] Add undefined checks for current config so values are not always overwritten with InstallationState defaults 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 909cc859..692bc84e 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -136,10 +136,10 @@ const Installation = () => { if (installationArgs.rbacProfile) { yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; } - if (installationArgs.jobName) { + 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 (installationArgs.jobPrefix) { + if ((yamlObj.zowe.job.prefix === undefined || yamlObj.zowe.job.prefix === '') && installationArgs.jobPrefix) { yamlObj.zowe.job.prefix = installationArgs.jobPrefix; } if (installationArgs.cookieId) { @@ -154,10 +154,10 @@ const Installation = () => { if (installationArgs.zosmfHost) { yamlObj.zOSMF.host = installationArgs.zosmfHost; } - if (installationArgs.zosmfPort) { + if ((yamlObj.zOSMF.port === undefined || yamlObj.zOSMF.port === '') && installationArgs.zosmfPort) { yamlObj.zOSMF.port = Number(installationArgs.zosmfPort); } - if (installationArgs.zosmfApplId) { + if ((yamlObj.zOSMF.applId === undefined || yamlObj.zOSMF.applId === '') && installationArgs.zosmfApplId) { yamlObj.zOSMF.applId = installationArgs.zosmfApplId; } return yamlObj; From 56698bca3641f3407ae875f1a5920788198e766c Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 22 May 2024 09:23:54 -0400 Subject: [PATCH 055/521] Remove console log 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 692bc84e..19fd5815 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -116,7 +116,7 @@ const Installation = () => { window.electron.ipcRenderer.getConfig().then((res: IResponse) => { function mergeInstallationArgsAndYaml(yaml: any){ let yamlObj = JSON.parse(JSON.stringify(yaml)); - console.log('merging yaml obj:', JSON.stringify(yamlObj)); + // console.log('merging yaml obj:', JSON.stringify(yamlObj)); delete yamlObj.installationArgs; if (installationArgs.installationDir) { yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; @@ -294,7 +294,7 @@ 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'); } From 5a4fa10cc2500f6e6576173c6b0bd91ca7344967 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Wed, 22 May 2024 09:36:58 -0400 Subject: [PATCH 056/521] Use isSkippable 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 b421ef0a..b0bd2af1 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -311,7 +311,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages } {stages[activeStep] && stages[activeStep].isSkippable && } - +
From 55a7e40ae498e317a56a14d0ebf15da568be7721 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 28 May 2024 16:52:22 -0400 Subject: [PATCH 071/521] 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 072/521] 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 1a09524792269cbd3a63699ab0035d5774e62910 Mon Sep 17 00:00:00 2001 From: Timothy Gerstel Date: Tue, 28 May 2024 17:04:03 -0400 Subject: [PATCH 073/521] getConfig().details.config -> getConfig().details Signed-off-by: Timothy Gerstel --- src/renderer/components/stages/Certificates.tsx | 4 ++-- src/renderer/components/stages/Networking.tsx | 2 +- src/renderer/components/stages/Security.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 4b86bd02..2195ce9a 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -210,7 +210,7 @@ const Certificates = () => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details.config ?? yaml).then((res: IResponse) => { + window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { updateProgress(res.status); clearInterval(timer); }).catch(() => { @@ -286,7 +286,7 @@ const Certificates = () => { {editorVisible && } - dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details.config ?? yaml))}> + dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
} diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index 7a780960..b479c26e 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -729,7 +729,7 @@ const Networking = () => {
{editorVisible && } - dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details.config ?? yaml))}> + dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
}

External Domains { let domains = [...yaml.zowe?.externalDomains, ""]; diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index 7bc73555..caada7b8 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -250,7 +250,7 @@ const Security = () => { {editorVisible && } - dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details.config ?? yaml))}> + dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&

{formError}
} handleFormChange(data)} formData={setupYaml}/> From 309dab12bd5b34ec69d33faa24357c6f6dfa89da Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 28 May 2024 22:41:13 -0400 Subject: [PATCH 074/521] 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 075/521] 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 076/521] 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 077/521] 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 078/521] 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 079/521] 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 080/521] 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 081/521] 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 082/521] 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 083/521] 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 084/521] 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 f2383d5f756bf8499c3ea1bd6186abb767885319 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Sun, 2 Jun 2024 13:02:12 -0400 Subject: [PATCH 085/521] Fix build error Signed-off-by: Leanid Astrakou --- README.md | 2 ++ src/actions/InstallActions.ts | 2 +- src/actions/InstallationHandler.ts | 2 +- .../stages/installation/installationSlice.ts | 21 ------------------- 4 files changed, 4 insertions(+), 23 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 dfe05d6d..9e139714 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 01497d7b..32b58f7e 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 { 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 6e94b761accb60cceefe219adc8e5aa69be3d4f7 Mon Sep 17 00:00:00 2001 From: Leanid Astrakou Date: Tue, 4 Jun 2024 10:57:07 -0400 Subject: [PATCH 086/521] 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 087/521] 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 088/521] 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 089/521] 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 090/521] 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 091/521] 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 092/521] 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 093/521] 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 094/521] 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 095/521] 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 096/521] 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 097/521] 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 098/521] 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 099/521] 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 100/521] 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 101/521] 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 102/521] 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 103/521] 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 104/521] 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 105/521] 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 106/521] 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 107/521] 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 108/521] 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 109/521] 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 110/521] 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 113/521] 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 114/521] 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 115/521] 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 116/521] 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 117/521] 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 118/521] 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 119/521] 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 120/521] 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 121/521] 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 122/521] 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 123/521] 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 124/521] 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 125/521] 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 126/521] 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 127/521] 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 128/521] 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 129/521] 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 130/521] 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 131/521] 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 132/521] 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 133/521] 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 134/521] 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 136/521] =?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 137/521] 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 138/521] 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 139/521] 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 140/521] 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 141/521] 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 142/521] 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 143/521] 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 144/521] 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 145/521] 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 146/521] 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 147/521] 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 148/521] 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 149/521] 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 150/521] 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 151/521] 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 152/521] 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 153/521] 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 154/521] 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 155/521] 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 156/521] 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 157/521] 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 158/521] 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 159/521] 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 160/521] 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 171/521] 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 172/521] 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 173/521] 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 174/521] 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 175/521] 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 176/521] 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 183/521] 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 184/521] 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 185/521] 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 186/521] 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 187/521] 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 188/521] 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 189/521] 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 190/521] 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 191/521] 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 192/521] 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 193/521] 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 194/521] 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 195/521] 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 196/521] 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 197/521] 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 198/521] 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 199/521] 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 200/521] 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 201/521] 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 202/521] 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 203/521] 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 204/521] 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 205/521] 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 206/521] 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 207/521] 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 208/521] 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 209/521] 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 210/521] 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 211/521] 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 212/521] 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 213/521] 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 214/521] 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 215/521] 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 216/521] 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 217/521] 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 218/521] 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 219/521] 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 220/521] 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 221/521] 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 222/521] 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 223/521] 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 224/521] 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 225/521] 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 226/521] 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 227/521] 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 228/521] 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 229/521] 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 230/521] 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 231/521] 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 232/521] 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 233/521] 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 234/521] 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 235/521] 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 236/521] 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 237/521] 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 238/521] 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 239/521] 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 240/521] 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 241/521] 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 242/521] 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 243/521] 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 244/521] 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 245/521] 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 246/521] 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 247/521] 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 248/521] 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 249/521] 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 250/521] 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 251/521] 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 252/521] 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 253/521] 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 254/521] 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 255/521] 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 256/521] 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 257/521] 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 258/521] 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 259/521] 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 260/521] 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 261/521] 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 262/521] 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 263/521] 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 264/521] 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 265/521] 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 266/521] 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 267/521] 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 268/521] 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 269/521] 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 270/521] 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 271/521] 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 272/521] 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 273/521] 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 274/521] 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 275/521] 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 276/521] 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 277/521] 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 278/521] 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 279/521] 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 280/521] 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 281/521] 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 282/521] 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 283/521] 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 284/521] 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 285/521] 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 286/521] 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 287/521] 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 288/521] 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 289/521] 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 290/521] 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 291/521] 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 292/521] 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 293/521] 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 294/521] 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 295/521] 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 296/521] 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 297/521] 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 298/521] 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 299/521] 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 300/521] 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 301/521] 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 302/521] 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 303/521] 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 304/521] 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 305/521] 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 306/521] 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 307/521] 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 308/521] 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 309/521] 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 310/521] 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 311/521] 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 312/521] 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 313/521] 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 314/521] 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 315/521] 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 316/521] 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 317/521] 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 318/521] 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 319/521] 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 320/521] 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 321/521] 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 322/521] 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 323/521] 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 324/521] 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 325/521] 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 326/521] 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 327/521] 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 328/521] 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 329/521] 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 330/521] 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 331/521] 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 332/521] 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 333/521] 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 334/521] 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 335/521] 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 336/521] 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 337/521] 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 338/521] 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 339/521] 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 340/521] 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 341/521] 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 342/521] 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 343/521] 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 344/521] 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 390/521] 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 391/521] 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 392/521] 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 393/521] 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 394/521] 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 395/521] 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 396/521] 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 397/521] 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 398/521] 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 399/521] 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 430/521] 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 438/521] 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 439/521] 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 440/521] 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 441/521] 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 442/521] 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 443/521] 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 444/521] 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 445/521] 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 446/521] 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 447/521] 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 448/521] 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 449/521] 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 450/521] 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 451/521] 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 452/521] 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 453/521] 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 454/521] 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 504/521] 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 505/521] 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 506/521] 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 507/521] 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 508/521] 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 509/521] 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 510/521] 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 511/521] 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 512/521] 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 513/521] 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 514/521] 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 515/521] 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 516/521] 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 517/521] 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 518/521] 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 519/521] 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 520/521] 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 521/521] 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 }