UNPKG

zcatalyst-cli

Version:

Command Line Tool for CATALYST

198 lines (197 loc) 10.5 kB
'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 logger_1 = require("../../util_modules/logger"); 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, logger_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 + ')', { 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, logger_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 + ')', { 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(`/baas/${(0, project_1.getEnvId)()}/index#/?port=${callbackPort}&type=cli`, `${constants_1.ORIGIN.admin}`); 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, logger_1.debug)(err)); res(); })); } catch (e) { yield destroyer.destroy().catch((err) => (0, logger_1.debug)(err)); res(e); } })); const destroyer = new server_1.ConnectionDestroyer(server); server.listen(callbackPort, '127.0.0.1', () => { const urlString = accessUrl.toString(); (0, logger_1.info)(); (0, logger_1.info)('Visit this URL on this device to proceed:'); (0, logger_1.info)(ansi_colors_1.bold.underline(urlString)); (0, logger_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([source], false); const fnUtil = stack.startsWith(runtime_1.default.language.node.value) ? fn_utils_1.fnUtils.node : stack.startsWith(runtime_1.default.language.java.value) ? fn_utils_1.fnUtils.java : stack.startsWith(runtime_1.default.language.python.value) ? fn_utils_1.fnUtils.python : null; if (fnUtil === null) { (0, logger_1.warning)(`skipping setup of function(${refinedTargets[0].name}) since provided stack ${stack} is not supported.`); return; } yield fnUtil.validate(refinedTargets, 0); if (!refinedTargets[0].valid) { (0, logger_1.debug)('Invalid target : ' + refinedTargets[0].name + ' reason : ' + refinedTargets[0].failure_reason); (0, logger_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); });