@sap/cf-tools
Version:
Cloud Foundry API tools
87 lines • 3.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Cli = void 0;
const child_process_1 = require("child_process");
const comment_json_1 = require("comment-json");
const _ = require("lodash");
const types_1 = require("./types");
class Cli {
static execute(args, options, token) {
token = token || {
isCancellationRequested: false,
onCancellationRequested: () => {
return;
},
};
Cli.updateSpawnOptions(options);
return new Promise((resolve) => {
let stderr = "";
let stdout = "";
if (token.isCancellationRequested) {
Cli.cliResultOnExit(stdout, resolve, stderr, types_1.CF_CMD_EXIT_CODE.CANCEL_REQ);
return;
}
const childProcess = (0, child_process_1.spawn)(Cli.CF_CMD, args, options);
childProcess.stdin.end();
childProcess.stdout.on("data", (data) => {
stdout = stdout.concat(data);
});
childProcess.stderr.on("data", (data) => {
stderr = stderr.concat(data);
});
childProcess.on("exit", (code) => {
Cli.cliResultOnExit(stdout, resolve, stderr, code);
});
childProcess.on("error", (err) => {
const message = (_.get(err, "code") === "ENOENT" ? `${Cli.CF_CMD}: command not found` : _.get(err, "message"));
resolve({ stdout: stdout, stderr: stderr, error: message, exitCode: types_1.CF_CMD_EXIT_CODE.ERROR });
});
token.onCancellationRequested(() => {
childProcess.kill();
Cli.cliResultOnExit("", resolve, "", types_1.CF_CMD_EXIT_CODE.CANCELED);
});
});
}
static cliResultOnExit(stdout, resolve, stderr, code) {
if (stdout) {
if (stdout.indexOf("error_code") > 0) {
try {
const cfErr = (0, comment_json_1.parse)(stdout);
const message = (_.get(cfErr, "code") === 10002 ? Cli.CF_LOGIN_ERROR : _.get(cfErr, "description", "Internal error occured"));
resolve({ stdout: stdout, stderr: stderr, exitCode: types_1.CF_CMD_EXIT_CODE.ERROR, error: message });
return;
}
catch (e) {
}
}
else if (stdout.startsWith("FAILED") && stdout.indexOf("Error creating request") > 0) {
resolve({ stdout: stdout, stderr: stderr, error: Cli.CF_LOGIN_ERROR, exitCode: types_1.CF_CMD_EXIT_CODE.ERROR });
return;
}
else if (/failed.*\bError\b:/g.test(stdout)) {
try {
(0, comment_json_1.parse)(stdout);
}
catch (e) {
resolve({ stdout: stdout, stderr: stderr, error: stdout, exitCode: types_1.CF_CMD_EXIT_CODE.ERROR });
return;
}
}
else if (stdout.startsWith("FAILED") && stdout.indexOf("No API endpoint set") > 0) {
resolve({ stdout: stdout, stderr: stderr, error: stdout, exitCode: types_1.CF_CMD_EXIT_CODE.ERROR });
return;
}
}
resolve({ stdout: stdout, stderr: stderr, exitCode: code });
}
static updateSpawnOptions(options) {
if (options) {
options.env = Object.assign(Object.assign(Object.assign({}, process.env), { NODE_VERSION: process.versions.node }), options.env);
_.defaults(options, { cwd: _.get(options, "cmd", __dirname) });
}
}
}
exports.Cli = Cli;
Cli.CF_LOGIN_ERROR = "Not logged in. Use 'cf login' to log in.";
Cli.CF_CMD = "cf";
//# sourceMappingURL=cli.js.map