zcatalyst-cli
Version:
Command Line Tool for CATALYST
195 lines (194 loc) • 10.4 kB
JavaScript
'use strict';
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());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ansi_colors_1 = require("ansi-colors");
const import_1 = require("../../commands/iac/import");
const endpoints_1 = require("../../endpoints");
const error_1 = __importDefault(require("../../error"));
const prompt_1 = __importDefault(require("../../prompt"));
const runtime_store_1 = __importDefault(require("../../runtime-store"));
const constants_1 = require("../../util_modules/constants");
const js_1 = require("../../util_modules/js");
const index_1 = require("../../util_modules/logger/index");
const option_1 = require("../../util_modules/option");
const yaml_1 = require("yaml");
const project_1 = require("../../util_modules/project");
const path_1 = require("path");
const functions_1 = require("../util/functions");
const project_2 = require("../util/project");
const client_1 = require("../util/client");
const runtime_1 = __importDefault(require("../../util_modules/constants/lib/runtime"));
const fn_utils_1 = require("../../fn-utils");
const client_utils_1 = require("../../client-utils");
const port_resolver_1 = __importDefault(require("../../port-resolver"));
const http_1 = require("http");
const fs_1 = require("../../util_modules/fs");
const server_1 = require("../../util_modules/server");
const open_1 = __importDefault(require("open"));
exports.default = () => __awaiter(void 0, void 0, void 0, function* () {
var _a, _b;
const orgAPI = yield (0, endpoints_1.orgAPI)();
const defaultRCProjectName = (0, project_1.getDefaultProjectName)(null);
const defaultRCProjectId = (0, project_1.getDefaultProjectId)(null);
if (defaultRCProjectName !== null &&
defaultRCProjectId !== null &&
!(0, option_1.getOptionValue)('force', false)) {
(0, index_1.message)(constants_1.FILENAME.rc +
' already has ' +
(0, ansi_colors_1.bold)(defaultRCProjectName) +
' as a default project. To overwrite use --force option');
throw new error_1.default('Skipping project setup, since project directory contains a default project. To overwrite use --force option', { skipHelp: true, exit: 0 });
}
const orgList = yield orgAPI.getAllOrgs();
if (orgList.length === 0) {
throw new error_1.default('Visit ' +
(0, ansi_colors_1.underline)(constants_1.ORIGIN.console) +
' for creation of your first project before you continue.', { exit: 1 });
}
const orgChoice = orgList.map((org) => prompt_1.default.choice(org.name + ' (' + org.id + ')', {
id: org.id,
value: org,
short: org.name
}));
const orgAns = yield prompt_1.default.ask(prompt_1.default.question('org', 'Select a default Catalyst portal for this directory: ', {
type: 'list',
choices: js_1.JS.reverse(orgChoice),
when: orgChoice.length > 1
}));
const selectedOrg = orgAns.org || orgList[0];
runtime_store_1.default.set('project.env.id', selectedOrg.id);
(0, index_1.message)('Setting up a new default project for this folder\n');
const projectAPI = yield (0, endpoints_1.projectAPI)({ auth: true, org: selectedOrg.id });
const allProjects = (yield projectAPI.getAllProjects());
if (allProjects.length === 0) {
throw new error_1.default('Visit ' +
(0, ansi_colors_1.underline)(constants_1.ORIGIN.console) +
' for creation of your first project before you continue.', { exit: 1 });
}
const projectChoices = [
prompt_1.default.choice('[create a new project]', {
value: 0,
short: 'New-Project'
}),
prompt_1.default.choice('[import a existing project]', {
value: 1,
short: 'Import-project'
})
];
allProjects.forEach((project) => {
projectChoices.push(prompt_1.default.choice(project.project_name + ' (' + project.id + ')', {
id: project.project_name,
value: project,
short: project.project_name
}));
});
const projectAns = yield prompt_1.default.ask(prompt_1.default.question('project', 'Select a default Catalyst project for this directory: ', {
type: 'list',
choices: js_1.JS.reverse(projectChoices)
}));
let selectedProject = projectAns.project;
if (typeof selectedProject !== 'number') {
return (0, project_2.fillProjectPayload)(selectedOrg, selectedProject);
}
if (selectedProject === 0) {
let projectId = null;
const userActionError = yield new Promise((res, rej) => __awaiter(void 0, void 0, void 0, function* () {
const callbackPort = yield port_resolver_1.default.getFreePort(3000, 10, false);
const accessUrl = new URL(`${constants_1.ORIGIN.console}/baas/${(0, project_1.getEnvId)()}/index#/?port=${callbackPort}&type=cli`);
const server = (0, http_1.createServer)((req, resp) => __awaiter(void 0, void 0, void 0, function* () {
var _c, _d;
try {
if (!((_c = req.url) === null || _c === void 0 ? void 0 : _c.includes('/success'))) {
resp.writeHead(404);
resp.end();
return;
}
const htmlFile = yield fs_1.ASYNC.readFile((0, path_1.join)(__dirname, '../../../templates/projectSuccess.html'));
projectId = (_d = req.url) === null || _d === void 0 ? void 0 : _d.split('?')[1].split('=')[1];
resp.setHeader('Content-Type', 'text/html');
resp.writeHead(200);
resp.end(htmlFile, () => __awaiter(void 0, void 0, void 0, function* () {
req.socket.destroy();
yield destroyer.destroy().catch((err) => (0, index_1.debug)(err));
res();
}));
}
catch (e) {
yield destroyer.destroy().catch((err) => (0, index_1.debug)(err));
res(e);
}
}));
const destroyer = new server_1.ConnectionDestroyer(server);
server.listen(callbackPort, '127.0.0.1', () => {
const urlString = accessUrl.toString();
(0, index_1.info)();
(0, index_1.info)('Visit this URL on this device to proceed:');
(0, index_1.info)(ansi_colors_1.bold.underline(urlString));
(0, index_1.info)();
(0, open_1.default)(urlString).catch();
});
server.on('error', (err) => {
rej(err);
});
}));
if (userActionError) {
throw new error_1.default('Error while verifying user action', {
original: userActionError,
exit: 2
});
}
if (projectId === null) {
throw new error_1.default('Project ID not found', { exit: 2 });
}
selectedProject = yield projectAPI.getProject(projectId);
return (0, project_2.fillProjectPayload)(selectedOrg, selectedProject, true);
}
const [zipArchive, template, importRes] = yield (0, import_1.iacImport)();
yield zipArchive
.extract(runtime_store_1.default.get('cwd'), '/', { recursive: true, ignoreLevel: 0 })
.finalize();
const parsedJSON = js_1.JS.parseJSON(template);
const templateJson = parsedJSON ? parsedJSON : (0, yaml_1.parse)(template);
const functions = ((_a = templateJson.components) === null || _a === void 0 ? void 0 : _a.Functions) || [];
const client = ((_b = templateJson.components) === null || _b === void 0 ? void 0 : _b.WebClient) || [];
yield Promise.all(functions.map(({ properties }) => __awaiter(void 0, void 0, void 0, function* () {
const source = properties.code.path.replace('/', path_1.sep).replace('.zip', '');
const stack = properties.stack.toLowerCase();
const refinedTargets = yield fn_utils_1.fnUtils.common.refineTargets([(0, project_1.resolveProjectPath)(source)], false);
stack.startsWith(runtime_1.default.language.node.value)
? fn_utils_1.fnUtils.node.validate(refinedTargets)
: stack.startsWith(runtime_1.default.language.java.value)
? fn_utils_1.fnUtils.java.validate(refinedTargets)
: stack.startsWith(runtime_1.default.language.python.value)
? fn_utils_1.fnUtils.python.validate(refinedTargets)
: null;
if (!refinedTargets[0].valid) {
(0, index_1.debug)('Invalid target : ' +
refinedTargets[0].name +
' reason : ' +
refinedTargets[0].failure_reason);
(0, index_1.warning)(`skipping setup of function(${refinedTargets[0].name}) since the package is invalid. \nContact catalyst support with debug log.`);
return;
}
(0, functions_1.fillFunctionsInitPayload)(source, properties.name, properties.stack, properties.type);
})));
if (client.length > 0) {
const { properties } = client[0];
const source = properties.code.path.replace('/', path_1.sep).replace('.zip', '');
yield client_utils_1.clientUtils.validate({ source });
(0, client_1.fillClientInitPayload)(source, properties.app_name);
}
const projectDetails = yield projectAPI.getProject(importRes.project_details.id);
return (0, project_2.fillProjectPayload)(selectedOrg, projectDetails, true, true);
});