UNPKG

@sap/cli-core

Version:

Command-Line Interface (CLI) Core Module

195 lines (191 loc) 7.8 kB
"use strict"; 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;