From 648c01fb6968225522a9dbc8e78de41dd71838a4 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Tue, 17 Oct 2023 15:40:40 -0400 Subject: [PATCH 01/21] [wip] feat(extend): Update schema with missing types Signed-off-by: Trae Yelovich --- .../zowe-explorer/src/ZoweExplorerExtender.ts | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/packages/zowe-explorer/src/ZoweExplorerExtender.ts b/packages/zowe-explorer/src/ZoweExplorerExtender.ts index 6dd235aa7a..de96303b7a 100644 --- a/packages/zowe-explorer/src/ZoweExplorerExtender.ts +++ b/packages/zowe-explorer/src/ZoweExplorerExtender.ts @@ -156,6 +156,8 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende // will be created with the appropriate meta data. If not called the user will // see errors when creating a profile of any type. const zoweDir = getZoweDir(); + const workspaceOpen = vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]; + const projectDir = workspaceOpen ? getFullPath(vscode.workspace.workspaceFolders[0].uri.fsPath) : undefined; /** * This should create initialize the loadedConfig if it is not already @@ -166,12 +168,7 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende let usingTeamConfig: boolean; try { const mProfileInfo = await ProfilesUtils.getProfileInfo(globals.ISTHEIA); - if (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]) { - const rootPath = vscode.workspace.workspaceFolders[0].uri.fsPath; - await mProfileInfo.readProfilesFromDisk({ homeDir: zoweDir, projectDir: getFullPath(rootPath) }); - } else { - await mProfileInfo.readProfilesFromDisk({ homeDir: zoweDir, projectDir: undefined }); - } + await mProfileInfo.readProfilesFromDisk({ homeDir: zoweDir, projectDir }); usingTeamConfig = mProfileInfo.usingTeamConfig; } catch (error) { ZoweLogger.warn(error); @@ -191,7 +188,40 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende }); } } - if (profileTypeConfigurations !== undefined) Profiles.getInstance().addToConfigArray(profileTypeConfigurations); + if (profileTypeConfigurations !== undefined) { + Profiles.getInstance().addToConfigArray(profileTypeConfigurations); + } + + if (usingTeamConfig && profileTypeConfigurations != null) { + const projSchemaLoc = projectDir ? path.join(projectDir, "zowe.schema.json") : null; + const projSchemaExists = projSchemaLoc ? fs.existsSync(projSchemaLoc) : false; + + // use the project-level schema if it exists; update the global schema otherwise + const schemaPath = projSchemaExists ? path.join(projectDir, "zowe.schema.json") : path.join(getZoweDir(), "zowe.schema.json"); + + try { + const schemaContents = fs.readFileSync(schemaPath).toString(); + const parsedSchema = JSON.parse(schemaContents); + + const schemaTypes = zowe.imperative.ConfigSchema.loadSchema(parsedSchema); + const newSchemaTypes = Profiles.getInstance().getConfigArray(); + + // Check if any types need added to the schema + const typesToAdd = newSchemaTypes.filter((s) => schemaTypes.find((newS) => s.type === newS.type) == null); + if (typesToAdd.length > 0) { + // Get profile types from config on-disk and merge with new profile types + const mergedProfTypes = [...schemaTypes, ...typesToAdd]; + + // rebuild schema to contain all (merged) profile types and write to disk + const newSchema = JSON.stringify(zowe.imperative.ConfigSchema.buildSchema(mergedProfTypes)); + fs.writeFileSync(schemaPath, newSchema); + } + } catch (err) { + // TODO: Inform user only if we couldn't write the new schema to disk + // If we can't read the schema or parse its contents, its nothing that should + // hold up the initialization + } + } // sequentially reload the internal profiles cache to satisfy all the newly added profile types await ZoweExplorerExtender.refreshProfilesQueue.add(async (): Promise => { From 1784db55a1c02ab06f316aa79602c1537265cd1c Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Thu, 16 Nov 2023 13:36:49 -0500 Subject: [PATCH 02/21] Add to Schema: bump patch cov., add typedoc Signed-off-by: Trae Yelovich --- .../__mocks__/@zowe/imperative.ts | 4 + .../__mocks__/mockCreators/shared.ts | 7 + packages/zowe-explorer/__mocks__/mockUtils.ts | 2 + packages/zowe-explorer/__mocks__/path.ts | 4 + .../zowe-explorer/__mocks__/sampleSchema.json | 102 +++++++++ .../zowe-explorer/__mocks__/zowe.schema.json | 213 ++++++++++++++++++ .../ZoweExplorerExtender.unit.test.ts | 94 ++++++-- .../tsoCommandHandler.extended.unit.test.ts | 1 - .../__unit__/dataset/DatasetTree.unit.test.ts | 4 +- .../__unit__/dataset/actions.unit.test.ts | 4 +- .../__unit__/job/ZosJobsProvider.unit.test.ts | 4 +- .../__unit__/job/actions.unit.test.ts | 4 +- .../__unit__/shared/actions.unit.test.ts | 4 +- .../__unit__/shared/utils.unit.test.ts | 2 - .../__unit__/uss/USSTree.unit.test.ts | 3 +- .../__unit__/uss/ZoweUSSNode.unit.test.ts | 4 +- .../__unit__/uss/actions.unit.test.ts | 3 +- .../__tests__/__unit__/utils.unit.test.ts | 4 +- .../__unit__/utils/ProfilesUtils.unit.test.ts | 2 +- .../zowe-explorer/src/ZoweExplorerExtender.ts | 82 ++++--- 20 files changed, 475 insertions(+), 72 deletions(-) create mode 100644 packages/zowe-explorer/__mocks__/mockUtils.ts create mode 100644 packages/zowe-explorer/__mocks__/sampleSchema.json create mode 100644 packages/zowe-explorer/__mocks__/zowe.schema.json diff --git a/packages/zowe-explorer/__mocks__/@zowe/imperative.ts b/packages/zowe-explorer/__mocks__/@zowe/imperative.ts index c85cc88a6e..8a44e78e88 100644 --- a/packages/zowe-explorer/__mocks__/@zowe/imperative.ts +++ b/packages/zowe-explorer/__mocks__/@zowe/imperative.ts @@ -279,6 +279,10 @@ export class ConfigSchema { public static buildSchema() { return {}; } + + public static loadSchema() { + return []; + } } export class CredentialManagerOverride { diff --git a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts index 07d17faaf5..33ca0da6b6 100644 --- a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts +++ b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts @@ -17,6 +17,9 @@ import { ValidProfileEnum } from "@zowe/zowe-explorer-api"; import { FilterDescriptor } from "../../src/utils/ProfilesUtils"; import { imperative, ZosmfSession } from "@zowe/cli"; import { SettingsConfig } from "../../src/utils/SettingsConfig"; +import { Profiles } from "../../src/Profiles"; + +const MOCK_PROFILES = []; export function createPersistentConfig() { return { @@ -307,6 +310,8 @@ export function createTextDocument(name: string, sessionNode?: ZoweDatasetNode | export function createInstanceOfProfile(profile: imperative.IProfileLoaded) { return { + ...Profiles.prototype, + addToConfigArray: Profiles.prototype.addToConfigArray, allProfiles: [{ name: "sestest" }, { name: "profile1" }, { name: "profile2" }], defaultProfile: { name: "sestest" }, getDefaultProfile: jest.fn(), @@ -318,6 +323,8 @@ export function createInstanceOfProfile(profile: imperative.IProfileLoaded) { return { status: "active", name: "sestest" }; }), profilesForValidation: [{ status: "active", name: "sestest" }], + profileTypeConfigurations: MOCK_PROFILES, + getConfigArray: () => MOCK_PROFILES, validateProfiles: jest.fn(), getBaseProfile: jest.fn(), enableValidationContext: jest.fn(), diff --git a/packages/zowe-explorer/__mocks__/mockUtils.ts b/packages/zowe-explorer/__mocks__/mockUtils.ts new file mode 100644 index 0000000000..250c61e8ce --- /dev/null +++ b/packages/zowe-explorer/__mocks__/mockUtils.ts @@ -0,0 +1,2 @@ +// Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts +export const mocked = any>(fn: T): jest.Mock> => fn as any; diff --git a/packages/zowe-explorer/__mocks__/path.ts b/packages/zowe-explorer/__mocks__/path.ts index c394eff5ab..00adfac79b 100644 --- a/packages/zowe-explorer/__mocks__/path.ts +++ b/packages/zowe-explorer/__mocks__/path.ts @@ -25,3 +25,7 @@ export function extname(file: string): string { export function parse(file: string) { return { name: file }; } + +export function basename(path: string) { + return jest.requireActual("path")["basename"](path); +} diff --git a/packages/zowe-explorer/__mocks__/sampleSchema.json b/packages/zowe-explorer/__mocks__/sampleSchema.json new file mode 100644 index 0000000000..a0a78bd7b3 --- /dev/null +++ b/packages/zowe-explorer/__mocks__/sampleSchema.json @@ -0,0 +1,102 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$version": "1.0", + "type": "object", + "description": "Zowe configuration", + "properties": { + "profiles": { + "type": "object", + "description": "Mapping of profile names to profile configurations", + "patternProperties": { + "^\\S*$": { + "type": "object", + "description": "Profile configuration object", + "properties": { + "type": { + "description": "Profile type", + "type": "string", + "enum": ["sample"] + }, + "properties": { + "description": "Profile properties object", + "type": "object" + }, + "profiles": { + "description": "Optional subprofile configurations", + "type": "object", + "$ref": "#/properties/profiles" + }, + "secure": { + "description": "Secure property names", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": false + } + }, + "then": { + "properties": { + "properties": { + "title": "Missing profile type" + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "sample" + } + } + }, + "then": { + "properties": { + "properties": { + "type": "object", + "title": "Sample Profile", + "description": "Sample profile that stores values", + "properties": { + "host": { + "type": "string", + "description": "Host name of sample service on the mainframe." + } + }, + "required": [] + }, + "secure": { + "items": { + "enum": ["user", "password", "tokenValue"] + } + } + } + } + } + ] + } + } + }, + "defaults": { + "type": "object", + "description": "Mapping of profile types to default profile names", + "properties": { + "sample": { + "description": "Default sample profile", + "type": "string" + } + } + }, + "autoStore": { + "type": "boolean", + "description": "If true, values you enter when prompted are stored for future use" + } + } +} diff --git a/packages/zowe-explorer/__mocks__/zowe.schema.json b/packages/zowe-explorer/__mocks__/zowe.schema.json new file mode 100644 index 0000000000..bb34b77cfe --- /dev/null +++ b/packages/zowe-explorer/__mocks__/zowe.schema.json @@ -0,0 +1,213 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$version": "1.0", + "type": "object", + "description": "Zowe configuration", + "properties": { + "profiles": { + "type": "object", + "description": "Mapping of profile names to profile configurations", + "patternProperties": { + "^\\S*$": { + "type": "object", + "description": "Profile configuration object", + "properties": { + "type": { + "description": "Profile type", + "type": "string", + "enum": ["zosmf", "base"] + }, + "properties": { + "description": "Profile properties object", + "type": "object" + }, + "profiles": { + "description": "Optional subprofile configurations", + "type": "object", + "$ref": "#/properties/profiles" + }, + "secure": { + "description": "Secure property names", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": false + } + }, + "then": { + "properties": { + "properties": { + "title": "Missing profile type" + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "zosmf" + } + } + }, + "then": { + "properties": { + "properties": { + "type": "object", + "title": "z/OSMF Profile", + "description": "z/OSMF Profile", + "properties": { + "host": { + "type": "string", + "description": "The z/OSMF server host name." + }, + "port": { + "type": "number", + "description": "The z/OSMF server port.", + "default": 443 + }, + "user": { + "type": "string", + "description": "Mainframe (z/OSMF) user name, which can be the same as your TSO login." + }, + "password": { + "type": "string", + "description": "Mainframe (z/OSMF) password, which can be the same as your TSO password." + }, + "rejectUnauthorized": { + "type": "boolean", + "description": "Reject self-signed certificates.", + "default": true + }, + "certFile": { + "type": "string", + "description": "The file path to a certificate file to use for authentication" + }, + "certKeyFile": { + "type": "string", + "description": "The file path to a certificate key file to use for authentication" + }, + "basePath": { + "type": "string", + "description": "The base path for your API mediation layer instance. Specify this option to prepend the base path to all z/OSMF resources when making REST requests. Do not specify this option if you are not using an API mediation layer." + }, + "protocol": { + "type": "string", + "description": "The protocol used (HTTP or HTTPS)", + "default": "https", + "enum": ["http", "https"] + }, + "encoding": { + "type": "string", + "description": "The encoding for download and upload of z/OS data set and USS files. The default encoding if not specified is IBM-1047." + }, + "responseTimeout": { + "type": "number", + "description": "The maximum amount of time in seconds the z/OSMF Files TSO servlet should run before returning a response. Any request exceeding this amount of time will be terminated and return an error. Allowed values: 5 - 600" + } + }, + "required": [] + }, + "secure": { + "items": { + "enum": ["user", "password"] + } + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "base" + } + } + }, + "then": { + "properties": { + "properties": { + "type": "object", + "title": "Base Profile", + "description": "Base profile that stores values shared by multiple service profiles", + "properties": { + "host": { + "type": "string", + "description": "Host name of service on the mainframe." + }, + "port": { + "type": "number", + "description": "Port number of service on the mainframe." + }, + "user": { + "type": "string", + "description": "User name to authenticate to service on the mainframe." + }, + "password": { + "type": "string", + "description": "Password to authenticate to service on the mainframe." + }, + "rejectUnauthorized": { + "type": "boolean", + "description": "Reject self-signed certificates.", + "default": true + }, + "tokenType": { + "type": "string", + "description": "The type of token to get and use for the API. Omit this option to use the default token type, which is provided by 'zowe auth login'." + }, + "tokenValue": { + "type": "string", + "description": "The value of the token to pass to the API." + }, + "certFile": { + "type": "string", + "description": "The file path to a certificate file to use for authentication" + }, + "certKeyFile": { + "type": "string", + "description": "The file path to a certificate key file to use for authentication" + } + }, + "required": [] + }, + "secure": { + "items": { + "enum": ["user", "password", "tokenValue"] + } + } + } + } + } + ] + } + } + }, + "defaults": { + "type": "object", + "description": "Mapping of profile types to default profile names", + "properties": { + "zosmf": { + "description": "Default zosmf profile", + "type": "string" + }, + "base": { + "description": "Default base profile", + "type": "string" + } + } + }, + "autoStore": { + "type": "boolean", + "description": "If true, values you enter when prompted are stored for future use" + } + } +} diff --git a/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts index a3bea5845a..50c9abab05 100644 --- a/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts @@ -35,7 +35,7 @@ describe("ZoweExplorerExtender unit tests", () => { altTypeProfile: createAltTypeIProfile(), treeView: createTreeView(), instTest: ZoweExplorerExtender.getInstance(), - profiles: null, + profiles: {}, mockGetConfiguration: jest.fn(), mockErrorMessage: jest.fn(), mockExistsSync: jest.fn(), @@ -44,15 +44,7 @@ describe("ZoweExplorerExtender unit tests", () => { Object.defineProperty(fs, "existsSync", { value: newMocks.mockExistsSync, configurable: true }); newMocks.profiles = createInstanceOfProfile(newMocks.imperativeProfile); - Object.defineProperty(Profiles, "getInstance", { - value: jest - .fn(() => { - return { - refresh: jest.fn(), - }; - }) - .mockReturnValue(newMocks.profiles), - }); + jest.spyOn(Profiles, "getInstance").mockReturnValue(newMocks.profiles as any); Object.defineProperty(vscode.window, "createTreeView", { value: jest.fn(), configurable: true }); Object.defineProperty(vscode.window, "showErrorMessage", { value: newMocks.mockErrorMessage, @@ -78,10 +70,6 @@ describe("ZoweExplorerExtender unit tests", () => { value: jest.fn(), configurable: true, }); - Object.defineProperty(Profiles.getInstance(), "addToConfigArray", { - value: jest.fn(), - configurable: true, - }); return newMocks; } @@ -221,4 +209,82 @@ describe("ZoweExplorerExtender unit tests", () => { expect(readProfilesFromDiskSpy).toBeCalledTimes(1); expect(refreshProfilesQueueAddSpy).toHaveBeenCalledTimes(1); }); + + describe("Add to Schema functionality", () => { + const updateSchema = async ( + level: string = "global", + writeFileSyncImpl: ( + path: number | fs.PathLike, + data: string | ArrayBufferView, + options?: fs.WriteFileOptions | undefined + ) => void = jest.fn() + ) => { + const blockMocks = await createBlockMocks(); + const readProfilesFromDisk = jest.fn(); + const schemaFolder = path.resolve("__mocks__"); + if (level === "project") { + Object.defineProperty(vscode.workspace, "workspaceFolders", { + value: [ + { + uri: { + fsPath: schemaFolder, + }, + }, + ], + configurable: true, + }); + } + + jest.spyOn(profUtils.ProfilesUtils, "getProfileInfo").mockResolvedValueOnce({ usingTeamConfig: true, readProfilesFromDisk } as any); + const writeFileSyncSpy = jest.spyOn(fs, "writeFileSync").mockImplementation(writeFileSyncImpl); + jest.spyOn(imperative.ConfigSchema, "loadSchema").mockReturnValue([ + { + type: "zosmf", + schema: {} as any, + }, + { + type: "base", + schema: {} as any, + }, + ]); + await blockMocks.instTest.initForZowe("sample", [ + { + schema: {} as any, + type: "sample", + }, + ]); + expect(writeFileSyncSpy).toHaveBeenCalled(); + writeFileSyncSpy.mockRestore(); + }; + + describe("global schema", () => { + it("should update when an extender calls initForZowe", async () => { + await updateSchema(); + }); + + it("should throw an error if the schema is read-only", async () => { + const errorMessageSpy = jest.spyOn(Gui, "errorMessage"); + await updateSchema("global", (_filepath, _contents) => { + const err = new Error(); + Object.defineProperty(err, "code", { + value: "EACCES", + }); + throw err; + }); + expect(errorMessageSpy).toHaveBeenCalledWith( + `Failed to update Zowe schema at ${path.join( + "__tests__", + ".zowe", + "zowe.schema.json" + )}: insufficient permissions or read-only file` + ); + }); + }); + + describe("project-level schema", () => { + it("should update when an extender calls initForZowe", async () => { + await updateSchema("project"); + }); + }); + }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/command/tsoCommandHandler.extended.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/command/tsoCommandHandler.extended.unit.test.ts index 39247218e2..834c3d1364 100644 --- a/packages/zowe-explorer/__tests__/__unit__/command/tsoCommandHandler.extended.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/command/tsoCommandHandler.extended.unit.test.ts @@ -19,7 +19,6 @@ import { ZoweLogger } from "../../../src/utils/LoggerUtils"; describe("TsoCommandHandler extended testing", () => { // Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts - const mocked = any>(fn: T): jest.Mock> => fn as any; const newMocks = { imperativeProfile: createIProfile(), profileInstance: null, diff --git a/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts index 9cb5357619..f15b218118 100644 --- a/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts @@ -41,6 +41,7 @@ import * as dsUtils from "../../../src/dataset/utils"; import { SettingsConfig } from "../../../src/utils/SettingsConfig"; import * as sharedActions from "../../../src/shared/actions"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; +import { mocked } from "../../../__mocks__/mockUtils"; jest.mock("fs"); jest.mock("util"); @@ -154,9 +155,6 @@ function createGlobalMocks() { return globalMocks; } -// Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/eadf408f90ca2007b85f5a61c6c0b74b4e431943/src/utils/testing.ts -const mocked = any>(fn: T): jest.Mock> => fn as any; - describe("Dataset Tree Unit Tests - Initialisation", () => { function createBlockMocks() { const session = createISession(); diff --git a/packages/zowe-explorer/__tests__/__unit__/dataset/actions.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/dataset/actions.unit.test.ts index 93aeba652e..d861da3abd 100644 --- a/packages/zowe-explorer/__tests__/__unit__/dataset/actions.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/dataset/actions.unit.test.ts @@ -43,6 +43,7 @@ import { getNodeLabels } from "../../../src/dataset/utils"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; import * as context from "../../../src/shared/context"; import { ZoweExplorerApiRegister } from "../../../src/ZoweExplorerApiRegister"; +import { mocked } from "../../../__mocks__/mockUtils"; // Missing the definition of path module, because I need the original logic for tests jest.mock("fs"); @@ -132,9 +133,6 @@ function createGlobalMocks() { return newMocks; } -// Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts -const mocked = any>(fn: T): jest.Mock> => fn as any; - const createBlockMocksShared = () => { const session = createISession(); const imperativeProfile = createIProfile(); diff --git a/packages/zowe-explorer/__tests__/__unit__/job/ZosJobsProvider.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/job/ZosJobsProvider.unit.test.ts index da5b74ffa7..71061d45fb 100644 --- a/packages/zowe-explorer/__tests__/__unit__/job/ZosJobsProvider.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/job/ZosJobsProvider.unit.test.ts @@ -35,6 +35,7 @@ import { jobStringValidator } from "../../../src/shared/utils"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; import { Poller } from "@zowe/zowe-explorer-api/src/utils"; import { SettingsConfig } from "../../../src/utils/SettingsConfig"; +import { mocked } from "../../../__mocks__/mockUtils"; async function createGlobalMocks() { const globalMocks = { @@ -195,9 +196,6 @@ async function createGlobalMocks() { return globalMocks; } -// Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts -const mocked = any>(fn: T): jest.Mock> => fn as any; - describe("ZosJobsProvider unit tests - Function getChildren", () => { function createBlockMocks(globalMocks) { const newMocks = { diff --git a/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts index 85737a5c89..28a8ef34aa 100644 --- a/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts @@ -42,6 +42,7 @@ import * as sharedUtils from "../../../src/shared/utils"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; import { SpoolFile } from "../../../src/SpoolProvider"; import { ZosJobsProvider } from "../../../src/job/ZosJobsProvider"; +import { mocked } from "../../../__mocks__/mockUtils"; const activeTextEditorDocument = jest.fn(); @@ -131,9 +132,6 @@ function createGlobalMocks() { return newMocks; } -// Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts -const mocked = any>(fn: T): jest.Mock> => fn as any; - afterEach(() => { jest.clearAllMocks(); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/shared/actions.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/shared/actions.unit.test.ts index 51e6c042a8..87cf860d18 100644 --- a/packages/zowe-explorer/__tests__/__unit__/shared/actions.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/shared/actions.unit.test.ts @@ -31,6 +31,7 @@ import { ZoweUSSNode } from "../../../src/uss/ZoweUSSNode"; import { getIconById, IconId, getIconByNode } from "../../../src/generators/icons"; import * as zowe from "@zowe/cli"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; +import { mocked } from "../../../__mocks__/mockUtils"; async function createGlobalMocks() { const globalMocks = { @@ -108,9 +109,6 @@ async function createGlobalMocks() { return globalMocks; } -// Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts -const mocked = any>(fn: T): jest.Mock> => fn as any; - describe("Shared Actions Unit Tests - Function searchForLoadedItems", () => { function createBlockMocks(globalMocks) { const newMocks = { diff --git a/packages/zowe-explorer/__tests__/__unit__/shared/utils.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/shared/utils.unit.test.ts index 4fa7ad9190..e29b3c4656 100644 --- a/packages/zowe-explorer/__tests__/__unit__/shared/utils.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/shared/utils.unit.test.ts @@ -32,8 +32,6 @@ import * as utils from "../../../src/utils/ProfilesUtils"; import { ProfilesCache } from "@zowe/zowe-explorer-api"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; -jest.mock("path"); - async function createGlobalMocks() { const newMocks = { session: createISession(), diff --git a/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts index 56d20ad5b0..32e78399ca 100644 --- a/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts @@ -32,6 +32,7 @@ import { getIconByNode } from "../../../src/generators/icons"; import * as workspaceUtils from "../../../src/utils/workspace"; import { createUssApi, bindUssApi } from "../../../__mocks__/mockCreators/api"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; +import { mocked } from "../../../__mocks__/mockUtils"; async function createGlobalMocks() { const globalMocks = { @@ -1425,8 +1426,6 @@ describe("USSTree Unit Tests - Function USSTree.getChildren()", () => { expect(loadProfilesForFavoritesSpy).toHaveBeenCalledWith(log, favProfileNode); }); }); -// Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts -const mocked = any>(fn: T): jest.Mock> => fn as any; describe("USSTree Unit Tests - Function USSTree.loadProfilesForFavorites", () => { function createBlockMocks(globalMocks) { diff --git a/packages/zowe-explorer/__tests__/__unit__/uss/ZoweUSSNode.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/uss/ZoweUSSNode.unit.test.ts index b80a6805f3..e6969bd5fd 100644 --- a/packages/zowe-explorer/__tests__/__unit__/uss/ZoweUSSNode.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/uss/ZoweUSSNode.unit.test.ts @@ -148,7 +148,7 @@ async function createGlobalMocks() { Object.defineProperty(workspaceUtils, "closeOpenedTextFile", { value: jest.fn(), configurable: true }); Object.defineProperty(globalMocks.Download, "ussFile", { value: globalMocks.ussFile, configurable: true }); Object.defineProperty(zowe, "Delete", { value: globalMocks.Delete, configurable: true }); - Object.defineProperty(fs, "existsSync", { value: globalMocks.existsSync, configurable: true }); + jest.spyOn(fs, "existsSync").mockImplementation(globalMocks.existsSync); Object.defineProperty(globalMocks.Delete, "ussFile", { value: globalMocks.ussFile, configurable: true }); Object.defineProperty(Profiles, "createInstance", { value: jest.fn(() => globalMocks.profileOps), @@ -168,7 +168,7 @@ async function createGlobalMocks() { configurable: true, }); Object.defineProperty(vscode.env.clipboard, "readText", { value: globalMocks.readText, configurable: true }); - Object.defineProperty(path, "basename", { value: globalMocks.basePath, configurable: true }); + jest.spyOn(path, "basename").mockImplementation(globalMocks.basePath); Object.defineProperty(ZoweLogger, "error", { value: jest.fn(), configurable: true }); Object.defineProperty(ZoweLogger, "debug", { value: jest.fn(), configurable: true }); Object.defineProperty(ZoweLogger, "warn", { value: jest.fn(), configurable: true }); diff --git a/packages/zowe-explorer/__tests__/__unit__/uss/actions.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/uss/actions.unit.test.ts index 4c84b3d6ec..fa3f98d8dd 100644 --- a/packages/zowe-explorer/__tests__/__unit__/uss/actions.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/uss/actions.unit.test.ts @@ -40,6 +40,7 @@ import { ZoweLogger } from "../../../src/utils/LoggerUtils"; import * as wsUtils from "../../../src/utils/workspace"; import * as context from "../../../src/shared/context"; import { AttributeView } from "../../../src/uss/AttributeView"; +import { mocked } from "../../../__mocks__/mockUtils"; function createGlobalMocks() { const globalMocks = { @@ -167,8 +168,6 @@ function createGlobalMocks() { return globalMocks; } -// Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts -const mocked = any>(fn: T): jest.Mock> => fn as any; describe("USS Action Unit Tests - Function createUSSNodeDialog", () => { async function createBlockMocks(globalMocks) { diff --git a/packages/zowe-explorer/__tests__/__unit__/utils.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/utils.unit.test.ts index ca4a59e7f4..44faa0d9f4 100644 --- a/packages/zowe-explorer/__tests__/__unit__/utils.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/utils.unit.test.ts @@ -17,6 +17,7 @@ import * as globals from "../../src/globals"; import { createInstanceOfProfile, createInstanceOfProfileInfo, createIProfile, createValidIProfile } from "../../__mocks__/mockCreators/shared"; import { Profiles } from "../../src/Profiles"; import { ZoweLogger } from "../../src/utils/LoggerUtils"; +import { mocked } from "../../__mocks__/mockUtils"; function createGlobalMocks() { const globalMocks = { @@ -60,9 +61,6 @@ function createGlobalMocks() { }; } -// Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts -const mocked = any>(fn: T): jest.Mock> => fn as any; - describe("Utils Unit Tests - Function errorHandling", () => { function createBlockMocks() { const imperativeProfile = createIProfile(); diff --git a/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts index 74cdb85a8a..8463f43e4e 100644 --- a/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts @@ -45,7 +45,7 @@ describe("ProfilesUtils unit tests", () => { }; Object.defineProperty(fs, "existsSync", { value: newMocks.mockExistsSync, configurable: true }); Object.defineProperty(fs, "readFileSync", { value: newMocks.mockReadFileSync, configurable: true }); - Object.defineProperty(fs, "writeFileSync", { value: newMocks.mockWriteFileSync, configurable: true }); + jest.spyOn(fs, "writeFileSync").mockImplementation(newMocks.mockWriteFileSync); Object.defineProperty(fs, "openSync", { value: newMocks.mockOpenSync, configurable: true }); Object.defineProperty(fs, "mkdirSync", { value: newMocks.mockMkdirSync, configurable: true }); Object.defineProperty(Gui, "errorMessage", { value: jest.fn(), configurable: true }); diff --git a/packages/zowe-explorer/src/ZoweExplorerExtender.ts b/packages/zowe-explorer/src/ZoweExplorerExtender.ts index de96303b7a..af5eb43f1c 100644 --- a/packages/zowe-explorer/src/ZoweExplorerExtender.ts +++ b/packages/zowe-explorer/src/ZoweExplorerExtender.ts @@ -178,7 +178,9 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende ZoweExplorerExtender.showZoweConfigError(error.message); } - if (profileTypeConfigurations && !usingTeamConfig) { + const hasProfileTypes = profileTypeConfigurations != null && profileTypeConfigurations.length > 0; + + if (!usingTeamConfig && hasProfileTypes) { const configOptions = Array.from(profileTypeConfigurations); const exists = fs.existsSync(path.join(zoweDir, "profiles", profileType)); if (configOptions && !exists) { @@ -188,45 +190,65 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende }); } } - if (profileTypeConfigurations !== undefined) { + + if (hasProfileTypes) { Profiles.getInstance().addToConfigArray(profileTypeConfigurations); } - if (usingTeamConfig && profileTypeConfigurations != null) { - const projSchemaLoc = projectDir ? path.join(projectDir, "zowe.schema.json") : null; - const projSchemaExists = projSchemaLoc ? fs.existsSync(projSchemaLoc) : false; + // Check if schema needs updated when the end user is using a team config + if (usingTeamConfig) { + this.updateSchema(projectDir); + } - // use the project-level schema if it exists; update the global schema otherwise - const schemaPath = projSchemaExists ? path.join(projectDir, "zowe.schema.json") : path.join(getZoweDir(), "zowe.schema.json"); + // sequentially reload the internal profiles cache to satisfy all the newly added profile types + await ZoweExplorerExtender.refreshProfilesQueue.add(async (): Promise => { + await Profiles.getInstance().refresh(ZoweExplorerApiRegister.getInstance()); + }); + } - try { - const schemaContents = fs.readFileSync(schemaPath).toString(); - const parsedSchema = JSON.parse(schemaContents); + /** + * Checks to see if any profile types should be added and adds the new types to the schema, if found. + * @param projectDir (optional) The workspace directory (if the user has a workspace open) + */ + private updateSchema(projectDir?: string): void { + // check for the existence of a project-level schema; if it doesn't exist, fall back to global + const projSchemaLoc = projectDir ? path.join(projectDir, "zowe.schema.json") : null; + const projSchemaExists = projSchemaLoc != null && fs.existsSync(projSchemaLoc); + const schemaPath = projSchemaExists ? projSchemaLoc : path.join(getZoweDir(), "zowe.schema.json"); - const schemaTypes = zowe.imperative.ConfigSchema.loadSchema(parsedSchema); - const newSchemaTypes = Profiles.getInstance().getConfigArray(); + // try parsing the existing schema to gather the list of types to merge + try { + const schemaContents = fs.readFileSync(schemaPath).toString(); + const parsedSchema = JSON.parse(schemaContents); - // Check if any types need added to the schema - const typesToAdd = newSchemaTypes.filter((s) => schemaTypes.find((newS) => s.type === newS.type) == null); - if (typesToAdd.length > 0) { - // Get profile types from config on-disk and merge with new profile types - const mergedProfTypes = [...schemaTypes, ...typesToAdd]; + // determine new types that are not present in the on-disk schema + const schemaTypes = zowe.imperative.ConfigSchema.loadSchema(parsedSchema); + const newSchemaTypes = Profiles.getInstance() + .getConfigArray() + .filter((o) => typeof o === "object"); - // rebuild schema to contain all (merged) profile types and write to disk - const newSchema = JSON.stringify(zowe.imperative.ConfigSchema.buildSchema(mergedProfTypes)); - fs.writeFileSync(schemaPath, newSchema); - } - } catch (err) { - // TODO: Inform user only if we couldn't write the new schema to disk - // If we can't read the schema or parse its contents, its nothing that should - // hold up the initialization + // If there are any new types to add, merge the list of profile types and rebuild the schema + const typesToAdd = newSchemaTypes.filter((s) => schemaTypes.find((newS) => s.type === newS.type) == null); + if (typesToAdd.length > 0) { + // Get profile types from config on-disk and merge with new profile types + const mergedProfTypes = [...schemaTypes, ...typesToAdd]; + + // rebuild schema to contain all profile types (including merged) and write to disk + const newSchema = JSON.stringify(zowe.imperative.ConfigSchema.buildSchema(mergedProfTypes)); + fs.writeFileSync(schemaPath, newSchema); + } + } catch (err) { + // Only show an error if we failed to update the on-disk schema. + if (err.code === "EACCES" || err.code === "EPERM") { + Gui.errorMessage( + localize( + "zowe.schema.cannotAccess", + "Failed to update Zowe schema at {0}: insufficient permissions or read-only file", + schemaPath + ) + ); } } - - // sequentially reload the internal profiles cache to satisfy all the newly added profile types - await ZoweExplorerExtender.refreshProfilesQueue.add(async (): Promise => { - await Profiles.getInstance().refresh(ZoweExplorerApiRegister.getInstance()); - }); } /** From 7c1f5512c1d32df975eeed02f921b59999f35815 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 11 Dec 2023 13:30:00 -0500 Subject: [PATCH 03/21] chore: update yarn.lock, add license to mockUtils Signed-off-by: Trae Yelovich --- packages/zowe-explorer/__mocks__/mockUtils.ts | 11 +++++++++++ yarn.lock | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/zowe-explorer/__mocks__/mockUtils.ts b/packages/zowe-explorer/__mocks__/mockUtils.ts index 250c61e8ce..06a03e3e0a 100644 --- a/packages/zowe-explorer/__mocks__/mockUtils.ts +++ b/packages/zowe-explorer/__mocks__/mockUtils.ts @@ -1,2 +1,13 @@ +/** + * 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. + * + */ + // Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts export const mocked = any>(fn: T): jest.Mock> => fn as any; diff --git a/yarn.lock b/yarn.lock index 427c49fa5e..417487a991 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11641,10 +11641,10 @@ vite-plugin-checker@^0.6.2: vscode-languageserver-textdocument "^1.0.1" vscode-uri "^3.0.2" -vite@^4.4.9: - version "4.4.12" - resolved "https://registry.npmjs.org/vite/-/vite-4.4.12.tgz#e9c355d5a0d8a47afa46cb4bad10820da333da5c" - integrity sha512-KtPlUbWfxzGVul8Nut8Gw2Qe8sBzWY+8QVc5SL8iRFnpnrcoCaNlzO40c1R6hPmcdTwIPEDkq0Y9+27a5tVbdQ== +vite@^4.4.12: + version "4.5.1" + resolved "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz#3370986e1ed5dbabbf35a6c2e1fb1e18555b968a" + integrity sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA== dependencies: esbuild "^0.18.10" postcss "^8.4.27" From 028cb18c6a255a45e53e8c63e79d0eceb2c6966f Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 11 Dec 2023 13:40:05 -0500 Subject: [PATCH 04/21] chore: update ZE changelog Signed-off-by: Trae Yelovich --- packages/zowe-explorer/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/zowe-explorer/CHANGELOG.md b/packages/zowe-explorer/CHANGELOG.md index f90033235d..666bf4006f 100644 --- a/packages/zowe-explorer/CHANGELOG.md +++ b/packages/zowe-explorer/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to the "vscode-extension-for-zowe" extension will be documen - Added Display confirmation dialog when submitting local JCL. [#2061](https://github.com/zowe/vscode-extension-for-zowe/issues/2061) - Added support for adding a Zowe profile across all trees [#2603](https://github.com/zowe/vscode-extension-for-zowe/issues/2603) - Added "Filter Jobs" feature in Jobs tree view: accessible via filter icon or right-clicking on session node. [#2599](https://github.com/zowe/vscode-extension-for-zowe/issues/2599) +- Added the capability for extenders to contribute new profile types to the Zowe schema during extender activation. [#2508](https://github.com/zowe/vscode-extension-for-zowe/issues/2508) ### Bug fixes From e8d1172ebe12ea3251f29561e8cf37ffe14b503e Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 11 Dec 2023 13:56:07 -0500 Subject: [PATCH 05/21] style: use optional chaining instead of AND short-circuit Signed-off-by: Trae Yelovich --- packages/zowe-explorer/src/ZoweExplorerExtender.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/zowe-explorer/src/ZoweExplorerExtender.ts b/packages/zowe-explorer/src/ZoweExplorerExtender.ts index af5eb43f1c..11103a1f84 100644 --- a/packages/zowe-explorer/src/ZoweExplorerExtender.ts +++ b/packages/zowe-explorer/src/ZoweExplorerExtender.ts @@ -156,8 +156,8 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende // will be created with the appropriate meta data. If not called the user will // see errors when creating a profile of any type. const zoweDir = getZoweDir(); - const workspaceOpen = vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]; - const projectDir = workspaceOpen ? getFullPath(vscode.workspace.workspaceFolders[0].uri.fsPath) : undefined; + const workspaceDir = vscode.workspace.workspaceFolders?.[0]; + const projectDir = workspaceDir ? getFullPath(workspaceDir.uri.fsPath) : undefined; /** * This should create initialize the loadedConfig if it is not already From 4d5492708fc0f0b558512be11347c1fdee052e45 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Tue, 19 Dec 2023 17:09:24 -0500 Subject: [PATCH 06/21] wip: updateSchema adjustments, test schemaVersion checks w/ FTP ext. Signed-off-by: Trae Yelovich --- package.json | 3 + .../src/extension.ts | 2 +- .../zowe-explorer/src/ZoweExplorerExtender.ts | 77 ++++++++----------- 3 files changed, 38 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index 5473e1d918..e3aecb5413 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,9 @@ "@zowe/cli": "7.19.0", "vscode-nls": "4.1.2" }, + "resolutions": { + "@zowe/imperative": "file:i5.19.tgz" + }, "devDependencies": { "@types/jest": "^29.2.3", "@types/mocha": "^10.0.1", diff --git a/packages/zowe-explorer-ftp-extension/src/extension.ts b/packages/zowe-explorer-ftp-extension/src/extension.ts index abdab24b6f..9bdd6678cc 100644 --- a/packages/zowe-explorer-ftp-extension/src/extension.ts +++ b/packages/zowe-explorer-ftp-extension/src/extension.ts @@ -43,7 +43,7 @@ async function registerFtpApis(): Promise { zoweExplorerApi.registerJesApi(new FtpJesApi()); const meta = await CoreUtils.getProfileMeta(); - await zoweExplorerApi.getExplorerExtenderApi().initForZowe("zftp", meta); + await zoweExplorerApi.getExplorerExtenderApi().initForZowe("zftp", [{ ...meta[0], schemaVersion: "2.0" } as any]); await zoweExplorerApi.getExplorerExtenderApi().reloadProfiles("zftp"); await Gui.showMessage("Zowe Explorer was modified for FTP support.", { logger: ZoweLogger }); diff --git a/packages/zowe-explorer/src/ZoweExplorerExtender.ts b/packages/zowe-explorer/src/ZoweExplorerExtender.ts index 11103a1f84..c394b820b0 100644 --- a/packages/zowe-explorer/src/ZoweExplorerExtender.ts +++ b/packages/zowe-explorer/src/ZoweExplorerExtender.ts @@ -166,10 +166,11 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende * profile management. */ let usingTeamConfig: boolean; + let profileInfo: zowe.imperative.ProfileInfo; try { - const mProfileInfo = await ProfilesUtils.getProfileInfo(globals.ISTHEIA); - await mProfileInfo.readProfilesFromDisk({ homeDir: zoweDir, projectDir }); - usingTeamConfig = mProfileInfo.usingTeamConfig; + profileInfo = await ProfilesUtils.getProfileInfo(globals.ISTHEIA); + await profileInfo.readProfilesFromDisk({ homeDir: zoweDir, projectDir }); + usingTeamConfig = profileInfo.usingTeamConfig; } catch (error) { ZoweLogger.warn(error); if (error.toString().includes("Error parsing JSON")) { @@ -197,7 +198,7 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende // Check if schema needs updated when the end user is using a team config if (usingTeamConfig) { - this.updateSchema(projectDir); + this.updateSchema(profileInfo, profileTypeConfigurations); } // sequentially reload the internal profiles cache to satisfy all the newly added profile types @@ -207,46 +208,36 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende } /** - * Checks to see if any profile types should be added and adds the new types to the schema, if found. - * @param projectDir (optional) The workspace directory (if the user has a workspace open) + * Adds new types to the Zowe schema. + * @param profileInfo the ProfileInfo object that has been prepared with `readProfilesFromDisk`, such as the one initialized in `initForZowe`. + * @param profileTypeConfigurations (optional) Profile type configurations to add to the schema */ - private updateSchema(projectDir?: string): void { - // check for the existence of a project-level schema; if it doesn't exist, fall back to global - const projSchemaLoc = projectDir ? path.join(projectDir, "zowe.schema.json") : null; - const projSchemaExists = projSchemaLoc != null && fs.existsSync(projSchemaLoc); - const schemaPath = projSchemaExists ? projSchemaLoc : path.join(getZoweDir(), "zowe.schema.json"); - - // try parsing the existing schema to gather the list of types to merge - try { - const schemaContents = fs.readFileSync(schemaPath).toString(); - const parsedSchema = JSON.parse(schemaContents); - - // determine new types that are not present in the on-disk schema - const schemaTypes = zowe.imperative.ConfigSchema.loadSchema(parsedSchema); - const newSchemaTypes = Profiles.getInstance() - .getConfigArray() - .filter((o) => typeof o === "object"); - - // If there are any new types to add, merge the list of profile types and rebuild the schema - const typesToAdd = newSchemaTypes.filter((s) => schemaTypes.find((newS) => s.type === newS.type) == null); - if (typesToAdd.length > 0) { - // Get profile types from config on-disk and merge with new profile types - const mergedProfTypes = [...schemaTypes, ...typesToAdd]; - - // rebuild schema to contain all profile types (including merged) and write to disk - const newSchema = JSON.stringify(zowe.imperative.ConfigSchema.buildSchema(mergedProfTypes)); - fs.writeFileSync(schemaPath, newSchema); - } - } catch (err) { - // Only show an error if we failed to update the on-disk schema. - if (err.code === "EACCES" || err.code === "EPERM") { - Gui.errorMessage( - localize( - "zowe.schema.cannotAccess", - "Failed to update Zowe schema at {0}: insufficient permissions or read-only file", - schemaPath - ) - ); + private updateSchema( + profileInfo: zowe.imperative.ProfileInfo, + profileTypeConfigurations?: zowe.imperative.ICommandProfileTypeConfiguration[], + ): void { + if (profileTypeConfigurations) { + try { + for (const typeConfig of profileTypeConfigurations) { + const addResult = profileInfo.addProfileTypeToSchema(typeConfig.type, { + schema: typeConfig.schema, + sourceApp: "Zowe Explorer (for VS Code)", + version: typeConfig.schemaVersion + }); + if (addResult.info.length > 0) { + Gui.warningMessage(addResult.info); + } + } + } catch (err) { + // Only show an error if we failed to update the on-disk schema. + if (err.code === "EACCES" || err.code === "EPERM") { + Gui.errorMessage( + localize( + "zowe.schema.cannotAccess", + "Failed to update Zowe schema: insufficient permissions or read-only file", + ) + ); + } } } } From 0cb91a48a00b96e4b770234f6734206f01028fb8 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Wed, 20 Dec 2023 11:22:48 -0500 Subject: [PATCH 07/21] chore: update CLI to 7.21.0; use valid schema version for FTP demo Signed-off-by: Trae Yelovich --- package.json | 4 +- packages/zowe-explorer-api/package.json | 2 +- .../src/extension.ts | 2 +- yarn.lock | 136 +++++++++--------- 4 files changed, 68 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index e3aecb5413..37230f6314 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,11 @@ "vscode": "^1.53.2" }, "dependencies": { - "@zowe/cli": "7.19.0", + "@zowe/cli": "7.21.0", "vscode-nls": "4.1.2" }, "resolutions": { - "@zowe/imperative": "file:i5.19.tgz" + "@zowe/imperative": "file:imp-5.20.0-schema-mgmt.tgz" }, "devDependencies": { "@types/jest": "^29.2.3", diff --git a/packages/zowe-explorer-api/package.json b/packages/zowe-explorer-api/package.json index e2be0fa376..90f6673fb0 100644 --- a/packages/zowe-explorer-api/package.json +++ b/packages/zowe-explorer-api/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@types/vscode": "^1.53.2", - "@zowe/cli": "7.19.0", + "@zowe/cli": "7.21.0", "@zowe/secrets-for-zowe-sdk": "7.18.6", "handlebars": "^4.7.7", "semver": "^7.5.3" diff --git a/packages/zowe-explorer-ftp-extension/src/extension.ts b/packages/zowe-explorer-ftp-extension/src/extension.ts index 9bdd6678cc..774a2b6e94 100644 --- a/packages/zowe-explorer-ftp-extension/src/extension.ts +++ b/packages/zowe-explorer-ftp-extension/src/extension.ts @@ -43,7 +43,7 @@ async function registerFtpApis(): Promise { zoweExplorerApi.registerJesApi(new FtpJesApi()); const meta = await CoreUtils.getProfileMeta(); - await zoweExplorerApi.getExplorerExtenderApi().initForZowe("zftp", [{ ...meta[0], schemaVersion: "2.0" } as any]); + await zoweExplorerApi.getExplorerExtenderApi().initForZowe("zftp", [{ ...meta[0], schemaVersion: "1.0.0" }]); await zoweExplorerApi.getExplorerExtenderApi().reloadProfiles("zftp"); await Gui.showMessage("Zowe Explorer was modified for FTP support.", { logger: ZoweLogger }); diff --git a/yarn.lock b/yarn.lock index 417487a991..0bf57d99d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2642,22 +2642,22 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zowe/cli@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/cli/-/cli-7.19.0.tgz#ee053f35438484f1271af333c954b851d0ea747b" - integrity sha512-hkAwsdYWkI+DMsP8nbCUb3pRfzMuaTh663v5L+tGJtizBpDKpFGYYQ9buv0eOskPi4d5/+bae089aT8VavgwAw== - dependencies: - "@zowe/core-for-zowe-sdk" "7.19.0" - "@zowe/imperative" "5.19.0" - "@zowe/provisioning-for-zowe-sdk" "7.19.0" - "@zowe/zos-console-for-zowe-sdk" "7.19.0" - "@zowe/zos-files-for-zowe-sdk" "7.19.0" - "@zowe/zos-jobs-for-zowe-sdk" "7.19.0" - "@zowe/zos-logs-for-zowe-sdk" "7.19.0" - "@zowe/zos-tso-for-zowe-sdk" "7.19.0" - "@zowe/zos-uss-for-zowe-sdk" "7.19.0" - "@zowe/zos-workflows-for-zowe-sdk" "7.19.0" - "@zowe/zosmf-for-zowe-sdk" "7.19.0" +"@zowe/cli@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/cli/-/cli-7.21.0.tgz#748feccf9d7832daac5e5ceb61a784ef7ea65fb3" + integrity sha512-XSwgjfOpzMeXAVpzDHiZjFdYhcWqyZjlKyCUWWqN/Kw87OqvWYkUlvDrCk2RkynTiGP48E+4Zto1ZbvjH00cCw== + dependencies: + "@zowe/core-for-zowe-sdk" "7.21.0" + "@zowe/imperative" "5.20.0" + "@zowe/provisioning-for-zowe-sdk" "7.21.0" + "@zowe/zos-console-for-zowe-sdk" "7.21.0" + "@zowe/zos-files-for-zowe-sdk" "7.21.0" + "@zowe/zos-jobs-for-zowe-sdk" "7.21.0" + "@zowe/zos-logs-for-zowe-sdk" "7.21.0" + "@zowe/zos-tso-for-zowe-sdk" "7.21.0" + "@zowe/zos-uss-for-zowe-sdk" "7.21.0" + "@zowe/zos-workflows-for-zowe-sdk" "7.21.0" + "@zowe/zosmf-for-zowe-sdk" "7.21.0" find-process "1.4.7" get-stream "6.0.1" lodash "4.17.21" @@ -2666,18 +2666,17 @@ optionalDependencies: "@zowe/secrets-for-zowe-sdk" "7.18.6" -"@zowe/core-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/core-for-zowe-sdk/-/core-for-zowe-sdk-7.19.0.tgz#36113036954b9554a0e927a15510ded444c85fc1" - integrity sha512-u7safSLwN4Rctt/ihGjEO3NFljDOANKtmqvw/pqoy+G1DcGswR4i9J3rbors8THfodiG2FXBsTxv9+l3qzUVkQ== +"@zowe/core-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/core-for-zowe-sdk/-/core-for-zowe-sdk-7.21.0.tgz#d35d5757eae41e43e3f998342a31b2570bb1b143" + integrity sha512-QNabrsS0FkNDpb7Hm51e/oLDTR7kgchsg9BtqbeEhduUFzqlPeQUumN5j8J37DSz9HJZcaBZakNg9wEwj4xQkg== dependencies: comment-json "4.1.1" string-width "4.2.3" -"@zowe/imperative@5.19.0": - version "5.19.0" - resolved "https://registry.npmjs.org/@zowe/imperative/-/imperative-5.19.0.tgz#7f8deb89030bf2f649cd2351fe12095da46dce6c" - integrity sha512-XhhNUnZprtf1zqn/vkuH4tbxJrAinYWAgGw6WU9yZ7vPAeqYIEWwd9Na+D1/ols3unet64cd1lhvHG3xKSMKUw== +"@zowe/imperative@5.20.0", "@zowe/imperative@file:imp-5.20.0-schema-mgmt.tgz": + version "5.20.0" + resolved "file:imp-5.20.0-schema-mgmt.tgz#7f9ceb4fbde85231197adcb5a86608679c7a7f74" dependencies: "@types/yargs" "13.0.4" chalk "2.4.2" @@ -2708,7 +2707,7 @@ progress "2.0.3" read "1.0.7" readline-sync "1.4.10" - semver "7.5.2" + semver "7.5.4" stack-trace "0.0.10" strip-ansi "6.0.1" which "3.0.0" @@ -2716,10 +2715,10 @@ yamljs "0.3.0" yargs "15.3.1" -"@zowe/provisioning-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/provisioning-for-zowe-sdk/-/provisioning-for-zowe-sdk-7.19.0.tgz#a63378cd0c1201cc42abff282d99b5bdb1354aec" - integrity sha512-f2j8p1g+VVCEz9pZrLr4dSZe1T7oznxA3cVcC3YsbQxCUnZVXfB+sNkOThlyjdzorRFBzfnyrkVad3wt2VZxBw== +"@zowe/provisioning-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/provisioning-for-zowe-sdk/-/provisioning-for-zowe-sdk-7.21.0.tgz#141622245d59ba134157a4c94f5842946ed1c86f" + integrity sha512-bKKRzl1Qa/XBzqLDsMJqhRmpgeC1+Rra+1cBqmk63qh1BMsrkgrUQaeGJimpD3wJJHxfX8LYW59FDL92bb3S1w== dependencies: js-yaml "4.1.0" @@ -2728,15 +2727,15 @@ resolved "https://registry.npmjs.org/@zowe/secrets-for-zowe-sdk/-/secrets-for-zowe-sdk-7.18.6.tgz#6b854b344babb291c26d19d82633099a46e08452" integrity sha512-YyS1NoXddb147mBQpu5/dTfo1gdwGa/xdg85U8KCngA+RHCmNct3n2rbK3tHx9C9H6rlgjeS+Mrux5Q+PHJUgQ== -"@zowe/zos-console-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/zos-console-for-zowe-sdk/-/zos-console-for-zowe-sdk-7.19.0.tgz#9431731e49cef3993f7428e5e81f1565f6572e70" - integrity sha512-0YNLP8wK3ja+gY0Aj8K89J8dwiZr/d+vIaN7qB42584t991UaNOZjDNt5A416Qc3DwVTlQGDBpHKnlAFiykexA== +"@zowe/zos-console-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/zos-console-for-zowe-sdk/-/zos-console-for-zowe-sdk-7.21.0.tgz#eb0d1f3813e6edde92d36fb3620245b98a5577df" + integrity sha512-fQjc4ouovPuOvi+4kf8PDL3GBf01j0sRboHj/zHvrAhO+q8ILB9ukTWyvGlRMe3Hgg89pYKLwprTDvtqxxJSUw== -"@zowe/zos-files-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/zos-files-for-zowe-sdk/-/zos-files-for-zowe-sdk-7.19.0.tgz#e378cc7a13c4577ab30e879d63bc760203297761" - integrity sha512-ZUTRxjLPEFAXKEUrLQmRI+hFW9KtxEarkaYJKtOpaQgkB14L62fSdfhw3prRwQalwNhLdm+RPvrJjvijnz1fag== +"@zowe/zos-files-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/zos-files-for-zowe-sdk/-/zos-files-for-zowe-sdk-7.21.0.tgz#1af17544294f14ab382bb4b2bcdf0ed212a86591" + integrity sha512-9NIpyI7EKSJJVN66RwMKZ+cbsSD2Pp5wxJIunUgdplfKgUn7R6FF4uYQJa3ChyVYp+vdKcRcuWU8Gh8Gl79lEw== dependencies: get-stream "6.0.1" minimatch "5.0.1" @@ -2748,43 +2747,43 @@ dependencies: zos-node-accessor "1.0.14" -"@zowe/zos-jobs-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/zos-jobs-for-zowe-sdk/-/zos-jobs-for-zowe-sdk-7.19.0.tgz#5e2fe76368d6e4a8ce7c40254e9b767464e496f8" - integrity sha512-oLs53Wzh8vP7ytzdlmja4l6bxRFDkgQiREfDZ44vwTGpX2oAAsCXzGBtaM9EBxfSIOtHyCMDucWcj4ho2KPIhQ== +"@zowe/zos-jobs-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/zos-jobs-for-zowe-sdk/-/zos-jobs-for-zowe-sdk-7.21.0.tgz#bce05b961fdc2f04719ff075b13a26d2141bd9c6" + integrity sha512-ZFroZA/0+EsfLU34HyG/MemcraJVOpL7ASl9ox4yvOWkua6tlfTxB5NFwaEQRmQk4U+hGKGg5Ns1QKzAPAxVkA== dependencies: - "@zowe/zos-files-for-zowe-sdk" "7.19.0" + "@zowe/zos-files-for-zowe-sdk" "7.21.0" -"@zowe/zos-logs-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/zos-logs-for-zowe-sdk/-/zos-logs-for-zowe-sdk-7.19.0.tgz#9f97bdff593867519c8ada718b19ac405a01ea84" - integrity sha512-tBqrDyUrZP17wLBVjDx5ol8de77pK3Bbb2LvmVErC8Z5VIY7yH+6iJQmnKeLduSiRpaAcK46citZNmLkGbGkbw== +"@zowe/zos-logs-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/zos-logs-for-zowe-sdk/-/zos-logs-for-zowe-sdk-7.21.0.tgz#863a4f30891f7679e346150a006d422988d4b295" + integrity sha512-egYBu+oDK8BoHmRY1ILi+DrtKJjC3aaEaez/j77N0SO0AmT66GVkB0NMgQehkeCS0ajd2URmujT+/4Eq5DsQ5g== -"@zowe/zos-tso-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/zos-tso-for-zowe-sdk/-/zos-tso-for-zowe-sdk-7.19.0.tgz#8983e05e130228955e9d054160fe89cf0a1e6bf0" - integrity sha512-5LUD9K7oxyo8/EmLw2/mWIi8fJFt4aX+Ja+iKcC62vdt+R3o73AbNBuAeP0Vj6IghmODZ1rAVA7oyYEkXBYdDg== +"@zowe/zos-tso-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/zos-tso-for-zowe-sdk/-/zos-tso-for-zowe-sdk-7.21.0.tgz#64ffa4b755368c1f117499941044fc3d93caed23" + integrity sha512-ElxZlGvLDWcXHYDbHu7wTU69LlzoQHF/r70Gn3ikr8TkLOuqy57EPxYpTTbBr0bAAF9O54ciYPQ4Knpmkk8ZbA== dependencies: - "@zowe/zosmf-for-zowe-sdk" "7.19.0" + "@zowe/zosmf-for-zowe-sdk" "7.21.0" -"@zowe/zos-uss-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/zos-uss-for-zowe-sdk/-/zos-uss-for-zowe-sdk-7.19.0.tgz#588939eef3642dbf85a69a3a4e8b94da9909d731" - integrity sha512-TNk4x0etnUt9RWiYuN4ooxvbb2+Zi6ZQF1gHeVP3M96lR/O89LKhBlwK4LOjEn/6+9M3CCdbRylCqjbqJehijQ== +"@zowe/zos-uss-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/zos-uss-for-zowe-sdk/-/zos-uss-for-zowe-sdk-7.21.0.tgz#ce6c90d314845ecd2337ca585d6ab6689413f251" + integrity sha512-UH+7o1cjZ+OuL3HuVjTd07Q8cLJQunYdjM4haWb5ayuUnc0/hSMH7AmjyVPP15YttCFLATsfbRh3ruW/7oYnrA== dependencies: ssh2 "1.11.0" -"@zowe/zos-workflows-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/zos-workflows-for-zowe-sdk/-/zos-workflows-for-zowe-sdk-7.19.0.tgz#aba933cb3675651b386b862c9afe79518639f7c2" - integrity sha512-J9zHUJzL4QPKg2NiRPkCIu1v36aAn4wAOQHl4o74h0dH3Ncz7fI1DDxUTlSAaA9W6dHFJV9g4YEToUpwn07mQQ== +"@zowe/zos-workflows-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/zos-workflows-for-zowe-sdk/-/zos-workflows-for-zowe-sdk-7.21.0.tgz#66b09c655ef819b0f44a31fcd0bdcfd4d255c244" + integrity sha512-9BEVXlwzLoIZmDdaduW//WIReCnQz9QbJD645BkIngbeio0tEuI3/oe/I088gHDjqZucV1mJ51b7z5i1yNElHQ== dependencies: - "@zowe/zos-files-for-zowe-sdk" "7.19.0" + "@zowe/zos-files-for-zowe-sdk" "7.21.0" -"@zowe/zosmf-for-zowe-sdk@7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@zowe/zosmf-for-zowe-sdk/-/zosmf-for-zowe-sdk-7.19.0.tgz#e6fc7f7ae4aaa6531345dc5ac38bcc55d52bda45" - integrity sha512-pdy4mrRbvEmmhs9Vuuak5T3gaMpG6SK8WkET0i3/TiIuG0aAU1g9vMgcnfeHJyz82jXQrjfvHeGX5ei74zGWqg== +"@zowe/zosmf-for-zowe-sdk@7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@zowe/zosmf-for-zowe-sdk/-/zosmf-for-zowe-sdk-7.21.0.tgz#e540b2eec3e36d73b491f3db3a366eeb48b55273" + integrity sha512-uvraOpYVMVmDSjCiQcvPukauQSabXGgY+FwMBFdDw0kCs0b/1jVAQA5jVgzNuvuTlD4l+pCJYILsh/lmb9SfqA== abab@^2.0.3, abab@^2.0.5: version "2.0.6" @@ -10223,14 +10222,7 @@ semver@7.0.0: resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.5.2: - version "7.5.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz" - integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== - dependencies: - lru-cache "^6.0.0" - -semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.0, semver@^7.5.3: +semver@7.5.4, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.0, semver@^7.5.3: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== From c81cf50c51c39fa741bda2024366468be20f666d Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Fri, 5 Jan 2024 11:26:42 -0500 Subject: [PATCH 08/21] chore: remove test schemaVersion from zftp type Signed-off-by: Trae Yelovich --- packages/zowe-explorer-ftp-extension/src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zowe-explorer-ftp-extension/src/extension.ts b/packages/zowe-explorer-ftp-extension/src/extension.ts index 774a2b6e94..abdab24b6f 100644 --- a/packages/zowe-explorer-ftp-extension/src/extension.ts +++ b/packages/zowe-explorer-ftp-extension/src/extension.ts @@ -43,7 +43,7 @@ async function registerFtpApis(): Promise { zoweExplorerApi.registerJesApi(new FtpJesApi()); const meta = await CoreUtils.getProfileMeta(); - await zoweExplorerApi.getExplorerExtenderApi().initForZowe("zftp", [{ ...meta[0], schemaVersion: "1.0.0" }]); + await zoweExplorerApi.getExplorerExtenderApi().initForZowe("zftp", meta); await zoweExplorerApi.getExplorerExtenderApi().reloadProfiles("zftp"); await Gui.showMessage("Zowe Explorer was modified for FTP support.", { logger: ZoweLogger }); From cad6bf5297e00a1119303cffc583af5d9c866a78 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Fri, 5 Jan 2024 15:13:45 -0500 Subject: [PATCH 09/21] fix(tests): Update test cases to mock imperative API Signed-off-by: Trae Yelovich --- .../__mocks__/@zowe/imperative.ts | 8 ++ .../ZoweExplorerExtender.unit.test.ts | 96 ++++++------------- 2 files changed, 39 insertions(+), 65 deletions(-) diff --git a/packages/zowe-explorer/__mocks__/@zowe/imperative.ts b/packages/zowe-explorer/__mocks__/@zowe/imperative.ts index 8a44e78e88..8aeabc737b 100644 --- a/packages/zowe-explorer/__mocks__/@zowe/imperative.ts +++ b/packages/zowe-explorer/__mocks__/@zowe/imperative.ts @@ -246,6 +246,14 @@ export class ProfileInfo { public readProfilesFromDisk(teamCfgOpts?: IConfigOpts) { return; } + + public addProfileTypeToSchema(profileType: string, typeInfo: { + sourceApp: string; + schema: any; + version?: string; + }): any { + return; + } } export class ImperativeError extends Error { diff --git a/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts index 5bae8a1897..d70de77fec 100644 --- a/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts @@ -22,8 +22,9 @@ import { Profiles } from "../../src/Profiles"; import * as path from "path"; import * as fs from "fs"; import { getZoweDir, Gui } from "@zowe/zowe-explorer-api"; -import * as profUtils from "../../src/utils/ProfilesUtils"; +import { ProfilesUtils } from "../../src/utils/ProfilesUtils"; import { ZoweLogger } from "../../src/utils/LoggerUtils"; +import { SettingsConfig } from "../../src/utils/SettingsConfig"; jest.mock("fs"); describe("ZoweExplorerExtender unit tests", () => { @@ -205,7 +206,7 @@ describe("ZoweExplorerExtender unit tests", () => { const readProfilesFromDiskSpy = jest.fn(); const refreshProfilesQueueAddSpy = jest.spyOn((ZoweExplorerExtender as any).refreshProfilesQueue, "add"); - jest.spyOn(profUtils.ProfilesUtils, "getProfileInfo").mockReturnValue({ + jest.spyOn(ProfilesUtils, "getProfileInfo").mockReturnValueOnce({ readProfilesFromDisk: readProfilesFromDiskSpy, } as any); await expect(blockMocks.instTest.initForZowe("USS", ["" as any])).resolves.not.toThrow(); @@ -214,80 +215,45 @@ describe("ZoweExplorerExtender unit tests", () => { }); describe("Add to Schema functionality", () => { + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type const updateSchema = async ( - level: string = "global", - writeFileSyncImpl: ( - path: number | fs.PathLike, - data: string | ArrayBufferView, - options?: fs.WriteFileOptions | undefined - ) => void = jest.fn() + addProfileTypeToSchemaMock: ( + profileType: string, + typeInfo: { sourceApp: string; schema: any; version?: string | undefined } + ) => any = jest.fn() ) => { const blockMocks = await createBlockMocks(); - const readProfilesFromDisk = jest.fn(); - const schemaFolder = path.resolve("__mocks__"); - if (level === "project") { - Object.defineProperty(vscode.workspace, "workspaceFolders", { - value: [ - { - uri: { - fsPath: schemaFolder, - }, - }, - ], - configurable: true, - }); - } - - jest.spyOn(profUtils.ProfilesUtils, "getProfileInfo").mockResolvedValueOnce({ usingTeamConfig: true, readProfilesFromDisk } as any); - const writeFileSyncSpy = jest.spyOn(fs, "writeFileSync").mockImplementation(writeFileSyncImpl); - jest.spyOn(imperative.ConfigSchema, "loadSchema").mockReturnValue([ - { - type: "zosmf", - schema: {} as any, - }, - { - type: "base", - schema: {} as any, - }, - ]); - await blockMocks.instTest.initForZowe("sample", [ + // bypass "if (hasSecureCredentialManagerEnabled)" check for sake of testing + jest.spyOn(SettingsConfig, "getDirectValue").mockReturnValueOnce(false); + jest.spyOn(ZoweLogger, "trace").mockImplementation(); + jest.spyOn(ZoweLogger, "info").mockImplementation(); + const profInfo = await ProfilesUtils.getProfileInfo(false); + const addProfTypeToSchema = jest + .spyOn(imperative.ProfileInfo.prototype, "addProfileTypeToSchema") + .mockImplementation(addProfileTypeToSchemaMock as unknown as any); + await (blockMocks.instTest as any).updateSchema(profInfo, [ { + type: "test-type", schema: {} as any, - type: "sample", - }, + } as any, ]); - expect(writeFileSyncSpy).toHaveBeenCalled(); - writeFileSyncSpy.mockRestore(); + expect(addProfTypeToSchema).toHaveBeenCalled(); }; - describe("global schema", () => { - it("should update when an extender calls initForZowe", async () => { - await updateSchema(); - }); - - it("should throw an error if the schema is read-only", async () => { - const errorMessageSpy = jest.spyOn(Gui, "errorMessage"); - await updateSchema("global", (_filepath, _contents) => { - const err = new Error(); - Object.defineProperty(err, "code", { - value: "EACCES", - }); - throw err; - }); - expect(errorMessageSpy).toHaveBeenCalledWith( - `Failed to update Zowe schema at ${path.join( - "__tests__", - ".zowe", - "zowe.schema.json" - )}: insufficient permissions or read-only file` - ); - }); + it("should update the schema when an extender calls initForZowe", async () => { + await updateSchema(); }); - describe("project-level schema", () => { - it("should update when an extender calls initForZowe", async () => { - await updateSchema("project"); + it("should throw an error if the schema is read-only", async () => { + const errorMessageSpy = jest.spyOn(Gui, "errorMessage"); + await updateSchema((_filepath, _contents) => { + const err = new Error(); + Object.defineProperty(err, "code", { + value: "EACCES", + }); + throw err; }); + expect(errorMessageSpy).toHaveBeenCalledWith("Failed to update Zowe schema: insufficient permissions or read-only file"); }); }); }); From 17d9ea9ff7e4d55830dfca6491e74b7f3829ec17 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Tue, 23 Jan 2024 09:43:28 -0500 Subject: [PATCH 10/21] prepare: check for relocated schema version Signed-off-by: Trae Yelovich --- packages/zowe-explorer/src/ZoweExplorerExtender.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zowe-explorer/src/ZoweExplorerExtender.ts b/packages/zowe-explorer/src/ZoweExplorerExtender.ts index c394b820b0..ba6850098e 100644 --- a/packages/zowe-explorer/src/ZoweExplorerExtender.ts +++ b/packages/zowe-explorer/src/ZoweExplorerExtender.ts @@ -222,7 +222,7 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende const addResult = profileInfo.addProfileTypeToSchema(typeConfig.type, { schema: typeConfig.schema, sourceApp: "Zowe Explorer (for VS Code)", - version: typeConfig.schemaVersion + version: typeConfig.schema.version }); if (addResult.info.length > 0) { Gui.warningMessage(addResult.info); From b7d8573856ddd2b645f627f4180f41ccebeb9282 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Tue, 23 Jan 2024 12:17:07 -0500 Subject: [PATCH 11/21] refactor: remove version from addProfileTypeToSchema call Signed-off-by: Trae Yelovich --- package.json | 2 +- .../sample/src/ZoweExplorerExtender.i18n.json | 3 ++- .../zowe-explorer/src/ZoweExplorerExtender.ts | 3 +-- yarn.lock | 18 +++++------------- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index b3cea1f3fa..b6bee62a32 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "vscode-nls": "4.1.2" }, "resolutions": { - "@zowe/imperative": "file:imp-5.20.0-schema-mgmt.tgz" + "@zowe/imperative": "file:zowe-imperative-5.21.0.tgz" }, "devDependencies": { "@types/jest": "^29.2.3", diff --git a/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json b/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json index 64590cd306..4159f0f8a6 100644 --- a/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json +++ b/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json @@ -1,3 +1,4 @@ { - "initialize.profiles.error": "Error encountered when loading your Zowe config. Click \"Show Config\" for more details." + "initialize.profiles.error": "Error encountered when loading your Zowe config. Click \"Show Config\" for more details.", + "zowe.schema.cannotAccess": "Failed to update Zowe schema: insufficient permissions or read-only file" } diff --git a/packages/zowe-explorer/src/ZoweExplorerExtender.ts b/packages/zowe-explorer/src/ZoweExplorerExtender.ts index ba6850098e..61bd283271 100644 --- a/packages/zowe-explorer/src/ZoweExplorerExtender.ts +++ b/packages/zowe-explorer/src/ZoweExplorerExtender.ts @@ -221,8 +221,7 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende for (const typeConfig of profileTypeConfigurations) { const addResult = profileInfo.addProfileTypeToSchema(typeConfig.type, { schema: typeConfig.schema, - sourceApp: "Zowe Explorer (for VS Code)", - version: typeConfig.schema.version + sourceApp: "Zowe Explorer (for VS Code)" }); if (addResult.info.length > 0) { Gui.warningMessage(addResult.info); diff --git a/yarn.lock b/yarn.lock index 2242bcffab..2f293573df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2674,10 +2674,9 @@ comment-json "4.1.1" string-width "4.2.3" -"@zowe/imperative@5.21.0": +"@zowe/imperative@5.21.0", "@zowe/imperative@file:zowe-imperative-5.21.0.tgz": version "5.21.0" - resolved "https://registry.npmjs.org/@zowe/imperative/-/imperative-5.21.0.tgz#52cd216bf04a15fe60fcc9fa4603dba0f8c59da2" - integrity sha512-yjt3Mmn1ItfZZK42SecH+2U5rSvKl6k4ZqPvFaQIvzfVwhOeXi3Srx6/ulxDhSPN0txPUgeyIxz+PHSPtN5Elw== + resolved "file:zowe-imperative-5.21.0.tgz#47da40ba624d1a695df7cbf55e7e2b4faa43ef1d" dependencies: "@types/yargs" "13.0.4" chalk "2.4.2" @@ -2708,7 +2707,7 @@ progress "2.0.3" read "1.0.7" readline-sync "1.4.10" - semver "7.5.2" + semver "7.5.4" stack-trace "0.0.10" strip-ansi "6.0.1" which "3.0.0" @@ -10218,14 +10217,7 @@ semver@7.0.0: resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.5.2: - version "7.5.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz" - integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== - dependencies: - lru-cache "^6.0.0" - -semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.0, semver@^7.5.3: +semver@7.5.4, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.0, semver@^7.5.3: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -11636,7 +11628,7 @@ vite-plugin-checker@^0.6.2: vscode-languageserver-textdocument "^1.0.1" vscode-uri "^3.0.2" -vite@^4.4.12: +vite@^4.5.2: version "4.5.2" resolved "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz#d6ea8610e099851dad8c7371599969e0f8b97e82" integrity sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w== From a59602bfcacfa9eaee810bef04bdcc121938d88a Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Tue, 23 Jan 2024 14:00:36 -0500 Subject: [PATCH 12/21] feat: Show warning to end user if no schema found during ZE activation Signed-off-by: Trae Yelovich --- package.json | 2 +- .../i18n/sample/src/utils/ProfilesUtils.i18n.json | 1 + packages/zowe-explorer/src/utils/ProfilesUtils.ts | 12 ++++++++++-- yarn.lock | 4 ++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b6bee62a32..36b71d6a64 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "vscode-nls": "4.1.2" }, "resolutions": { - "@zowe/imperative": "file:zowe-imperative-5.21.0.tgz" + "@zowe/imperative": "file:zowe-imperative-5.21.0-schema-mgmt.tgz" }, "devDependencies": { "@types/jest": "^29.2.3", diff --git a/packages/zowe-explorer/i18n/sample/src/utils/ProfilesUtils.i18n.json b/packages/zowe-explorer/i18n/sample/src/utils/ProfilesUtils.i18n.json index b21b95cfa8..1ab9fb18a4 100644 --- a/packages/zowe-explorer/i18n/sample/src/utils/ProfilesUtils.i18n.json +++ b/packages/zowe-explorer/i18n/sample/src/utils/ProfilesUtils.i18n.json @@ -18,6 +18,7 @@ "ProfilesUtils.promptAndHandleMissingCredentialManager.install": "Install", "ProfilesUtils.promptAndHandleMissingCredentialManager.refreshMessage": "After installing the extension, please make sure to reload your VS Code window in order\n to start using the installed credential manager", "ProfilesUtils.promptAndHandleMissingCredentialManager.refreshButton": "Reload", + "profiles.noValidSchema": "No valid schema was found for the active team configuration. This may introduce issues with profiles in Zowe Explorer.", "zowe.promptCredentials.notSupported": "\"Update Credentials\" operation not supported when \"autoStore\" is false", "createNewConnection.option.prompt.profileName.placeholder": "Connection Name", "createNewConnection.option.prompt.profileName": "Enter a name for the connection.", diff --git a/packages/zowe-explorer/src/utils/ProfilesUtils.ts b/packages/zowe-explorer/src/utils/ProfilesUtils.ts index 05e37957d2..50d5090ad0 100644 --- a/packages/zowe-explorer/src/utils/ProfilesUtils.ts +++ b/packages/zowe-explorer/src/utils/ProfilesUtils.ts @@ -442,7 +442,7 @@ export class ProfilesUtils { return this.setupDefaultCredentialManager(); } - public static async readConfigFromDisk(): Promise { + public static async readConfigFromDisk(warnForMissingSchema?: boolean): Promise { ZoweLogger.trace("ProfilesUtils.readConfigFromDisk called."); let rootPath: string; const mProfileInfo = await ProfilesUtils.getProfileInfo(globals.ISTHEIA); @@ -453,6 +453,14 @@ export class ProfilesUtils { await mProfileInfo.readProfilesFromDisk({ homeDir: getZoweDir(), projectDir: undefined }); } if (mProfileInfo.usingTeamConfig) { + if (warnForMissingSchema && !mProfileInfo.hasValidSchema) { + const schemaWarning = localize( + "profiles.noValidSchema", + "No valid schema was found for the active team configuration. This may introduce issues with profiles in Zowe Explorer." + ); + Gui.warningMessage(schemaWarning); + ZoweLogger.warn(schemaWarning); + } globals.setConfigPath(rootPath); ZoweLogger.info(`Zowe Explorer is using the team configuration file "${mProfileInfo.getTeamConfig().configName}"`); const layers = mProfileInfo.getTeamConfig().layers || []; @@ -627,7 +635,7 @@ export class ProfilesUtils { } try { - await ProfilesUtils.readConfigFromDisk(); + await ProfilesUtils.readConfigFromDisk(true); ZoweLogger.info(localize("initializeZoweProfiles.success", "Zowe Profiles initialized successfully.")); } catch (err) { if (err instanceof imperative.ImperativeError) { diff --git a/yarn.lock b/yarn.lock index 2f293573df..93da1e8dd7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2674,9 +2674,9 @@ comment-json "4.1.1" string-width "4.2.3" -"@zowe/imperative@5.21.0", "@zowe/imperative@file:zowe-imperative-5.21.0.tgz": +"@zowe/imperative@5.21.0", "@zowe/imperative@file:zowe-imperative-5.21.0-schema-mgmt.tgz": version "5.21.0" - resolved "file:zowe-imperative-5.21.0.tgz#47da40ba624d1a695df7cbf55e7e2b4faa43ef1d" + resolved "file:zowe-imperative-5.21.0-schema-mgmt.tgz#88b2f3222d56e46135577aee72b783540ab7338b" dependencies: "@types/yargs" "13.0.4" chalk "2.4.2" From 369be7c3d1a80b3a3b8e90f57ea64325148e4445 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 29 Jan 2024 09:23:24 -0500 Subject: [PATCH 13/21] deps: Update @zowe/cli to 7.23.0 Signed-off-by: Trae Yelovich --- package.json | 5 +- packages/zowe-explorer-api/package.json | 2 +- yarn.lock | 146 ++++++++++++------------ 3 files changed, 73 insertions(+), 80 deletions(-) diff --git a/package.json b/package.json index 0df8e29144..e0d6366573 100644 --- a/package.json +++ b/package.json @@ -16,12 +16,9 @@ "vscode": "^1.53.2" }, "dependencies": { - "@zowe/cli": "7.22.0", + "@zowe/cli": "7.23.0", "vscode-nls": "4.1.2" }, - "resolutions": { - "@zowe/imperative": "file:zowe-imperative-5.21.0-schema-mgmt.tgz" - }, "devDependencies": { "@types/jest": "^29.2.3", "@types/mocha": "^10.0.1", diff --git a/packages/zowe-explorer-api/package.json b/packages/zowe-explorer-api/package.json index d2e041fb11..e2f7651c18 100644 --- a/packages/zowe-explorer-api/package.json +++ b/packages/zowe-explorer-api/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@types/vscode": "^1.53.2", - "@zowe/cli": "7.22.0", + "@zowe/cli": "7.23.0", "@zowe/secrets-for-zowe-sdk": "7.18.6", "handlebars": "^4.7.7", "semver": "^7.5.3" diff --git a/yarn.lock b/yarn.lock index 93da1e8dd7..3a2007d74c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2642,22 +2642,22 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zowe/cli@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/cli/-/cli-7.22.0.tgz#63e648337a1d61aad017748acca7468dc3940a24" - integrity sha512-Z+9403u7pPpge+WHAuuMqwSBaWNC+3qw0eL5aIVPgnvGPpQWWN0sL5mOaDo117GN9I1p8ee7tWqwrcll55tP0w== - dependencies: - "@zowe/core-for-zowe-sdk" "7.22.0" - "@zowe/imperative" "5.21.0" - "@zowe/provisioning-for-zowe-sdk" "7.22.0" - "@zowe/zos-console-for-zowe-sdk" "7.22.0" - "@zowe/zos-files-for-zowe-sdk" "7.22.0" - "@zowe/zos-jobs-for-zowe-sdk" "7.22.0" - "@zowe/zos-logs-for-zowe-sdk" "7.22.0" - "@zowe/zos-tso-for-zowe-sdk" "7.22.0" - "@zowe/zos-uss-for-zowe-sdk" "7.22.0" - "@zowe/zos-workflows-for-zowe-sdk" "7.22.0" - "@zowe/zosmf-for-zowe-sdk" "7.22.0" +"@zowe/cli@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/cli/-/cli-7.23.0.tgz#1ce2f4d2037b4d4dfdbf9d0ab6ec8f18984c798c" + integrity sha512-NVgeVn3bCu0zC1qgaXYo0qvVX3rgh58gI2JqrevY1XuRkAlFseTG02RscOfQjmPmBW6JQtbwd4ANEl6azYN2rA== + dependencies: + "@zowe/core-for-zowe-sdk" "7.23.0" + "@zowe/imperative" "5.22.0" + "@zowe/provisioning-for-zowe-sdk" "7.23.0" + "@zowe/zos-console-for-zowe-sdk" "7.23.0" + "@zowe/zos-files-for-zowe-sdk" "7.23.0" + "@zowe/zos-jobs-for-zowe-sdk" "7.23.0" + "@zowe/zos-logs-for-zowe-sdk" "7.23.0" + "@zowe/zos-tso-for-zowe-sdk" "7.23.0" + "@zowe/zos-uss-for-zowe-sdk" "7.23.0" + "@zowe/zos-workflows-for-zowe-sdk" "7.23.0" + "@zowe/zosmf-for-zowe-sdk" "7.23.0" find-process "1.4.7" get-stream "6.0.1" lodash "4.17.21" @@ -2666,17 +2666,18 @@ optionalDependencies: "@zowe/secrets-for-zowe-sdk" "7.18.6" -"@zowe/core-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/core-for-zowe-sdk/-/core-for-zowe-sdk-7.22.0.tgz#ae271ee84e52f48b5508b74affb5f9aa5d4adbdf" - integrity sha512-uLkbxn0KvI6MiSZ8Y0SZRFJhvDarwhlvvW/oiSjIyNHeNtuTb31s5eYLTCdvX585om98wyVEKwYWK3ITzQ6w6g== +"@zowe/core-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/core-for-zowe-sdk/-/core-for-zowe-sdk-7.23.0.tgz#8ade9eeb1b8145468e0a7a8770a026b2206bd73c" + integrity sha512-y7bm4nhuIVtKhL9aa6M++Cj3UETwRwMiZzRbzeSqphn4P83umQ4NTHfltJL5xPouDIaqXBNhKET8UecBXJntrQ== dependencies: comment-json "4.1.1" string-width "4.2.3" -"@zowe/imperative@5.21.0", "@zowe/imperative@file:zowe-imperative-5.21.0-schema-mgmt.tgz": - version "5.21.0" - resolved "file:zowe-imperative-5.21.0-schema-mgmt.tgz#88b2f3222d56e46135577aee72b783540ab7338b" +"@zowe/imperative@5.22.0": + version "5.22.0" + resolved "https://registry.npmjs.org/@zowe/imperative/-/imperative-5.22.0.tgz#b79f9630fd6afc4c4ea907f403c4133784838285" + integrity sha512-XSTlHuaKtI2FsWYSQWNIx2rR739Zv8pkjvvxBDesyiCYXOpo4u/1RxkeAE/FKfw5UgVKR6yq7izLeeOpPjj3IA== dependencies: "@types/yargs" "13.0.4" chalk "2.4.2" @@ -2694,12 +2695,12 @@ jest-diff "27.0.6" js-yaml "4.1.0" jsonfile "4.0.0" - jsonschema "1.1.1" + jsonschema "1.4.1" lodash "4.17.21" lodash-deep "2.0.0" log4js "6.4.6" markdown-it "12.3.2" - mustache "2.3.0" + mustache "4.2.0" npm-package-arg "9.1.0" opener "1.5.2" pacote "11.1.4" @@ -2715,10 +2716,10 @@ yamljs "0.3.0" yargs "15.3.1" -"@zowe/provisioning-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/provisioning-for-zowe-sdk/-/provisioning-for-zowe-sdk-7.22.0.tgz#01bcd2a182c219115779b3f3aeee65e2f846d349" - integrity sha512-5wX+qXxXL3WlmmS9rnDDZeUL4K4fuUAJ+8H+z8z0qv++ffZSJc36Jkmi/D5tX9FanmB0/kpCgeHqx1rWE/mYtA== +"@zowe/provisioning-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/provisioning-for-zowe-sdk/-/provisioning-for-zowe-sdk-7.23.0.tgz#a359b44a2e60f33c243cb6d7272e47be7ca8c355" + integrity sha512-F+OSm0a5c4y2aX11XPVC6HSQM42T9puY9v6sTuvMHFIJBR7+gOoh5ijeyCy6eZMPmoXewsItc3oJEzbPHP5mKg== dependencies: js-yaml "4.1.0" @@ -2727,15 +2728,15 @@ resolved "https://registry.npmjs.org/@zowe/secrets-for-zowe-sdk/-/secrets-for-zowe-sdk-7.18.6.tgz#6b854b344babb291c26d19d82633099a46e08452" integrity sha512-YyS1NoXddb147mBQpu5/dTfo1gdwGa/xdg85U8KCngA+RHCmNct3n2rbK3tHx9C9H6rlgjeS+Mrux5Q+PHJUgQ== -"@zowe/zos-console-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/zos-console-for-zowe-sdk/-/zos-console-for-zowe-sdk-7.22.0.tgz#2088bee1963a9fa602df055a7078f63667a80f44" - integrity sha512-EI9rK76eq5kGXJqGkhobLMdNJstVUSswJ2JlNvGzwOQD/jV/7OJRHSHPllygMGaos8Rh14mzPDooeb9CBr5faA== +"@zowe/zos-console-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/zos-console-for-zowe-sdk/-/zos-console-for-zowe-sdk-7.23.0.tgz#03a862339a70a09646af8791074da891b56cb343" + integrity sha512-nc3zpGRn5H0xX2ynIB1EB9OQiyIMu74qoXA6XTuYgaa/5gtb/xIxkeB9POC45aSAGJFjXDMT+3jeVKWhrtRVVw== -"@zowe/zos-files-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/zos-files-for-zowe-sdk/-/zos-files-for-zowe-sdk-7.22.0.tgz#a692b09016c0350685cf085dc47cb9591fec11d3" - integrity sha512-jw1j9q77DTQgm5i0YuslN454zC4eS0qb5PnfZ1thCbUugLxI/LRR1CgV59rTfqMGHMjXyfmmqjtCot4NMLUV1A== +"@zowe/zos-files-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/zos-files-for-zowe-sdk/-/zos-files-for-zowe-sdk-7.23.0.tgz#dba5221b107831577c8e9c6ba1e39cd66bfeb782" + integrity sha512-2MWuS2JyZ6f2bZVS/SAOaAihuLZt1kWmp4zalJcSNLtwOp5cMWm4iKtKIokrdtb35IZOMADaiG31c/Sm71fZzQ== dependencies: get-stream "6.0.1" minimatch "5.0.1" @@ -2747,43 +2748,43 @@ dependencies: zos-node-accessor "1.0.14" -"@zowe/zos-jobs-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/zos-jobs-for-zowe-sdk/-/zos-jobs-for-zowe-sdk-7.22.0.tgz#4447071d304bc8c6348c08bdd8f28e84213aa1ac" - integrity sha512-QdKjWgQV7uEvLhHED48TBmQ2EhKn8ZG9OVrZiAa82k0AIsps5U2Wv/W9M1PyWlCEWQP/Zok7PpRWi3Bbv010cQ== +"@zowe/zos-jobs-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/zos-jobs-for-zowe-sdk/-/zos-jobs-for-zowe-sdk-7.23.0.tgz#0f4cc083771a8673f38b53a2d76ebf0e931a68ac" + integrity sha512-FoYxZeC8BpI0Pd5X3vJyo7ViXBhXLvrdogNmWuTvYfMVj78xDp/ZoSon9JDJhurOhtjWOdnwrfPZVyI074PHNw== dependencies: - "@zowe/zos-files-for-zowe-sdk" "7.22.0" + "@zowe/zos-files-for-zowe-sdk" "7.23.0" -"@zowe/zos-logs-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/zos-logs-for-zowe-sdk/-/zos-logs-for-zowe-sdk-7.22.0.tgz#61500c48b76c2458243508d83137f221393ffb44" - integrity sha512-XA/ZH1LsdqE9vTA6GOlI3t6RsgA7hf+efImVltE9brVlFrrIgXCD46A9CVDl6bmkp/tFQqCdMYHjHFbWiwN4WA== +"@zowe/zos-logs-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/zos-logs-for-zowe-sdk/-/zos-logs-for-zowe-sdk-7.23.0.tgz#fa1e40ce1e681f4d2b56b23f2c8585dce918dbfd" + integrity sha512-7OnIIiwbiL7qEYXTfBVIW7EoXc+jKMygDQmIpUaTgOeu5cnmy5/SfvF4YtaW8eVJvsEJG0p1w77WMGGSyvQDEw== -"@zowe/zos-tso-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/zos-tso-for-zowe-sdk/-/zos-tso-for-zowe-sdk-7.22.0.tgz#38c0ba26bbcc6af0564911883e21bd9ad5c217e4" - integrity sha512-vzhKJUk6E/EHjH8BadCfpL45C40qmJxYlSHAIHitAtFcOkI4F7i13mlgulaxPCiTTV3jBw4g+JoJe8DwG1eiyA== +"@zowe/zos-tso-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/zos-tso-for-zowe-sdk/-/zos-tso-for-zowe-sdk-7.23.0.tgz#a3302f9e529071bbc91d5ea4353ea6e0154a7968" + integrity sha512-+cj39Vo42wIPSK8eiX7WcBrk2JyxKQZuZnFvXbtcX9j/i/05GAM7kfYX1JVKsd2v59dbmYkOotb0q+GSIDMKGA== dependencies: - "@zowe/zosmf-for-zowe-sdk" "7.22.0" + "@zowe/zosmf-for-zowe-sdk" "7.23.0" -"@zowe/zos-uss-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/zos-uss-for-zowe-sdk/-/zos-uss-for-zowe-sdk-7.22.0.tgz#3b6bb8dedae1a6c4f367189cf6b3bdbab0aca822" - integrity sha512-c3yXBdBWW2I1WbkMvgmx/EMNEpxJmCRZ0gygjYd1xM//wWhPaigOVY5XSRTpnXS0UY6KOX9T7ZymlCe6XzAhEQ== +"@zowe/zos-uss-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/zos-uss-for-zowe-sdk/-/zos-uss-for-zowe-sdk-7.23.0.tgz#76daf52d8ffd22a4db17cf526226b247e7d74810" + integrity sha512-+gIzbLbvhWM+zIXbvUMqpgBoKrKbf5lbSA7GTdf3oTHc1VZzy0YJFX/bIewDYZunMV/D91KVAQ1Fie8i1Xlkfg== dependencies: ssh2 "1.15.0" -"@zowe/zos-workflows-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/zos-workflows-for-zowe-sdk/-/zos-workflows-for-zowe-sdk-7.22.0.tgz#05537853832bcf2307a78907459fb43e59ca22ed" - integrity sha512-arM0gVpm0zM84JuIZSWTK+bCqu6gED0ubYJZAdI5ttsjSaiv+E4LM1OUkd05n0HCUGYeNrL30LEsswHUM7cqZA== +"@zowe/zos-workflows-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/zos-workflows-for-zowe-sdk/-/zos-workflows-for-zowe-sdk-7.23.0.tgz#6195ff3fcf1e8d50d806ca051a01500689b3b666" + integrity sha512-H9xbDhlY0m+BbNy7mOIS6kxPT1/UbHvavpi2y9ZtzxOV47sYxCOIfSGE7mvSTVSSjnV47B+mQT0h6qvX0Kqinw== dependencies: - "@zowe/zos-files-for-zowe-sdk" "7.22.0" + "@zowe/zos-files-for-zowe-sdk" "7.23.0" -"@zowe/zosmf-for-zowe-sdk@7.22.0": - version "7.22.0" - resolved "https://registry.npmjs.org/@zowe/zosmf-for-zowe-sdk/-/zosmf-for-zowe-sdk-7.22.0.tgz#cc87f28acf60b600eca5111d35ac8668aaec192a" - integrity sha512-D4nbTDr5uJxJev9+zNwbq/3Z3DuQR6qfmbofzDGYYaU1peFO7+ioFN+uAInFBS1jqj4iHko2KINJfPZFALg3/A== +"@zowe/zosmf-for-zowe-sdk@7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@zowe/zosmf-for-zowe-sdk/-/zosmf-for-zowe-sdk-7.23.0.tgz#fd235649093c4f936365692506ca854953a8e18c" + integrity sha512-zwavHYHuFQOS3AxmZ5bhsWKyniUgQTRyMwpguce09XdehLyveb2VwuH1tVAbggUZlP+ae8vqWQAVU2fdg+eiPg== abab@^2.0.3, abab@^2.0.5: version "2.0.6" @@ -7687,10 +7688,10 @@ jsonparse@^1.3.1: resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= -jsonschema@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.1.1.tgz" - integrity sha1-PO3o4+QR03eHLu+8n98mODy8Ptk= +jsonschema@1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== jszip@^3.1.3: version "3.9.1" @@ -8554,14 +8555,9 @@ multimatch@^2.0.0: arrify "^1.0.0" minimatch "^3.0.0" -mustache@2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz" - integrity sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA= - -mustache@^4.0.0: +mustache@4.2.0, mustache@^4.0.0: version "4.2.0" - resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz" + resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== mute-stdout@^1.0.0: From b6574645ef2bdf68dbcde7d7d14e2b65a57a5ed9 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 29 Jan 2024 09:24:08 -0500 Subject: [PATCH 14/21] tests: adjust mocks, remove unused schema files Signed-off-by: Trae Yelovich --- .../zowe-explorer/__mocks__/sampleSchema.json | 102 --------- .../zowe-explorer/__mocks__/zowe.schema.json | 213 ------------------ .../ZoweExplorerExtender.unit.test.ts | 7 +- 3 files changed, 5 insertions(+), 317 deletions(-) delete mode 100644 packages/zowe-explorer/__mocks__/sampleSchema.json delete mode 100644 packages/zowe-explorer/__mocks__/zowe.schema.json diff --git a/packages/zowe-explorer/__mocks__/sampleSchema.json b/packages/zowe-explorer/__mocks__/sampleSchema.json deleted file mode 100644 index a0a78bd7b3..0000000000 --- a/packages/zowe-explorer/__mocks__/sampleSchema.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$version": "1.0", - "type": "object", - "description": "Zowe configuration", - "properties": { - "profiles": { - "type": "object", - "description": "Mapping of profile names to profile configurations", - "patternProperties": { - "^\\S*$": { - "type": "object", - "description": "Profile configuration object", - "properties": { - "type": { - "description": "Profile type", - "type": "string", - "enum": ["sample"] - }, - "properties": { - "description": "Profile properties object", - "type": "object" - }, - "profiles": { - "description": "Optional subprofile configurations", - "type": "object", - "$ref": "#/properties/profiles" - }, - "secure": { - "description": "Secure property names", - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - } - }, - "allOf": [ - { - "if": { - "properties": { - "type": false - } - }, - "then": { - "properties": { - "properties": { - "title": "Missing profile type" - } - } - } - }, - { - "if": { - "properties": { - "type": { - "const": "sample" - } - } - }, - "then": { - "properties": { - "properties": { - "type": "object", - "title": "Sample Profile", - "description": "Sample profile that stores values", - "properties": { - "host": { - "type": "string", - "description": "Host name of sample service on the mainframe." - } - }, - "required": [] - }, - "secure": { - "items": { - "enum": ["user", "password", "tokenValue"] - } - } - } - } - } - ] - } - } - }, - "defaults": { - "type": "object", - "description": "Mapping of profile types to default profile names", - "properties": { - "sample": { - "description": "Default sample profile", - "type": "string" - } - } - }, - "autoStore": { - "type": "boolean", - "description": "If true, values you enter when prompted are stored for future use" - } - } -} diff --git a/packages/zowe-explorer/__mocks__/zowe.schema.json b/packages/zowe-explorer/__mocks__/zowe.schema.json deleted file mode 100644 index bb34b77cfe..0000000000 --- a/packages/zowe-explorer/__mocks__/zowe.schema.json +++ /dev/null @@ -1,213 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$version": "1.0", - "type": "object", - "description": "Zowe configuration", - "properties": { - "profiles": { - "type": "object", - "description": "Mapping of profile names to profile configurations", - "patternProperties": { - "^\\S*$": { - "type": "object", - "description": "Profile configuration object", - "properties": { - "type": { - "description": "Profile type", - "type": "string", - "enum": ["zosmf", "base"] - }, - "properties": { - "description": "Profile properties object", - "type": "object" - }, - "profiles": { - "description": "Optional subprofile configurations", - "type": "object", - "$ref": "#/properties/profiles" - }, - "secure": { - "description": "Secure property names", - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - } - }, - "allOf": [ - { - "if": { - "properties": { - "type": false - } - }, - "then": { - "properties": { - "properties": { - "title": "Missing profile type" - } - } - } - }, - { - "if": { - "properties": { - "type": { - "const": "zosmf" - } - } - }, - "then": { - "properties": { - "properties": { - "type": "object", - "title": "z/OSMF Profile", - "description": "z/OSMF Profile", - "properties": { - "host": { - "type": "string", - "description": "The z/OSMF server host name." - }, - "port": { - "type": "number", - "description": "The z/OSMF server port.", - "default": 443 - }, - "user": { - "type": "string", - "description": "Mainframe (z/OSMF) user name, which can be the same as your TSO login." - }, - "password": { - "type": "string", - "description": "Mainframe (z/OSMF) password, which can be the same as your TSO password." - }, - "rejectUnauthorized": { - "type": "boolean", - "description": "Reject self-signed certificates.", - "default": true - }, - "certFile": { - "type": "string", - "description": "The file path to a certificate file to use for authentication" - }, - "certKeyFile": { - "type": "string", - "description": "The file path to a certificate key file to use for authentication" - }, - "basePath": { - "type": "string", - "description": "The base path for your API mediation layer instance. Specify this option to prepend the base path to all z/OSMF resources when making REST requests. Do not specify this option if you are not using an API mediation layer." - }, - "protocol": { - "type": "string", - "description": "The protocol used (HTTP or HTTPS)", - "default": "https", - "enum": ["http", "https"] - }, - "encoding": { - "type": "string", - "description": "The encoding for download and upload of z/OS data set and USS files. The default encoding if not specified is IBM-1047." - }, - "responseTimeout": { - "type": "number", - "description": "The maximum amount of time in seconds the z/OSMF Files TSO servlet should run before returning a response. Any request exceeding this amount of time will be terminated and return an error. Allowed values: 5 - 600" - } - }, - "required": [] - }, - "secure": { - "items": { - "enum": ["user", "password"] - } - } - } - } - }, - { - "if": { - "properties": { - "type": { - "const": "base" - } - } - }, - "then": { - "properties": { - "properties": { - "type": "object", - "title": "Base Profile", - "description": "Base profile that stores values shared by multiple service profiles", - "properties": { - "host": { - "type": "string", - "description": "Host name of service on the mainframe." - }, - "port": { - "type": "number", - "description": "Port number of service on the mainframe." - }, - "user": { - "type": "string", - "description": "User name to authenticate to service on the mainframe." - }, - "password": { - "type": "string", - "description": "Password to authenticate to service on the mainframe." - }, - "rejectUnauthorized": { - "type": "boolean", - "description": "Reject self-signed certificates.", - "default": true - }, - "tokenType": { - "type": "string", - "description": "The type of token to get and use for the API. Omit this option to use the default token type, which is provided by 'zowe auth login'." - }, - "tokenValue": { - "type": "string", - "description": "The value of the token to pass to the API." - }, - "certFile": { - "type": "string", - "description": "The file path to a certificate file to use for authentication" - }, - "certKeyFile": { - "type": "string", - "description": "The file path to a certificate key file to use for authentication" - } - }, - "required": [] - }, - "secure": { - "items": { - "enum": ["user", "password", "tokenValue"] - } - } - } - } - } - ] - } - } - }, - "defaults": { - "type": "object", - "description": "Mapping of profile types to default profile names", - "properties": { - "zosmf": { - "description": "Default zosmf profile", - "type": "string" - }, - "base": { - "description": "Default base profile", - "type": "string" - } - } - }, - "autoStore": { - "type": "boolean", - "description": "If true, values you enter when prompted are stored for future use" - } - } -} diff --git a/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts index d70de77fec..907619ad3a 100644 --- a/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts @@ -21,7 +21,7 @@ import { ZoweExplorerExtender } from "../../src/ZoweExplorerExtender"; import { Profiles } from "../../src/Profiles"; import * as path from "path"; import * as fs from "fs"; -import { getZoweDir, Gui } from "@zowe/zowe-explorer-api"; +import { getZoweDir, Gui, ProfilesCache } from "@zowe/zowe-explorer-api"; import { ProfilesUtils } from "../../src/utils/ProfilesUtils"; import { ZoweLogger } from "../../src/utils/LoggerUtils"; import { SettingsConfig } from "../../src/utils/SettingsConfig"; @@ -227,7 +227,10 @@ describe("ZoweExplorerExtender unit tests", () => { jest.spyOn(SettingsConfig, "getDirectValue").mockReturnValueOnce(false); jest.spyOn(ZoweLogger, "trace").mockImplementation(); jest.spyOn(ZoweLogger, "info").mockImplementation(); - const profInfo = await ProfilesUtils.getProfileInfo(false); + const profInfo = new imperative.ProfileInfo("zowe", { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + credMgrOverride: imperative.ProfileCredentials.defaultCredMgrWithKeytar(ProfilesCache.requireKeyring), + }); const addProfTypeToSchema = jest .spyOn(imperative.ProfileInfo.prototype, "addProfileTypeToSchema") .mockImplementation(addProfileTypeToSchemaMock as unknown as any); From 6f8bbe91d797cc41adbdc25917ed8566ee8a90ff Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 29 Jan 2024 09:24:47 -0500 Subject: [PATCH 15/21] i18n: remove unneeded 'zowe' scope from localized string id Signed-off-by: Trae Yelovich --- .../i18n/sample/src/ZoweExplorerExtender.i18n.json | 2 +- packages/zowe-explorer/src/ZoweExplorerExtender.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json b/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json index 4159f0f8a6..c5db5ea283 100644 --- a/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json +++ b/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json @@ -1,4 +1,4 @@ { "initialize.profiles.error": "Error encountered when loading your Zowe config. Click \"Show Config\" for more details.", - "zowe.schema.cannotAccess": "Failed to update Zowe schema: insufficient permissions or read-only file" + "schema.cannotAccess": "Failed to update Zowe schema: insufficient permissions or read-only file" } diff --git a/packages/zowe-explorer/src/ZoweExplorerExtender.ts b/packages/zowe-explorer/src/ZoweExplorerExtender.ts index 61bd283271..7688d7316c 100644 --- a/packages/zowe-explorer/src/ZoweExplorerExtender.ts +++ b/packages/zowe-explorer/src/ZoweExplorerExtender.ts @@ -209,7 +209,7 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende /** * Adds new types to the Zowe schema. - * @param profileInfo the ProfileInfo object that has been prepared with `readProfilesFromDisk`, such as the one initialized in `initForZowe`. + * @param profileInfo a ProfileInfo object that has been prepared with `readProfilesFromDisk` (such as the one initialized in `initForZowe`). * @param profileTypeConfigurations (optional) Profile type configurations to add to the schema */ private updateSchema( @@ -232,7 +232,7 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende if (err.code === "EACCES" || err.code === "EPERM") { Gui.errorMessage( localize( - "zowe.schema.cannotAccess", + "schema.cannotAccess", "Failed to update Zowe schema: insufficient permissions or read-only file", ) ); From 0389e019e373b25828d2a325ac421547ac241500 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 29 Jan 2024 09:47:22 -0500 Subject: [PATCH 16/21] format: run prettier Signed-off-by: Trae Yelovich --- .../zowe-explorer/__mocks__/@zowe/imperative.ts | 13 ++++++++----- .../uss/ussNodeActions.integration.test.ts | 4 ++-- packages/zowe-explorer/src/ZoweExplorerExtender.ts | 11 +++-------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/packages/zowe-explorer/__mocks__/@zowe/imperative.ts b/packages/zowe-explorer/__mocks__/@zowe/imperative.ts index 8aeabc737b..5ba8cc5b9c 100644 --- a/packages/zowe-explorer/__mocks__/@zowe/imperative.ts +++ b/packages/zowe-explorer/__mocks__/@zowe/imperative.ts @@ -247,11 +247,14 @@ export class ProfileInfo { return; } - public addProfileTypeToSchema(profileType: string, typeInfo: { - sourceApp: string; - schema: any; - version?: string; - }): any { + public addProfileTypeToSchema( + profileType: string, + typeInfo: { + sourceApp: string; + schema: any; + version?: string; + } + ): any { return; } } diff --git a/packages/zowe-explorer/__tests__/__integration__/uss/ussNodeActions.integration.test.ts b/packages/zowe-explorer/__tests__/__integration__/uss/ussNodeActions.integration.test.ts index eab79dc855..7e894f6d1e 100644 --- a/packages/zowe-explorer/__tests__/__integration__/uss/ussNodeActions.integration.test.ts +++ b/packages/zowe-explorer/__tests__/__integration__/uss/ussNodeActions.integration.test.ts @@ -122,7 +122,7 @@ describe("ussNodeActions integration test", async () => { it("should rename a uss file", async () => { let error; let list; - const beforeNameBase = beforeFileName.split("/").pop(); + const beforeNameBase = beforeFileName.split("/").pop()!; const afterNameBase = afterFileName.split("/").pop(); try { @@ -134,7 +134,7 @@ describe("ussNodeActions integration test", async () => { profile: testConst.profile.profile, }); const testNode = new ZoweUSSNode({ - label: beforeNameBase as string, + label: beforeNameBase, collapsibleState: vscode.TreeItemCollapsibleState.None, parentNode: testFolder, session, diff --git a/packages/zowe-explorer/src/ZoweExplorerExtender.ts b/packages/zowe-explorer/src/ZoweExplorerExtender.ts index 7688d7316c..ba7310755c 100644 --- a/packages/zowe-explorer/src/ZoweExplorerExtender.ts +++ b/packages/zowe-explorer/src/ZoweExplorerExtender.ts @@ -214,14 +214,14 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende */ private updateSchema( profileInfo: zowe.imperative.ProfileInfo, - profileTypeConfigurations?: zowe.imperative.ICommandProfileTypeConfiguration[], + profileTypeConfigurations?: zowe.imperative.ICommandProfileTypeConfiguration[] ): void { if (profileTypeConfigurations) { try { for (const typeConfig of profileTypeConfigurations) { const addResult = profileInfo.addProfileTypeToSchema(typeConfig.type, { schema: typeConfig.schema, - sourceApp: "Zowe Explorer (for VS Code)" + sourceApp: "Zowe Explorer (for VS Code)", }); if (addResult.info.length > 0) { Gui.warningMessage(addResult.info); @@ -230,12 +230,7 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende } catch (err) { // Only show an error if we failed to update the on-disk schema. if (err.code === "EACCES" || err.code === "EPERM") { - Gui.errorMessage( - localize( - "schema.cannotAccess", - "Failed to update Zowe schema: insufficient permissions or read-only file", - ) - ); + Gui.errorMessage(localize("schema.cannotAccess", "Failed to update Zowe schema: insufficient permissions or read-only file")); } } } From b8103dc4780122570db9e6bfd6c2f8fce6e8d33d Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 29 Jan 2024 09:54:39 -0500 Subject: [PATCH 17/21] deps: update zowe/cli on USS profile sample Signed-off-by: Trae Yelovich --- samples/uss-profile-sample/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/uss-profile-sample/package.json b/samples/uss-profile-sample/package.json index 8ef06f49e9..d8e23f1118 100644 --- a/samples/uss-profile-sample/package.json +++ b/samples/uss-profile-sample/package.json @@ -33,7 +33,7 @@ "watch": "tsc -watch -p ./" }, "dependencies": { - "@zowe/cli": "7.22.0", + "@zowe/cli": "7.23.0", "@zowe/zowe-explorer-api": "file:../../packages/zowe-explorer-api", "ssh2-sftp-client": "^9.1.0" }, From 8eafe34c6875cd938ecd6a2a5192805900d9a2be Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 29 Jan 2024 10:13:24 -0500 Subject: [PATCH 18/21] tests: cover 'missing schema warning message' Signed-off-by: Trae Yelovich --- packages/zowe-explorer/__mocks__/vscode.ts | 12 ++++++++ .../__unit__/utils/ProfilesUtils.unit.test.ts | 30 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/packages/zowe-explorer/__mocks__/vscode.ts b/packages/zowe-explorer/__mocks__/vscode.ts index 36d30b6634..fcc782eaff 100644 --- a/packages/zowe-explorer/__mocks__/vscode.ts +++ b/packages/zowe-explorer/__mocks__/vscode.ts @@ -279,6 +279,18 @@ export namespace window { return Promise.resolve(""); } + /** + * Show a warning message to users. Optionally provide an array of items which will be presented as + * clickable buttons. + * + * @param message The message to show. + * @param items A set of items that will be rendered as actions in the message. + * @return A thenable that resolves to the selected item or `undefined` when being dismissed. + */ + export function showWarningMessage(message: string, ...items: string[]): Thenable { + return Promise.resolve(""); + } + export function showTextDocument(document: TextDocument, column?: ViewColumn, preserveFocus?: boolean): any { return undefined; } diff --git a/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts index 15bb1dff32..cd8ad1e544 100644 --- a/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts @@ -366,6 +366,36 @@ describe("ProfilesUtils unit tests", () => { expect(mockReadProfilesFromDisk).toHaveBeenCalledTimes(1); profInfoSpy.mockRestore(); }); + + it("should warn the user when using team config with a missing schema", async () => { + const profInfoSpy = jest.spyOn(profUtils.ProfilesUtils, "getProfileInfo").mockReturnValueOnce({ + readProfilesFromDisk: jest.fn(), + usingTeamConfig: true, + hasValidSchema: false, + getTeamConfig: () => ({ + layers: [ + { + path: "test", + exists: true, + properties: { + defaults: "test", + }, + }, + { + path: "test", + exists: true, + properties: {}, + }, + ], + }), + } as never); + const warnMsgSpy = jest.spyOn(Gui, "warningMessage"); + await profUtils.ProfilesUtils.readConfigFromDisk(true); + expect(warnMsgSpy).toHaveBeenCalledWith( + "No valid schema was found for the active team configuration. This may introduce issues with profiles in Zowe Explorer." + ); + profInfoSpy.mockRestore(); + }); }); describe("promptCredentials", () => { From c934de2720eaa627cc7a06307d244c27fcec8a51 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Mon, 29 Jan 2024 10:29:17 -0500 Subject: [PATCH 19/21] doc: move changelog entry Signed-off-by: Trae Yelovich --- packages/zowe-explorer/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/zowe-explorer/CHANGELOG.md b/packages/zowe-explorer/CHANGELOG.md index bd475c7f4f..2d3a77ace5 100644 --- a/packages/zowe-explorer/CHANGELOG.md +++ b/packages/zowe-explorer/CHANGELOG.md @@ -6,6 +6,8 @@ All notable changes to the "vscode-extension-for-zowe" extension will be documen ### New features and enhancements +- Added the capability for extenders to contribute new profile types to the Zowe schema during extender activation. [#2508](https://github.com/zowe/vscode-extension-for-zowe/issues/2508) + ### Bug fixes ## `2.14.0` @@ -17,7 +19,6 @@ All notable changes to the "vscode-extension-for-zowe" extension will be documen - Adopted new common methods for `loginWithBaseProfile` and `logoutWithBaseProfile`. [#2493](https://github.com/zowe/vscode-extension-for-zowe/pull/2493) - Added APIML dynamic token support. [#2665](https://github.com/zowe/vscode-extension-for-zowe/issues/2665) - Implemented profile determination without triggering quick pick for `Submit JCL` if the file is part of Zowe Explorer's temp files. [#2628](https://github.com/zowe/vscode-extension-for-zowe/issues/2628) -- Added the capability for extenders to contribute new profile types to the Zowe schema during extender activation. [#2508](https://github.com/zowe/vscode-extension-for-zowe/issues/2508) ### Bug fixes From eb0815ca84b78e830b1940c075ebf83b3705e8ff Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Tue, 13 Feb 2024 12:51:50 -0500 Subject: [PATCH 20/21] deps: update zowe/cli to 7.23.3 Signed-off-by: Trae Yelovich --- package.json | 2 +- packages/zowe-explorer-api/package.json | 2 +- samples/uss-profile-sample/package.json | 2 +- yarn.lock | 126 ++++++++++++------------ 4 files changed, 66 insertions(+), 66 deletions(-) diff --git a/package.json b/package.json index e0d6366573..f437dc7d7a 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "vscode": "^1.53.2" }, "dependencies": { - "@zowe/cli": "7.23.0", + "@zowe/cli": "7.23.3", "vscode-nls": "4.1.2" }, "devDependencies": { diff --git a/packages/zowe-explorer-api/package.json b/packages/zowe-explorer-api/package.json index e2f7651c18..dde9f87d89 100644 --- a/packages/zowe-explorer-api/package.json +++ b/packages/zowe-explorer-api/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@types/vscode": "^1.53.2", - "@zowe/cli": "7.23.0", + "@zowe/cli": "7.23.3", "@zowe/secrets-for-zowe-sdk": "7.18.6", "handlebars": "^4.7.7", "semver": "^7.5.3" diff --git a/samples/uss-profile-sample/package.json b/samples/uss-profile-sample/package.json index d8e23f1118..b3f96ccc34 100644 --- a/samples/uss-profile-sample/package.json +++ b/samples/uss-profile-sample/package.json @@ -33,7 +33,7 @@ "watch": "tsc -watch -p ./" }, "dependencies": { - "@zowe/cli": "7.23.0", + "@zowe/cli": "7.23.3", "@zowe/zowe-explorer-api": "file:../../packages/zowe-explorer-api", "ssh2-sftp-client": "^9.1.0" }, diff --git a/yarn.lock b/yarn.lock index 3a2007d74c..f09bdd891d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2642,22 +2642,22 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zowe/cli@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/cli/-/cli-7.23.0.tgz#1ce2f4d2037b4d4dfdbf9d0ab6ec8f18984c798c" - integrity sha512-NVgeVn3bCu0zC1qgaXYo0qvVX3rgh58gI2JqrevY1XuRkAlFseTG02RscOfQjmPmBW6JQtbwd4ANEl6azYN2rA== - dependencies: - "@zowe/core-for-zowe-sdk" "7.23.0" - "@zowe/imperative" "5.22.0" - "@zowe/provisioning-for-zowe-sdk" "7.23.0" - "@zowe/zos-console-for-zowe-sdk" "7.23.0" - "@zowe/zos-files-for-zowe-sdk" "7.23.0" - "@zowe/zos-jobs-for-zowe-sdk" "7.23.0" - "@zowe/zos-logs-for-zowe-sdk" "7.23.0" - "@zowe/zos-tso-for-zowe-sdk" "7.23.0" - "@zowe/zos-uss-for-zowe-sdk" "7.23.0" - "@zowe/zos-workflows-for-zowe-sdk" "7.23.0" - "@zowe/zosmf-for-zowe-sdk" "7.23.0" +"@zowe/cli@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/cli/-/cli-7.23.3.tgz#4099c86e34437c6c9778a68155ef6556732b1e90" + integrity sha512-MRBlwAXAdimod5b3R4NaPF82thlptPDA8BRdmZDtWUAnE0sYkWepHxQcL5OjY8Gty6HrQj7t8q5ZWaawArcICg== + dependencies: + "@zowe/core-for-zowe-sdk" "7.23.3" + "@zowe/imperative" "5.22.3" + "@zowe/provisioning-for-zowe-sdk" "7.23.3" + "@zowe/zos-console-for-zowe-sdk" "7.23.3" + "@zowe/zos-files-for-zowe-sdk" "7.23.3" + "@zowe/zos-jobs-for-zowe-sdk" "7.23.3" + "@zowe/zos-logs-for-zowe-sdk" "7.23.3" + "@zowe/zos-tso-for-zowe-sdk" "7.23.3" + "@zowe/zos-uss-for-zowe-sdk" "7.23.3" + "@zowe/zos-workflows-for-zowe-sdk" "7.23.3" + "@zowe/zosmf-for-zowe-sdk" "7.23.3" find-process "1.4.7" get-stream "6.0.1" lodash "4.17.21" @@ -2666,18 +2666,18 @@ optionalDependencies: "@zowe/secrets-for-zowe-sdk" "7.18.6" -"@zowe/core-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/core-for-zowe-sdk/-/core-for-zowe-sdk-7.23.0.tgz#8ade9eeb1b8145468e0a7a8770a026b2206bd73c" - integrity sha512-y7bm4nhuIVtKhL9aa6M++Cj3UETwRwMiZzRbzeSqphn4P83umQ4NTHfltJL5xPouDIaqXBNhKET8UecBXJntrQ== +"@zowe/core-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/core-for-zowe-sdk/-/core-for-zowe-sdk-7.23.3.tgz#ec8e9b1f18b162bfd8f44fdecbe858d1072334c0" + integrity sha512-gcW30wwAzSNk3jk8fQA0jFWE5A96v75Bq1l3Cs6ifzRL4YipUUmUmvb3YmNILhxrnlGrJEqSaNAf87G16Cik/g== dependencies: comment-json "4.1.1" string-width "4.2.3" -"@zowe/imperative@5.22.0": - version "5.22.0" - resolved "https://registry.npmjs.org/@zowe/imperative/-/imperative-5.22.0.tgz#b79f9630fd6afc4c4ea907f403c4133784838285" - integrity sha512-XSTlHuaKtI2FsWYSQWNIx2rR739Zv8pkjvvxBDesyiCYXOpo4u/1RxkeAE/FKfw5UgVKR6yq7izLeeOpPjj3IA== +"@zowe/imperative@5.22.3": + version "5.22.3" + resolved "https://registry.npmjs.org/@zowe/imperative/-/imperative-5.22.3.tgz#464b2dd167c7f20902f442cb98945cbae2dc30a6" + integrity sha512-nfUHPMczMvmPjQLg2qwmVZcnL7ZaLiiGbeGAbI/jV+qOkqsHbbFt+QJ5TSX3O3bZCZClP8idn99lTbj9v7mLcA== dependencies: "@types/yargs" "13.0.4" chalk "2.4.2" @@ -2716,10 +2716,10 @@ yamljs "0.3.0" yargs "15.3.1" -"@zowe/provisioning-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/provisioning-for-zowe-sdk/-/provisioning-for-zowe-sdk-7.23.0.tgz#a359b44a2e60f33c243cb6d7272e47be7ca8c355" - integrity sha512-F+OSm0a5c4y2aX11XPVC6HSQM42T9puY9v6sTuvMHFIJBR7+gOoh5ijeyCy6eZMPmoXewsItc3oJEzbPHP5mKg== +"@zowe/provisioning-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/provisioning-for-zowe-sdk/-/provisioning-for-zowe-sdk-7.23.3.tgz#3c01fcf7223640f92cabd4ae4add79f239954179" + integrity sha512-UHW+ryUUSp17FQpazCFVShxlBPUJ8qPR2uonqp8cuB9AZyYA5RdGwTzgJvAznfVYXdvSgk4WS2TPOLaCNIVOvg== dependencies: js-yaml "4.1.0" @@ -2728,15 +2728,15 @@ resolved "https://registry.npmjs.org/@zowe/secrets-for-zowe-sdk/-/secrets-for-zowe-sdk-7.18.6.tgz#6b854b344babb291c26d19d82633099a46e08452" integrity sha512-YyS1NoXddb147mBQpu5/dTfo1gdwGa/xdg85U8KCngA+RHCmNct3n2rbK3tHx9C9H6rlgjeS+Mrux5Q+PHJUgQ== -"@zowe/zos-console-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/zos-console-for-zowe-sdk/-/zos-console-for-zowe-sdk-7.23.0.tgz#03a862339a70a09646af8791074da891b56cb343" - integrity sha512-nc3zpGRn5H0xX2ynIB1EB9OQiyIMu74qoXA6XTuYgaa/5gtb/xIxkeB9POC45aSAGJFjXDMT+3jeVKWhrtRVVw== +"@zowe/zos-console-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/zos-console-for-zowe-sdk/-/zos-console-for-zowe-sdk-7.23.3.tgz#388220e82ad07c5c5cf757f019ee4bb3caf9ddef" + integrity sha512-KZrxTbKtRdDdWSOrFGvHKeEsDGrPFt74EVwRtn29xAzdJeeDsGHcLz+oXRQOdGDMn2PKXG8g+jBOT+zONqnBPQ== -"@zowe/zos-files-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/zos-files-for-zowe-sdk/-/zos-files-for-zowe-sdk-7.23.0.tgz#dba5221b107831577c8e9c6ba1e39cd66bfeb782" - integrity sha512-2MWuS2JyZ6f2bZVS/SAOaAihuLZt1kWmp4zalJcSNLtwOp5cMWm4iKtKIokrdtb35IZOMADaiG31c/Sm71fZzQ== +"@zowe/zos-files-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/zos-files-for-zowe-sdk/-/zos-files-for-zowe-sdk-7.23.3.tgz#052e047edf6da9add9a76d78b9398891351866ec" + integrity sha512-dhuWez++WemAkAdrH0h5woH6vPMNYw6LcHzX5o+p4zLPpo3gjEzalYHkgH+MUP8eUX4M1yetLd6g82yk9hMuJQ== dependencies: get-stream "6.0.1" minimatch "5.0.1" @@ -2748,43 +2748,43 @@ dependencies: zos-node-accessor "1.0.14" -"@zowe/zos-jobs-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/zos-jobs-for-zowe-sdk/-/zos-jobs-for-zowe-sdk-7.23.0.tgz#0f4cc083771a8673f38b53a2d76ebf0e931a68ac" - integrity sha512-FoYxZeC8BpI0Pd5X3vJyo7ViXBhXLvrdogNmWuTvYfMVj78xDp/ZoSon9JDJhurOhtjWOdnwrfPZVyI074PHNw== +"@zowe/zos-jobs-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/zos-jobs-for-zowe-sdk/-/zos-jobs-for-zowe-sdk-7.23.3.tgz#7fd3c38787ee5ef4abfa61e520d63a24deb02c0f" + integrity sha512-Ipk0kCKbCiY6Le93aO8+H0koTvSyI2ICllbs9yWC198tdbetO3oH9GJ8GXp5LKPInQQwGk1zCbnYK/YH6ZzwJg== dependencies: - "@zowe/zos-files-for-zowe-sdk" "7.23.0" + "@zowe/zos-files-for-zowe-sdk" "7.23.3" -"@zowe/zos-logs-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/zos-logs-for-zowe-sdk/-/zos-logs-for-zowe-sdk-7.23.0.tgz#fa1e40ce1e681f4d2b56b23f2c8585dce918dbfd" - integrity sha512-7OnIIiwbiL7qEYXTfBVIW7EoXc+jKMygDQmIpUaTgOeu5cnmy5/SfvF4YtaW8eVJvsEJG0p1w77WMGGSyvQDEw== +"@zowe/zos-logs-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/zos-logs-for-zowe-sdk/-/zos-logs-for-zowe-sdk-7.23.3.tgz#22c02af97b1f3ddd2b03b4feb882d366f76e7881" + integrity sha512-e8COZ+3vmeDMLoO+/4umIwv5tmJ2Vd6EJ6Evivx9C2C9WlxVbyIu7YGjY6qf4o7yWxVJ53oVrsCXfsgDXFf7lA== -"@zowe/zos-tso-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/zos-tso-for-zowe-sdk/-/zos-tso-for-zowe-sdk-7.23.0.tgz#a3302f9e529071bbc91d5ea4353ea6e0154a7968" - integrity sha512-+cj39Vo42wIPSK8eiX7WcBrk2JyxKQZuZnFvXbtcX9j/i/05GAM7kfYX1JVKsd2v59dbmYkOotb0q+GSIDMKGA== +"@zowe/zos-tso-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/zos-tso-for-zowe-sdk/-/zos-tso-for-zowe-sdk-7.23.3.tgz#f142d420c3ba637d8b586cdd81033ee9b58fde78" + integrity sha512-k23Kh4rK78MO3RBY5Zv/uCWyQL3id8+Rp1Y+oiLDlOxgg5RSYIO44PyUYQiahxaw4Qlv9uGYSxz1WBkh3zHXzg== dependencies: - "@zowe/zosmf-for-zowe-sdk" "7.23.0" + "@zowe/zosmf-for-zowe-sdk" "7.23.3" -"@zowe/zos-uss-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/zos-uss-for-zowe-sdk/-/zos-uss-for-zowe-sdk-7.23.0.tgz#76daf52d8ffd22a4db17cf526226b247e7d74810" - integrity sha512-+gIzbLbvhWM+zIXbvUMqpgBoKrKbf5lbSA7GTdf3oTHc1VZzy0YJFX/bIewDYZunMV/D91KVAQ1Fie8i1Xlkfg== +"@zowe/zos-uss-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/zos-uss-for-zowe-sdk/-/zos-uss-for-zowe-sdk-7.23.3.tgz#5e3e746c30365063f33200be6d56fc857504e96b" + integrity sha512-fhMSqgpdOu8mlZgrIgIrR/JKaNWLhxDgLAyRRDk/KGwbQGdsnfSPvzXEB6BonN94oTeIsL5gJ/iw2Sc+Q7kZow== dependencies: ssh2 "1.15.0" -"@zowe/zos-workflows-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/zos-workflows-for-zowe-sdk/-/zos-workflows-for-zowe-sdk-7.23.0.tgz#6195ff3fcf1e8d50d806ca051a01500689b3b666" - integrity sha512-H9xbDhlY0m+BbNy7mOIS6kxPT1/UbHvavpi2y9ZtzxOV47sYxCOIfSGE7mvSTVSSjnV47B+mQT0h6qvX0Kqinw== +"@zowe/zos-workflows-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/zos-workflows-for-zowe-sdk/-/zos-workflows-for-zowe-sdk-7.23.3.tgz#08d1af8d51eb8d28e2192c9ea027628d6bc7b3b8" + integrity sha512-VoigwgLIPJJixEoA7asoUKIRnf2e1DhWeqtTKRfyktP5LO5Gk+UcuWqHifAE/0aDlauIpSx6oGaXNlKGr4Za1w== dependencies: - "@zowe/zos-files-for-zowe-sdk" "7.23.0" + "@zowe/zos-files-for-zowe-sdk" "7.23.3" -"@zowe/zosmf-for-zowe-sdk@7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@zowe/zosmf-for-zowe-sdk/-/zosmf-for-zowe-sdk-7.23.0.tgz#fd235649093c4f936365692506ca854953a8e18c" - integrity sha512-zwavHYHuFQOS3AxmZ5bhsWKyniUgQTRyMwpguce09XdehLyveb2VwuH1tVAbggUZlP+ae8vqWQAVU2fdg+eiPg== +"@zowe/zosmf-for-zowe-sdk@7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@zowe/zosmf-for-zowe-sdk/-/zosmf-for-zowe-sdk-7.23.3.tgz#e7e97fe224fa5b59291116ebf2857dfc9aa17d5e" + integrity sha512-EQzfq25iLEbJOuvD/dr/ox+x3k8oOzg2iTGMvrWJcT3JIeAFrpYRpTIoiRE5xDIsEZ7BohKKupEvEa3+Iilb9w== abab@^2.0.3, abab@^2.0.5: version "2.0.6" From b8e850bfd369b6a76ddaff87ad6efd987344f886 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Fri, 16 Feb 2024 11:12:02 -0500 Subject: [PATCH 21/21] refactor: add error to message, remove spread from mock Signed-off-by: Trae Yelovich --- packages/zowe-explorer/__mocks__/mockCreators/shared.ts | 1 - .../__tests__/__unit__/ZoweExplorerExtender.unit.test.ts | 4 ++-- .../i18n/sample/src/ZoweExplorerExtender.i18n.json | 2 +- packages/zowe-explorer/src/ZoweExplorerExtender.ts | 8 +++++++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts index f6ab63fd60..e9ff083cd1 100644 --- a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts +++ b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts @@ -313,7 +313,6 @@ export function createTextDocument(name: string, sessionNode?: ZoweDatasetNode | export function createInstanceOfProfile(profile: imperative.IProfileLoaded) { return { - ...Profiles.prototype, addToConfigArray: Profiles.prototype.addToConfigArray, allProfiles: [{ name: "sestest" }, { name: "profile1" }, { name: "profile2" }], defaultProfile: { name: "sestest" }, diff --git a/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts index 907619ad3a..d4e1196716 100644 --- a/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/ZoweExplorerExtender.unit.test.ts @@ -250,13 +250,13 @@ describe("ZoweExplorerExtender unit tests", () => { it("should throw an error if the schema is read-only", async () => { const errorMessageSpy = jest.spyOn(Gui, "errorMessage"); await updateSchema((_filepath, _contents) => { - const err = new Error(); + const err = new Error("test error"); Object.defineProperty(err, "code", { value: "EACCES", }); throw err; }); - expect(errorMessageSpy).toHaveBeenCalledWith("Failed to update Zowe schema: insufficient permissions or read-only file"); + expect(errorMessageSpy).toHaveBeenCalledWith("Failed to update Zowe schema: insufficient permissions or read-only file. test error"); }); }); }); diff --git a/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json b/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json index c5db5ea283..1e4ecdc4b1 100644 --- a/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json +++ b/packages/zowe-explorer/i18n/sample/src/ZoweExplorerExtender.i18n.json @@ -1,4 +1,4 @@ { "initialize.profiles.error": "Error encountered when loading your Zowe config. Click \"Show Config\" for more details.", - "schema.cannotAccess": "Failed to update Zowe schema: insufficient permissions or read-only file" + "schema.cannotAccess": "Failed to update Zowe schema: insufficient permissions or read-only file. {0}" } diff --git a/packages/zowe-explorer/src/ZoweExplorerExtender.ts b/packages/zowe-explorer/src/ZoweExplorerExtender.ts index ba7310755c..4dc0dfade3 100644 --- a/packages/zowe-explorer/src/ZoweExplorerExtender.ts +++ b/packages/zowe-explorer/src/ZoweExplorerExtender.ts @@ -230,7 +230,13 @@ export class ZoweExplorerExtender implements ZoweExplorerApi.IApiExplorerExtende } catch (err) { // Only show an error if we failed to update the on-disk schema. if (err.code === "EACCES" || err.code === "EPERM") { - Gui.errorMessage(localize("schema.cannotAccess", "Failed to update Zowe schema: insufficient permissions or read-only file")); + Gui.errorMessage( + localize( + "schema.cannotAccess", + "Failed to update Zowe schema: insufficient permissions or read-only file. {0}", + err.message ?? "" + ) + ); } } }