@broadcom/endevor-for-zowe-cli
Version:
Endevor Plug-in for Zowe CLI
289 lines • 25.6 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EndevorRestUtils = void 0;
const imperative_1 = require("@zowe/imperative");
const index_1 = require("../index");
const fs = require("fs");
const path = require("path");
class EndevorRestUtils {
static setInstance(args) {
let requestInstance = args.instance;
if (requestInstance == null) {
requestInstance = "";
}
return requestInstance;
}
static setupEndevorSession(args_1) {
return __awaiter(this, arguments, void 0, function* (args, doPrompting = true) {
var _a, _b;
let basePath = (_a = args.basePath) !== null && _a !== void 0 ? _a : index_1.ApiConstants.BASE_PATH;
if (basePath.startsWith("/"))
basePath = basePath.substring(1, basePath.length);
if (basePath.endsWith("/"))
basePath = basePath.substring(0, basePath.length - 1);
let sessCfg = {
hostname: args.host,
port: args.port,
rejectUnauthorized: args.rejectUnauthorized,
basePath,
protocol: (_b = args.protocol) !== null && _b !== void 0 ? _b : "https"
};
if (args.user && args.password) {
sessCfg.user = args.user;
sessCfg.password = args.password;
sessCfg.type = imperative_1.SessConstants.AUTH_TYPE_BASIC;
}
else if (args.tokenType && args.tokenValue) {
sessCfg.type = imperative_1.SessConstants.AUTH_TYPE_TOKEN;
sessCfg.tokenType = args.tokenType;
sessCfg.tokenValue = args.tokenValue;
}
sessCfg = yield imperative_1.ConnectionPropsForSessCfg.addPropsOrPrompt(sessCfg, args, {
doPrompting
});
const errorStack = [];
if (sessCfg.hostname == null) {
errorStack.push("host");
}
if (sessCfg.port == null) {
errorStack.push("port");
}
if (sessCfg.user == null && sessCfg.password == null && sessCfg.tokenType == null && sessCfg.tokenValue == null) {
errorStack.push("credentials");
}
if (errorStack.length > 0) {
throw new imperative_1.ImperativeError({
msg: "Missing specification for " + errorStack.join(", ")
});
}
return new imperative_1.Session(sessCfg);
});
}
static setupEndevorSessionWithoutCredential(args) {
var _a, _b;
const sessionHostname = args.host;
const sessionPort = args.port;
const sessionProtocol = args.protocol;
const sessionRejectUnauthorized = (_a = args["reject-unauthorized"]) !== null && _a !== void 0 ? _a : false;
let sessionBasePath = (_b = args["base-path"]) !== null && _b !== void 0 ? _b : index_1.ApiConstants.BASE_PATH;
const errorStack = [];
if (sessionHostname == null) {
errorStack.push("host");
}
if (sessionPort == null) {
errorStack.push("port");
}
if (errorStack.length > 0) {
throw new imperative_1.ImperativeError({
msg: "Missing specification for " + errorStack.join(", ")
});
}
if (sessionBasePath.startsWith("/"))
sessionBasePath = sessionBasePath.substring(1, sessionBasePath.length);
if (sessionBasePath.endsWith("/"))
sessionBasePath = sessionBasePath.substring(0, sessionBasePath.length - 1);
return new imperative_1.Session({
hostname: sessionHostname,
port: Number(sessionPort),
protocol: sessionProtocol,
rejectUnauthorized: sessionRejectUnauthorized,
basePath: sessionBasePath
});
}
static writeConsoleOutput(session, instance, reportURIs, isWriteReport, logStack, reportFileName, reportDir, suppressInfo, appendToFile) {
return __awaiter(this, void 0, void 0, function* () {
let reports = "";
const reportResult = {};
const reportIds = Object.keys(reportURIs);
if (reportIds.length > 0) {
yield Promise.all(reportIds.map((reportId) => __awaiter(this, void 0, void 0, function* () {
const reportURI = reportURIs[reportId];
if (reportURI != null)
reportResult[reportId] = yield index_1.EndevorRestClient.getReport(session, instance, reportURI);
})));
for (const repId of reportIds) {
const title = (reports.length > 0 ? "\n" : "") + `//\n// ${repId} - url: ${reportURIs[repId]}\n//\n\n`;
reports = reports.concat(title, reportResult[repId]);
}
if (isWriteReport) {
const now = new Date();
if (reportFileName == null || reportFileName == undefined) {
if (reportDir == null || reportDir == undefined) {
reportDir = ".";
}
if (!fs.existsSync(reportDir)) {
fs.mkdirSync(reportDir);
}
if (!reportDir.endsWith("/") && !reportDir.endsWith("\\")) {
reportDir = reportDir + "/";
}
reportFileName =
reportDir +
index_1.ApiConstants.REPORT_FILE_NAME_PREFIX +
index_1.EndevorUtils.formatDate(now, false) +
"-" +
index_1.EndevorUtils.formatTime(now, true, "") +
".txt";
}
else {
if (path.isAbsolute(reportFileName)) {
if (!(reportDir == null || reportDir == undefined)) {
logStack.push(`[WARN] Report file defined using absolute path (${reportFileName}), report directory parameter ignored.`);
}
}
else {
if (!(reportDir == null || reportDir == undefined)) {
if (!fs.existsSync(reportDir)) {
fs.mkdirSync(reportDir);
}
if (!reportDir.endsWith("/") && !reportDir.endsWith("\\")) {
reportDir = reportDir + "/";
}
reportFileName = reportDir + reportFileName;
}
}
}
if (appendToFile == null || !appendToFile) {
index_1.EndevorUtils.generalWriteFile(reportFileName, reports);
}
else {
index_1.EndevorUtils.generalAppendFile(reportFileName, reports);
}
if (suppressInfo == null || !suppressInfo) {
logStack.push(`[INFO] Endevor reports written in ${reportFileName}`);
}
}
}
return reports;
});
}
static isThisV1(session) {
var _a;
return ((_a = session.ISession.basePath) === null || _a === void 0 ? void 0 : _a.match(/\/rest\/?[^/]*\/?$|\/api\/v1\/?[^/]*\/?$/)) != null;
}
static failIfUsingV1(session) {
if (EndevorRestUtils.isThisV1(session)) {
throw new imperative_1.ImperativeError({
msg: "Endevor REST API v1 Not Supported",
errorCode: "1",
additionalDetails: "base-path '" +
session.ISession.basePath +
"' points to version 1 of the Endevor REST API, please update the base-path to use /api/v2 ."
});
}
}
static isThisApiMl(session) {
var _a;
return !((_a = session.ISession.basePath) === null || _a === void 0 ? void 0 : _a.includes("EndevorService"));
}
static getHeaderLinks(resHeader) {
const links = resHeader === null || resHeader === void 0 ? void 0 : resHeader.link;
const retLinks = {};
if (links != null) {
links.split(", ").forEach((link) => {
const m = link.match(/<?([^>]*)>(.*)rel="(.*)".*/);
if (m != null) {
const url = m[1];
const rel = m[3];
retLinks[rel] = url;
}
});
}
return retLinks;
}
static queryParameterString(resource, payload) {
if (payload == null) {
return resource;
}
const query = [];
for (const key of Object.keys(payload)) {
if (payload[key]) {
if (key === "status") {
const statusStr = payload[key];
if (statusStr.search(",")) {
const statusArray = statusStr.split(",");
statusArray.forEach((status) => {
query.push(`status=${status.trim()}`);
});
}
else {
query.push(`status=${payload[key]}`);
}
}
else {
query.push(`${key}=${encodeURIComponent(payload[key])}`);
}
}
}
resource += query.length > 0 ? "?" + query.join("&") : "";
return resource;
}
static isEndevorRestResponseBody(str) {
try {
const data = JSON.parse(str);
if ("returnCode" in data && "reasonCode" in data && "reports" in data && "data" in data) {
return true;
}
else {
return false;
}
}
catch (e) {
return false;
}
}
static isHTTPProtocolError(errorString, session) {
if (errorString === "Bad Request\r\nThis combination of host and port requires TLS.\r\n" &&
session.ISession.protocol === "http") {
return true;
}
else
return false;
}
static reportIdToURL(id) {
return `/reports/${id}`;
}
static reportIdToURLV1(session, id) {
return `${session.ISession.protocol}://${session.ISession.hostname}:${session.ISession.port}/endevor/reports/${id}`;
}
static addFileToFormData(formData, parmName, path, charset) {
const readStream = fs.createReadStream(path);
this.addFileStreamToFormData(formData, parmName, readStream, charset);
}
static addFileStreamToFormData(formData, parmName, inputSteam, charset) {
formData.append(parmName, inputSteam, { contentType: `application/octet-stream; charset="${charset}"` });
}
static isSemVer(input) {
const result = !input.split(".").some((part) => {
return isNaN(parseInt(part));
});
return result;
}
static isSemVerGreater(input1, input2) {
var _a, _b;
const parts1 = input1.split(".");
const parts2 = input2.split(".");
let i = 0;
while (i < parts1.length && i < parts2.length) {
const part1 = parseInt((_a = parts1[i]) !== null && _a !== void 0 ? _a : "0");
const part2 = parseInt((_b = parts2[i]) !== null && _b !== void 0 ? _b : "0");
if (part1 > part2)
return true;
if (part1 < part2)
return false;
i++;
}
return false;
}
}
exports.EndevorRestUtils = EndevorRestUtils;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5kZXZvclJlc3RVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvdXRpbHMvRW5kZXZvclJlc3RVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUF1QkEsaURBTzBCO0FBQzFCLG9DQVFrQjtBQUNsQix5QkFBMEI7QUFDMUIsNkJBQThCO0FBVTlCLE1BQWEsZ0JBQWdCO0lBVXBCLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBd0I7UUFDaEQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUVwQyxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBWU0sTUFBTSxDQUFPLG1CQUFtQjs2REFBQyxJQUF1QixFQUFFLFdBQVcsR0FBRyxJQUFJOztZQUNqRixJQUFJLFFBQVEsR0FBRyxNQUFBLElBQUksQ0FBQyxRQUFRLG1DQUFJLG9CQUFZLENBQUMsU0FBUyxDQUFDO1lBR3ZELElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUFFLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBU2xGLElBQUksT0FBTyxHQUFhO2dCQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUMzQyxRQUFRO2dCQUNSLFFBQVEsRUFB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