@sap/cli-core
Version:
Command-Line Interface (CLI) Core Module
195 lines (191 loc) • 7.8 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.toConstantCase = exports.sha256 = exports.getInfoFromTenant = exports.parseTenant = exports.removeScopeFromPackageName = exports.getBin = exports.getEngines = exports.getDescription = exports.getPackageName = exports.getName = exports.getVersion = exports.readPackageJson = exports.requireFile = exports.parseVersion = void 0;
exports.buildOptionName = buildOptionName;
exports.isValidURL = isValidURL;
exports.removeQueryParametersFromUrl = removeQueryParametersFromUrl;
const crypto = __importStar(require("crypto"));
const path_1 = __importDefault(require("path"));
const lodash_1 = require("lodash");
const logger_1 = require("../logger");
const commands_1 = require("./commands");
let pgk;
const getLogger = () => (0, logger_1.get)("utils.utils");
const REGEX_HTTPS = /http(s)*:\/\//;
function buildOptionName(command, option) {
const shortFlag = (0, commands_1.getShortFlagForLongName)(command, option);
return `-${shortFlag}, --${option.longName}`;
}
const parseVersion = (version) => {
const segments = version.split(".");
return { major: parseInt(segments[0], 10), minor: parseInt(segments[1], 10) };
};
exports.parseVersion = parseVersion;
// eslint-disable-next-line import/no-dynamic-require, global-require
const requireFile = (p) => require(p);
exports.requireFile = requireFile;
const readPackageJson = (cwd = "", force = false) => {
if (!pgk || force) {
const { trace } = getLogger();
try {
const p = path_1.default.join(cwd, "./package.json");
trace(`reading ${p}`);
pgk = (0, exports.requireFile)(p);
}
catch (err) {
trace("failed to read package.json first time", err.stack);
try {
const p = path_1.default.join(cwd, "../package.json");
trace(`reading ${p}`);
pgk = (0, exports.requireFile)(p);
}
catch (err2) {
trace("failed to read package.json second time", err.stack);
const p = path_1.default.join(cwd, "../../package.json");
trace(`reading ${p}`);
pgk = (0, exports.requireFile)(p);
}
}
}
return pgk;
};
exports.readPackageJson = readPackageJson;
const getVersion = (cwd = "") => {
return (0, exports.readPackageJson)(cwd, true).version;
};
exports.getVersion = getVersion;
const getName = (cwd = "") => {
const segments = (0, exports.readPackageJson)(cwd, true).name.split(/^@.*\//);
return segments[segments.length - 1];
};
exports.getName = getName;
const getPackageName = (cwd = "") => {
return (0, exports.readPackageJson)(cwd, true).name;
};
exports.getPackageName = getPackageName;
const getDescription = (cwd = "") => {
return (0, exports.readPackageJson)(cwd, true).description;
};
exports.getDescription = getDescription;
const getEngines = (cwd = "") => {
return (0, exports.readPackageJson)(cwd, true).engines;
};
exports.getEngines = getEngines;
const getBin = (cwd = "") => {
const keys = Object.keys((0, exports.readPackageJson)(cwd, true).bin || {});
if (keys.length === 0) {
throw new Error("no bin property defined in package.json or bin property is empty");
}
return keys[0];
};
exports.getBin = getBin;
const removeScopeFromPackageName = (packageName) => packageName.split("/").pop();
exports.removeScopeFromPackageName = removeScopeFromPackageName;
const removeProtocol = (tenant) => tenant.replace(REGEX_HTTPS, "");
const parseTenant = (tenant) => {
const t = REGEX_HTTPS.test(tenant) ? tenant : `https://${tenant}`;
/*
One can enter the tenant in different ways, for example
<protocol>://<fqdn>.<landscape>.cloud.sap/
<fqdn>.<landscape>.cloud.sap/
<fqdn>.<landscape>.cloud.sap
<protocol>://<fqdn>.<landscape>.cloud.sap/dwaas-ui/index.html#/
However, we want the tenant in this format, eventually:
<protocol>://<fqdn>.<landscape>.cloud.sap
*/
return new URL(t).host;
};
exports.parseTenant = parseTenant;
function isValidURL(url) {
const { debug, error } = getLogger();
try {
// eslint-disable-next-line no-new
new URL(url);
debug(`url ${url} is valid`);
return true;
}
catch (err) {
error(`url ${url} is no valid url`, err);
return false;
}
}
const getInfoFromTenant = (tenant, verbose, printOutput = true) => {
let protocol;
try {
protocol = new URL(tenant).protocol;
}
catch {
protocol = "https:";
}
const publicfqdn = removeProtocol(tenant);
const segments = publicfqdn.split(".");
const hostname = segments[0];
const region = segments[1];
if (!region) {
const { output, error } = getLogger();
if (printOutput) {
output("error: invalid value '%s' for option '-H, --host <host>'", tenant);
}
if (verbose) {
output("value '%s' does not match pattern https://<prefix>.<landscape>.hcs.sap.cloud", tenant);
}
error("invalid region", region);
throw new Error("invalid region");
}
const parsedTenant = (0, exports.parseTenant)(tenant);
return {
host: `${protocol}//dwaas-core.sac${region}.cfapps.orca.net.sap`,
publicfqdn: parsedTenant,
passcodeUrl: `https://${hostname}.authentication.${region}.hana.ondemand.com/passcode`,
authorizationUrl: `${protocol}//${hostname}.authentication.${region}.hana.ondemand.com/oauth/authorize`,
tokenUrl: `${protocol}//${hostname}.authentication.${region}.hana.ondemand.com/oauth/token`,
tenantUrl: `${protocol}//${parsedTenant}`,
};
};
exports.getInfoFromTenant = getInfoFromTenant;
function removeQueryParametersFromUrl(sUrl) {
const url = new URL(sUrl);
return `${url.protocol}//${url.host}${url.pathname}`;
}
const sha256 = (string) =>
// NOSONAR actually sha256 (or SHA-256) is considered secure according to SonarQube
crypto.createHash("sha256").update(string).digest("base64");
exports.sha256 = sha256;
const toConstantCase = (string) => (0, lodash_1.upperCase)(string).replace(/ /g, "_");
exports.toConstantCase = toConstantCase;