UNPKG

zcatalyst-cli

Version:

Command Line Tool for CATALYST

164 lines (163 loc) 8.28 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 path_1 = require("path"); const util_1 = require("util"); const repl_server_1 = __importDefault(require("../repl-server")); const ansi_colors_1 = require("ansi-colors"); const index_1 = __importDefault(require("../error/index")); const fn_utils_1 = require("../fn-utils"); const runtime_store_1 = __importDefault(require("../runtime-store")); const constants_1 = require("../util_modules/constants"); const fs_1 = require("../util_modules/fs"); const index_2 = require("../util_modules/logger/index"); const option_1 = require("../util_modules/option"); const http_functions_1 = __importDefault(require("./dependencies/http-functions")); const non_http_function_1 = __importDefault(require("./dependencies/non-http-function")); const prepare_1 = __importDefault(require("./prepare")); const fn_watcher_1 = __importDefault(require("../fn-watcher")); const tunnel_server_1 = __importDefault(require("./dependencies/tunnel-server")); const endpoints_1 = require("../endpoints"); exports.default = () => __awaiter(void 0, void 0, void 0, function* () { var _a; const replServer = new repl_server_1.default({ prompt: 'functions > ', writer: (output) => { if (output !== undefined) { if (output instanceof Promise) { replServer.pause(); output.finally(() => replServer.resume()); return '[cli] Function has been invoked'; } if (output instanceof Error) { return ansi_colors_1.bold.red('Error: ') + output.message; } return (0, util_1.inspect)(output); } return ''; } }); const httpServer = new http_functions_1.default({ repl: replServer }); const tunnelServer = new tunnel_server_1.default(replServer); const projectRoot = runtime_store_1.default.get('project.root'); yield (0, prepare_1.default)([constants_1.FN_TYPE.basic, constants_1.FN_TYPE.cron, constants_1.FN_TYPE.event, constants_1.FN_TYPE.integration, constants_1.FN_TYPE.job], true); const targets = runtime_store_1.default .get('context.functions.targets', []) .filter((target) => { if (!target.valid) { (0, index_2.warning)('target [' + target.name + '] is not a valid one reason : ' + target.failure_reason); target.failure_reason instanceof Error && (0, index_2.debug)(`Invalid function target :: ${target.name} :: ${(0, util_1.inspect)(target.failure_reason)}`); if (target.additionalInfo && 'compilerOut' in target.additionalInfo) { Array.isArray(target.additionalInfo.compilerOut.error) && target.additionalInfo.compilerOut.error.forEach((er) => (0, index_2.error)(er)); Array.isArray(target.additionalInfo.compilerOut.warning) && target.additionalInfo.compilerOut.warning.forEach((warn) => (0, index_2.warning)(warn)); } } return target.valid; }); if (targets.length === 0) { throw new index_1.default('No functions are ready for serving', { exit: 0, errorId: 'SHELL-IDX-1' }); } try { replServer.start(); yield tunnelServer.startServer(); const tunnelUrl = runtime_store_1.default.get('context.fn_shell.enable_tunnel', undefined); const _tunnelAPI = yield (0, endpoints_1.tunnelAPI)(); if (tunnelUrl) { try { yield _tunnelAPI.enableTunnel(typeof tunnelUrl === 'string' ? tunnelUrl : undefined); } catch (er) { const _er = index_1.default.getErrorInstance(er); !replServer.closed && replServer.close(); yield tunnelServer.stopServer(); if (_er.status === 400) { const data = (_a = _er.context) === null || _a === void 0 ? void 0 : _a.body.data; throw new index_1.default('Unable to enable tunnel: ' + _er.message, { exit: 1, original: _er, errorId: 'SHELL-IDX-2', arg: [ansi_colors_1.italic.red(data.message + ''), ansi_colors_1.italic.red(data.error_code + '')] }); } throw new index_1.default('Unable to enable tunnel: ' + _er.message, { exit: 2, original: _er }); } replServer.write(ansi_colors_1.green.bold('Tunneling enabled')); } const watchOpt = (0, option_1.getOptionValue)('watch'); if (watchOpt === true) { (0, index_2.info)(); (0, index_2.labeled)('DEPRECATED', `The ${ansi_colors_1.italic.bold('--watch')} option is deprecated. \nThe watch mode will be enabled by default. If you wish to disable it use the ${ansi_colors_1.italic.bold('--no-watch')} option. \nPlease execute ${(0, ansi_colors_1.bold)('catalyst functions:shell ' + (0, ansi_colors_1.italic)('--help'))} command for more usage details.`).WARN(); } yield Promise.all(targets.map((target) => __awaiter(void 0, void 0, void 0, function* () { if (watchOpt !== false) { yield (0, fn_watcher_1.default)(target); } const localFn = new non_http_function_1.default(replServer, target); replServer.setContext(target.name, localFn.call()); tunnelServer.addContext(target.id || target.name, localFn); target.localFn = localFn; }))); if (runtime_store_1.default.get('context.port.http.' + constants_1.FN_TYPE.basic, false)) { yield httpServer.start(); } yield replServer.wait(); yield httpServer.stop(); yield tunnelServer.stopServer().finally(() => __awaiter(void 0, void 0, void 0, function* () { if (!tunnelUrl) { return; } try { const tunnelDetails = yield _tunnelAPI.getTunnel(); if (tunnelDetails.tunnel_status === 'Enabled') { yield _tunnelAPI.disableTunnel(); (0, index_2.info)(); (0, index_2.info)(ansi_colors_1.green.bold('Tunneling disabled')); } } catch (er) { (0, index_2.error)('Error disabling the tunnel'); (0, index_2.debug)(er); } })); yield Promise.all(targets.map((target) => __awaiter(void 0, void 0, void 0, function* () { if (target.localFn) { return target.localFn.slaveManager.shutdown(); } }))); yield fs_1.ASYNC.deleteDir((0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build)).catch(); yield fn_utils_1.fnUtils.common.executeHook({ prefix: 'post', command: 'serve' }); (0, index_2.info)(); (0, index_2.success)('shell complete'); } catch (e) { !replServer.closed && replServer.close(); yield Promise.all([ fs_1.ASYNC.deleteDir((0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build)).catch(), httpServer ? httpServer.stop() : undefined ]); throw e; } });